O documento apresenta uma palestra sobre programação para o kernel Linux. Aborda tópicos como introdução ao Linux e seu kernel, montando o ambiente de desenvolvimento, criação de módulos, gerenciamento de memória e estruturas de dados. A agenda inclui explicações sobre o que é um sistema operacional, características do kernel Linux, diferenças entre desenvolvimento para kernel e espaço de usuário.
1. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Programa¸c˜ao para o Kernel Linux (Parte 1)
Ivo Augusto Andrade Rocha Calado
Instituto Federal de Educa¸c˜ao, Ciˆencia e Tecnologia de Alagoas
29 de Junho de 2014
1 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
2. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Sobre o palestrante
Titula¸c˜ao:
Graduado em Ciˆencia da Computa¸c˜ao pela UFAL
Mestre em Ciˆencia da Computa¸c˜ao pela UFCG
Doutorando em Engenharia El´etrica pela UFCG
Email:
ivo.calado@ee.ufcg.edu.br
ivo.calado@ifal.edu.br ou
Site:
https://sites.google.com/a/ee.ufcg.edu.br/ivocalado/
2 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
3. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Experiˆencia com o Linux
Contato com Linux desde 2004
Utiliza o Linux como principal SO desde 2006
Contribui com o Kernel Linux a partir do desenvolvimento de
algoritmos de controle de congestionamento no protocolo
DCCP
CCID-4 e CCID-5 (DCCP Cubic)
3 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
4. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
E sobre vocˆes?...
Qual a experiˆencia com sistemas operacionais?
... E com o Linux? Apenas usu´ario dom´estico ou um pouco
mais?
Quem j´a fu¸cou e/ou compilou o kernel?
Qual o conhecimento sobre a linguagem de programa¸c˜ao C,
Redes de Computadores, Estruturas de Dados e Sistemas
Operacionais
4 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
5. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Objetivo do curso
Mostrar o que ´e e como o Kernel Linux est´a organizado
Apresentar uma vis˜ao geral sobre a programa¸c˜ao para o
Kernel Linux
Quais as etapas necess´arias para para implementa¸c˜ao de
m´odulos?
Que ferramentas auxiliam no processo de cria¸c˜ao e submiss˜ao
de patches?
5 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
6. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Agenda I
1 Introdu¸c˜ao
O que ´e um sistema operacional?
Linux
Caracter´ısticas do Kernel Linux
Diferen¸cas entre desenvolvimento para Kernel e User space
2 Montando o ambiente
Obtendo e Compilando o Kernel Linux
A Ferramenta de Gerˆencia de C´odigo Git
Criando e aplicando patches com o Git
3 Criando m´odulos
O m´odulo Hello World
Um pouco mais sobre m´odulos
6 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
7. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Agenda II
4 Gerenciamento de Mem´oria
kmalloc
slab cache
5 Estruturas de Dados
Conceitos
Linked list
7 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
8. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Observa¸c˜ao sobre este material
Este material ´e derivado de diversos trabalhos livremente
dispon´ıveis na Internet
8 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
9. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O que ´e um sistema operacional?
O que ´e um sistema operacional?
O que viria a ser um sistema operacional?
Uma m´aquina estendida?
Um gerenciador de recursos?
9 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
10. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O que ´e um sistema operacional?
O que ´e um sistema operacional?
O que viria a ser um sistema operacional?
Uma m´aquina estendida?
Um gerenciador de recursos?
Ambos!
Atribui¸c˜oes de um SO
Gerenciamento de processos
Gerenciamento de mem´oria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e sa´ıda de dados
9 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
11. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O que ´e um sistema operacional?
Arquitetura de um sistema operacional
10 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
12. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O que ´e um sistema operacional?
Arquitetura de um sistema operacional
Dois espa¸cos de endere¸camento
Espa¸co de Usu´ario (User-space)
Espa¸co de Kernel (Kernel-space)
Trˆes componentes b´asicos
System calls: engloba um conjunto de fun¸c˜oes
disponibilizadas pelo sistema operacional para prover servi¸cos
N´ucleo: engloba mecanismos respons´aveis pelas gerˆencia de
mem´oria, processos, sistemas de arquivos, abstra¸c˜oes de
acesso a hardware etc
Device Drivers: fornecem implementa¸c˜oes que proporcionam
acesso a diversos mecanismos de hardware
11 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
13. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linux
GNU, Linux ou GNU/Linux
Qual a diferen¸ca entre Linux e GNU/Linux?
12 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
14. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linux
GNU, Linux ou GNU/Linux
Qual a diferen¸ca entre Linux e GNU/Linux?
Linux: n´ucleo do SO (e para alguns considerado o “SO”)
Ferramentas GNU: conjunto de ferramentas como
compiladores, editores de texto, linguagem bash etc
12 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
15. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linux
GNU, Linux ou GNU/Linux
Qual a diferen¸ca entre Linux e GNU/Linux?
Linux: n´ucleo do SO (e para alguns considerado o “SO”)
Ferramentas GNU: conjunto de ferramentas como
compiladores, editores de texto, linguagem bash etc
A controv´ersia sobre o nome
Existe uma grande controv´ersia sobre o nome correto do SO. Um
grupo de usu´arios, em especial desenvolvedores GNU, afirmam que
o nome correto ´e GNU/Linux. Por outro lado, outro grupo
encabe¸cado por Linus Torvalds preferem simplesmente Linux
Em termos pr´aticos, do ponto de vista de um usu´ario o SO ==
GNU + Linux
12 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
16. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linux
Versionamento
Durante muito tempo foi utilizado a nota¸c˜ao baseada em 3
n´umeros + 1 adicional
Segundo um dos mantenedores do Linux, Willy Tarreau, “The
4-integer numbering was a real nightmare with kernel versions
looking like IP addresses. Now it will get back to something more
common and much more maintainable.”
13 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
17. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linux
Versionamento
Em vista da situa¸c˜ao apresentada, e tamb´em para comemorar
os 20 anos do Linux, Linus Torvalds decidiu alterar a forma
como as vers˜oes definidas
3.0, 3.1.1, 3.2-rc1, ...
Agora s˜ao 2 n´umeros + 1
Por´em, em termos pr´aticos a vers˜ao 2.6.40 == 3.0
14 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
18. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Caracter´ısticas do Kernel Linux
Kernels monol´ıticos x Micro Kernels
O desenvolvimento de sistemas operacionais ´e marcado por
duas escolas que s˜ao
Kernels Monol´ıticos
Micro Kernels
(a) Micro Kernel (b) Kernel Monol´ıtico: ´unico espa¸co de
endere¸camento
15 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
19. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Caracter´ısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como v´arios processos
Diferentes bin´arios e espa¸cos de endere¸camento.
Comunica¸c˜ao via IPC (lento)
Faz uso extensivo do conceito de servidores, onde apenas
poucos servi¸cos devem rodar em modo privilegiado
Desvantagens: teoricamente robusto por´em complexo de se
desenvolver
Exemplos: Minix e Symbian
16 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
20. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Caracter´ısticas do Kernel Linux
Kernels Monol´ıticos
´Unico espa¸co de endere¸camento
´Unico processo executante
Mais f´acil de implementar, comunica¸c˜ao r´apida e facilidade de
utiliza¸c˜ao (fun¸c˜oes s˜ao globais)
Desvantagem: Mais suscet´ıvel a crashes
Exemplos: BSD, Windows, Linux*
17 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
21. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Caracter´ısticas do Kernel Linux
Linux: Monol´ıtico mas modular
O Linux ´e considerado um Kernel monol´ıtico. Por´em ele
implementa diversas ideias do mundo “Micro Kernel”:
Projeto modular
Ser preempt´ıvel
Possibilita o carregamento de m´odulos bin´arios dinamicamente
Ou seja, o projeto do Linux ´e baseado no melhor dos dois mundos
18 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
22. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvolvimento para Kernel e User space
Diferente, n˜ao dif´ıcil
Muitas pessoas tem uma vis˜ao que o desenvolvimento para
Kernel Linux ´e bastante dif´ıcil
Todavia, grande parte dessa “dificuldade” reside no fato das
diferen¸cas existentes no modo de programa¸c˜ao entre Kernel
space e User space
Algumas diferen¸cas s˜ao ´obvias (o kernel pode fazer qualquer
coisa! :))...
19 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
23. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvolvimento para Kernel e User space
Diferente, n˜ao dif´ıcil
Muitas pessoas tem uma vis˜ao que o desenvolvimento para
Kernel Linux ´e bastante dif´ıcil
Todavia, grande parte dessa “dificuldade” reside no fato das
diferen¸cas existentes no modo de programa¸c˜ao entre Kernel
space e User space
Algumas diferen¸cas s˜ao ´obvias (o kernel pode fazer qualquer
coisa! :))... outras nem t˜ao ´obvias
Vamos ver algumas das principais diferen¸cas...
19 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
24. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvolvimento para Kernel e User space
Libc e cabe¸calhos C padr˜ao
A libc ´e a biblioteca padr˜ao em user space
Ela fornece as implementa¸c˜ao de grande parte das fun¸c˜oes
dispon´ıveis
Por´em ela n˜ao pode ser utilizada em kernel space por diversas
raz˜oes:
Velocidade
Tamanho
Problema do Ovo e da Galinha! :)
Quais as consequencias?
Fun¸c˜oes como printf e scanf, malloc, calloc n˜ao est˜ao dispon´ıveis
20 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
25. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvolvimento para Kernel e User space
Libc e cabe¸calhos C padr˜ao
Como discutido, o kernel n˜ao provˆe fun¸c˜oes da libc, por´em
algumas fun¸c˜oes substitutas s˜ao disponibilizadas
As assinaturas de tais fun¸c˜oes s˜ao armanezadas no diret´orio
include na ´arvore do kernel
A fun¸c˜ao printk
A fun¸c˜ao printk possibilita a impress˜ao de uma mensagem na tela
printk(LOG LEVEL “Mensagem e formatadores!”, vars...);
KERN EMERG
KERN ALERT
KERN INFO
...
21 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
26. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvolvimento para Kernel e User space
Sem prote¸c˜ao de mem´oria
O que acontece quando, em n´ıvel de aplica¸c˜ao tentamos acessar
uma ´area inv´alida de mem´oria (ex.: deferenciar um ponteiro nulo)?
22 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
27. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvolvimento para Kernel e User space
Sem prote¸c˜ao de mem´oria
O que acontece quando, em n´ıvel de aplica¸c˜ao tentamos acessar
uma ´area inv´alida de mem´oria (ex.: deferenciar um ponteiro nulo)?
O t˜ao famoso segmentation fault!
Em termos t´ecnicos, o kernel captura o acesso indevido e
lan¸ca um sinal SIGSEGV mantando o processo
Por´em voltamos para o problema do ovo e da galinha. Isso seria
poss´ıvel de ser feito no kernel?
22 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
28. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvolvimento para Kernel e User space
Sem prote¸c˜ao de mem´oria
O que acontece quando, em n´ıvel de aplica¸c˜ao tentamos acessar
uma ´area inv´alida de mem´oria (ex.: deferenciar um ponteiro nulo)?
O t˜ao famoso segmentation fault!
Em termos t´ecnicos, o kernel captura o acesso indevido e
lan¸ca um sinal SIGSEGV mantando o processo
Por´em voltamos para o problema do ovo e da galinha. Isso seria
poss´ıvel de ser feito no kernel?
Quais as consequencias de um acesso inv´alido de mem´oria?
No melhor dos casos um kernel panic.
22 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
29. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvolvimento para Kernel e User space
Sem prote¸c˜ao de mem´oria
O que acontece quando, em n´ıvel de aplica¸c˜ao tentamos acessar
uma ´area inv´alida de mem´oria (ex.: deferenciar um ponteiro nulo)?
O t˜ao famoso segmentation fault!
Em termos t´ecnicos, o kernel captura o acesso indevido e
lan¸ca um sinal SIGSEGV mantando o processo
Por´em voltamos para o problema do ovo e da galinha. Isso seria
poss´ıvel de ser feito no kernel?
Quais as consequencias de um acesso inv´alido de mem´oria?
No melhor dos casos um kernel panic. No pior uma brecha de
seguran¸ca!
22 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
30. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvolvimento para Kernel e User space
Mem´oria sem pagina¸c˜ao
Mem´oria virtual e pagina¸c˜ao ´e um poderoso recurso de
gerˆencia de mem´oria
Possibilita que aplica¸c˜oes fa¸cam uso de mais mem´oria que a
mem´oria f´ısica dispon´ıvel alocando as “p´aginas” mais
acessadas na mem´oria principal e mandando o restante para o
disco
Se esse conceito tamb´em valer para o Kernel, o que acontece se o
bloco de mem´oria contendo instru¸c˜oes que efetuam a gerˆencia de
mem´oria for “por acaso” enviado para o disco???
23 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
31. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvolvimento para Kernel e User space
Mem´oria sem pagina¸c˜ao
Mem´oria virtual e pagina¸c˜ao ´e um poderoso recurso de
gerˆencia de mem´oria
Possibilita que aplica¸c˜oes fa¸cam uso de mais mem´oria que a
mem´oria f´ısica dispon´ıvel alocando as “p´aginas” mais
acessadas na mem´oria principal e mandando o restante para o
disco
Se esse conceito tamb´em valer para o Kernel, o que acontece se o
bloco de mem´oria contendo instru¸c˜oes que efetuam a gerˆencia de
mem´oria for “por acaso” enviado para o disco???
Qual a solu¸c˜ao?
Manter todo o bloco de mem´oria do Kernel alocado em mem´oria
fisica! Sendo assim, cada byte de mem´oria no Kernel ´e precioso!
23 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
32. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo o Kernel Linux
24 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
33. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Obtendo e compilando o Kernel Linux
Existem basicamente duas formas de se obter o Kernel Linux:
Baixando um tarball da ´ultima vers˜ao do kernel dispon´ıvel em
kernel.org ou via pacotes de distribui¸c˜oes
Baixando uma vers˜ao de desenvolvimento via git
25 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
34. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes b´asicos
Ap´os a instala¸c˜ao de uma vers˜ao limpa do Ubuntu, diversos
pacotes s˜ao necess´arios antes da compila¸c˜ao propriamente dita
apt−get i n s t a l l build −e s s e n t i a l l i b g t k 2 .0−dev l i b g l i b 2
.0−dev l i b g l a d e 2 −dev l i b n c u r s e s 5 −dev
Ap´os a instala¸c˜ao dos pacotes b´asicos necess´arios `a compila¸c˜ao,
devemos obter e compilar o kernel propriamente dito. Para tal,
podemos seguir a op¸c˜ao Linux-like ou Ubuntu-like
26 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
35. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baix´a-lo de
https://www.kernel.org/.
Ap´os o download, podemos configur´a-lo de 3 maneiras
distintas:
make menuconfig
make c o n f i g
meke g c o n f i g
Tamb´em ´e poss´ıvel carregar configura¸c˜oes antigas via make
oldconfig
27 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
36. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configura¸c˜ao
Vamos fu¸car um pouco... :)
28 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
37. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel, basta executar o seguinte comando
make [− jn ]
sudo make m o d u l e s i n s t a l l
O primeiro comando ir´a salvar um arquivo bzImage em
arch/[arquitetura]/boot
O segundo comando ir´a salvar os m´odulos gerados em
/lib/modules
Ap´os isso, devemos manualmente configurar o gerenciador de Boot
(lilo ou grub) para carregar a nova imagem!
29 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
38. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribui¸c˜oes) oferece uma maneira
pr´opria de baixar, compilar e instalar um kernel
Ap´os a instala¸c˜ao de uma vers˜ao limpa do Ubuntu, diversos
pacotes s˜ao necess´arios antes da compila¸c˜ao propriamente dita
apt−get i n s t a l l l i n u x −source −3.13.0 kernel −package
f a k e r o o t
Ap´os a instala¸c˜ao, deve ser descompactado e criado um link
ligando o diret´orio do kernel para /usr/src/linux
t a r −xvf l i n u x −source −3.13.0. t a r . bz2
l n −s l i n u x −source −3.13.0 / usr / s r c / l i n u x
30 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
39. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configura¸c˜ao
A pr´oxima etapa ´e a c´opia do arquivo de configura¸c˜ao para o
diret´orio base do kernel
% cp / boot / config −‘uname −r ‘ / usr / s r c / l i n u x /. c o n f i g
Por fim, deve-se entrar no diret´orio do c´odigo do kernel e
executar o menu para visualiza¸c˜ao das op¸c˜oes
31 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
40. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compila¸c˜ao :)
Limpar diret´orio antes da compila¸c˜ao
make−kpkg clean
Compilando
f a k e r o o t make−kpkg −−i n i t r d −−append−to−v e r s i o n=−
custom k e r n el i m ag e k e r n e l h e a d e r s
Caso fosse realizada a compila¸c˜ao gen´erica s´o seria necess´ario a
execu¸c˜ao do comando make
32 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
41. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim, basta instalar os arquivos *.deb que foram
armazenados na pasta /usr/src
dpkg −i ∗. deb
Esse comando realiza as seguintes tarefas
Instala a imagem
Instala os headers do kernel
Configura o grub para dual-boot
33 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
42. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diret´orios do kernel
Composta por 5 blocos
Includes
Documenta¸c˜ao
Scripts
Exemplos (samples)
Implementa¸c˜oes (net, arch, init, block, crypt etc)
34 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
43. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
A Ferramenta de Gerˆencia de C´odigo Git
Controle de Vers˜ao Git
35 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
44. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
A Ferramenta de Gerˆencia de C´odigo Git
A Ferramenta de Gerˆencia de C´odigo Git
Trata-se de um sistema de controle de vers˜ao distribu´ıdo
O Git foi inicialmente projetado e desenvolvido por Linus
Torvalds para o desenvolvimento do n´ucleo do Linux, por´em
atualmente ele ´e amplamente utilizado para os mais diversos
prop´ositos
N˜ao h´a a ideia de reposit´orio central como no CVS ou SVN
mas sim diversas ´arvores distribu´ıdas onde uma elas podem
fazer push e pull uma das outras
Ideal para montarmos um reposit´orio local sem a necessidade
de instala¸c˜ao (a cria¸c˜ao de um reposit´orio leva apenas 1
comando!)
36 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
45. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
A Ferramenta de Gerˆencia de C´odigo Git
A Ferramenta de Gerˆencia de C´odigo Git
Foco na cria¸c˜ao de branches, realiza¸c˜ao de merges e gera¸c˜ao
de diffs entre diferentes pontos da ´arvore
37 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
46. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
A Ferramenta de Gerˆencia de C´odigo Git
Instalando e configurando o git
apt−get i n s t a l l g i t
g i t c o n f i g −−g l o b a l user . name "Nome"
g i t c o n f i g −−g l o b a l user . email "email@dominio.com"
38 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
47. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
A Ferramenta de Gerˆencia de C´odigo Git
Criando nosso primeiro reposit´orio
Para cria¸c˜ao de um reposit´orio precisamos de apenas um comando!
:)
$ mkdir repo
$ cd repo
$ g i t i n i t .
Ap´os a inicializa¸c˜ao do reposit´orio precisamos apenas adicionar os
arquivos via o comando git add
g i t add f i l e 1 [ f i l e 2 ] [ f i l e 3 ] [ f i l e 4 ] . . .
g i t commit −a
39 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
48. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
A Ferramenta de Gerˆencia de C´odigo Git
branches, diffs, checkouts, merges, stashes, logs...
g i t branch # l i s t a branches
g i t branch nome # c r i a uma branch
g i t checkout nome da branch # a l t e r n a e n t r e branches
g i t d i f f # l i s t a a d i f e r e n ¸c a s a d i c i o n a d a s e a d i f e r e n ¸c a
e n t r e d o i s pontos do r e p o s i t ´o r i o
g i t merge # a t u a l i z a uma branch com base em outras
g i t r e s e t −−hard HEADˆ # remove o ´ultimo commit
g i t log # l i s t a todos os commits r e a l i z a d o s
g i t a r c h i v e −−format t a r . gz −−output arquivo . t a r . gz
branch name −v
g i t rm f i l e # remove um arquivo da ´a r v o r e
g i t mv f i l e # renomeia um arquivo da ´a r v o r e
Vamos praticar um pouco!? Inicializem um projeto e realizem
diversas altera¸c˜oes fazendo uso das op¸c˜oes dispon´ıveis acima
40 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
49. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
A Ferramenta de Gerˆencia de C´odigo Git
Clonando uma ´arvore git
At´e agora, vimos como criar, modificar e manipular o
reposit´orio de diversas maneiras
Por´em, como obtemos um c´odigo de outra pessoa?
Devemos fazer uso do comando git clone
g i t clone g i t :// eden−feed . erg . abdn . ac . uk/ dccp exp
my dccp
41 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
50. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Ap´os criarmos fazermos nossas modifica¸c˜oes chegou a hora de
gerarmos o patch para submiss˜ao
Para isso fazemos uso do comando git format-patch
g i t format−patch [ o b j e c t i d ou branch name ] −−stdout >
p . patch
g i t format−patch [ o b j e c t i d ou branch name ]
g i t format−patch −s [ o b j e c t i d ou branch name ]
O primeiro comando ir´a gerar uma ´unica sa´ıda enquanto que o
segundo cria v´arios arquivos de sa´ıda (um para cada commit)
42 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
51. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatch.pl
Ap´os criamos nossos patches temos de verificar se eles est˜ao
dentro do estilo de c´odigo adotado no kernel linux (80 colunas,
sem espa¸cos antes do tab, sem espa¸cos no final da linha etc)
s c r i p t s / checkpatch . p l [ arquivo . patch ]
Este comando ir´a listar todos os problemas de estilo existentes
no c´odigo
Antes de ser submetido todos os problemas devem ser
resolvidos
43 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
52. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado ´e dividida em 5 partes distintas:
Cabe¸calho do email
Descri¸c˜ao do patch
Assinaturas
Sum´ario das altera¸c˜oes
Patch propriamente dito
44 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
53. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio da
autoria das altera¸c˜oes realizadas
Em geral, o c´odigo ´e revisto por diversos desenvolvedores at´e
chegar na ´arvore do kernel
Tamb´em serve como uma declara¸c˜ao, por parte do autor, de
que est´a disponibilizando o c´odigo como open-source
Uma forma de eternizar o autor! :)
Signed-off-by: Autor 1 <random@developer.example.org>
Outras entradas poss´ıveis: Ack-by e Cc, Reported-by e
Tested-by
45 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
54. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade: porque utilizar o signoff?
Em meados de 2003, uma empresa chamada SCO come¸cou a
questionar a autoria de diversos c´odigos do kernel Linux em virtude
dela possuir contratos com a IBM que na ´epoca fez a doa¸c˜ao de
c´odigos para open source. A empresa afirmava que trechos de
c´odigo do Unix V estavam incorporados ao Linux.
Foram iniciados uma s´erie de processos envolvendo a SCO e
diversas empresas como: IBM, Red Hat, Novell etc. onde foi
comprovado que a SCO estava errada! :)
http://en.wikipedia.org/wiki/Timeline_of_SCO-Linux_
controversies
46 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
55. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Criando e aplicando patches com o Git
´Ultimo teste antes do envio
Antes de realizar o envio do patch ´e recomend´avel tentar
aplicar o patch em uma ´arvore limpa de modo a verificar se
algum erro inesperado ir´a acontecer
A ideia ´e tentar reproduzir o procedimento de quem ir´a aplicar
o patch `a arvore
g i t apply −−s t a t ∗. patch # Sum´ario de m o d i f ic a ¸c˜oe s
g i t apply −−check ∗. patch # Checagem por e r r o s
g i t am −−s i g n o f f ∗. patch # Aplica¸c˜ao do patch
47 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
56. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Criando e aplicando patches com o Git
Envio de patches: Para quem? de que maneira?
O envio de patches do kernel do Linux ´e realizado atrav´es de
emails para listas de discuss˜oes espec´ıficas
Existem diversas listas dispon´ıveis em vger.kernel.org:
alsa-devel, autofs, ceph-devel, dccp, netdev etc. Escolha
a correspondente e a lista com um n´ıvel acima
ex.: dccp e netdev
Regras b´asicas: email sem formata¸c˜ao e sem anexos! O
c´odigo ir´a no corpo do email
48 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
57. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Criando e aplicando patches com o Git
Envio de patches: Para quem? de que maneira?
O envio de patches do kernel do Linux ´e realizado atrav´es de
emails para listas de discuss˜oes espec´ıficas
Existem diversas listas dispon´ıveis em vger.kernel.org:
alsa-devel, autofs, ceph-devel, dccp, netdev etc. Escolha
a correspondente e a lista com um n´ıvel acima
ex.: dccp e netdev
Regras b´asicas: email sem formata¸c˜ao e sem anexos! O
c´odigo ir´a no corpo do email
Dica final: se poss´ıvel, envie o patch para que outras pessoas dar
uma olhada antes do envio propriamente dito!
48 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
58. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade: gerenciando o c´odigo com git
O objetivo desta atividade ´e a pr´atica da gerˆencia de c´odigo
utilizando o git
Configure as propriedades de usu´ario e email
Iniciar um reposit´orio na ´arvore do kernel
Adicionar os arquivos no reposit´orio e realizar primeiro commit
Criar uma branch com nome “teste” e realizar alguns commit
com diferentes modifica¸c˜oes
Verificar a diferen¸ca entre o branch atual e a master
Voltar para a branch master e realizar um merge das
modifica¸c˜oes
Preparar um patch de envio
Tempo da atividade: 15 - 20 minutos
49 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
59. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O m´odulo Hello World
Criando m´odulos para o Kernel
50 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
60. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O m´odulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiro
m´odulo
O mais simples dos m´odulos deve oferecer duas
funcionalidades b´asicas: Carregamente e descarregamento
do m´odulo
51 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
61. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O m´odulo Hello World
O m´odulo Hello World
#i n c l u d e <l i n u x / i n i t . h>
#i n c l u d e <l i n u x /module . h>
MODULE LICENSE( "GPL" ) ;
s t a t i c i n t h e l l o i n i t ( void )
{
p r i n t k (KERN ALERT "Hello , worldn" ) ;
r e t u r n 0;
}
s t a t i c void h e l l o e x i t ( void )
{
p r i n t k (KERN ALERT "Goodbye , cruel worldn" ) ;
}
m o d u l e i n i t ( h e l l o i n i t ) ;
module exit ( h e l l o e x i t ) ;
52 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
62. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O m´odulo Hello World
O m´odulo Hello World
As macros module init e module exit s˜ao respons´aveis por
indicar quais fun¸c˜oes ir˜ao carregar e descarregar o m´odulo
No exemplo apresentado, o m´odulo exibe apenas uma
mensagem na abertura e no descarregamento do m´odulo!
53 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
63. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O m´odulo Hello World
Compilando
A forma de compilar m´odulos do Kernel ´e um pouco diferente
da compila¸c˜ao normal de uma aplica¸c˜ao C
O primeiro passo ´e contruir o arquivo Makefile
Nosso arquivo Makefile
obj−m := h e l l o . o
ou
obj−m := module . o
module−o b js := f i l e 1 . o f i l e 2 . o
Compila¸c˜ao: make -C /usr/src/linux M=‘pwd‘ modules
54 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
64. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O m´odulo Hello World
Executando
Inser¸c˜ao, remo¸c˜ao, listagem...
insmod h e l l o . ko # I n s e r e modulo
lsmod # L i s t a modulos
rmmod h e l l o # Remove modulo
55 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
65. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O m´odulo Hello World
Executando
Inser¸c˜ao, remo¸c˜ao, listagem...
insmod h e l l o . ko # I n s e r e modulo
lsmod # L i s t a modulos
rmmod h e l l o # Remove modulo
Onde s˜ao exibidas as mensagens provenientes do Kernel?
Mensagens impressas via fun¸c˜ao printk tem dois direcionamentos
/var/log/syslog
dmesg
55 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
66. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O m´odulo Hello World
Entendendo o funcionamento de um m´odulo
Fun¸c˜oes init e exit servem apenas para aloca¸c˜ao de recursos
e registro de servi¸cos atrav´es de callbacks. Um bom
exemplo ´e o registro de novos protocolos de transporte
M´odulos apenas provem servi¸cos. N˜ao s˜ao entidades ativas!
Por ser um n´ucleo preempt´ıvel o m´odulo deve suportar
concorrˆencia (race conditions)
56 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
67. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O m´odulo Hello World
Adicionando o m´odulo como uma nova op¸c˜ao
Para adicionar o m´odulo no menuconfig deve-se adicionar `a ´arvore
do kernel e editar arquivos Makefile e Kconfig (tanto do m´odulo
quanto do n´ıvel acima)
Kconfig :
c o n f i g HELLO BUILDTIN EXAMPLE
t r i s t a t e "Modulo exemplo Hello World"
depends on INET
−−−help−−−
Este modulo tem o b j e t i v o puramente e x p e r i m e n t a l
Makefile :
obj−$ (CONFIG HELLO BUILDTIN EXAMPLE) := h e l l o b u i l t i n
. o
57 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
68. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odulos
Como funcionam as callbacks em C?
Em C, o endere¸co de uma fun¸c˜ao ´e acess´ıvel ao programador
atrav´es de uma vari´avel do tipo ponteiro para fun¸c˜ao
A partir desse mecanismos torna-se poss´ıvel abstrair qual
implementa¸c˜ao ser´a executada de maneira semelhante a
polimorfismo
58 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
69. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odulos
Como funcionam as callbacks em C?
Em C, o endere¸co de uma fun¸c˜ao ´e acess´ıvel ao programador
atrav´es de uma vari´avel do tipo ponteiro para fun¸c˜ao
A partir desse mecanismos torna-se poss´ıvel abstrair qual
implementa¸c˜ao ser´a executada de maneira semelhante a
polimorfismo
s t r u c t opr {
i n t value1 ;
i n t value2 ;
i n t (∗ o p e r a t i o n ) ( int , i n t ) ;
};
58 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
70. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odulos
A tabela de s´ımbolos do Kernel
Todo m´odulo ao ser desenvolvido tem acesso a um conjunto
de s´ımbolos disponibilizados pelo Kernel
S´ımbolos podem ser tanto vari´aveis quanto fun¸c˜oes (ex.: a
fun¸c˜ao printk)
Analogia a s´ımbolos exportados de uma lib dinˆamica
Um problema comum ´e a tentativa de utiliza¸c˜ao de s´ımbolos
n˜ao definidos/n˜ao vis´ıveis
Como exportar s´ımbolos de um m´odulo?
EXPORT SYMBOL(name) ;
EXPORT SYMBOL GPL(name) ;
59 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
71. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odulos
A tabela de s´ımbolos do Kernel
Todo m´odulo ao ser desenvolvido tem acesso a um conjunto
de s´ımbolos disponibilizados pelo Kernel
S´ımbolos podem ser tanto vari´aveis quanto fun¸c˜oes (ex.: a
fun¸c˜ao printk)
Analogia a s´ımbolos exportados de uma lib dinˆamica
Um problema comum ´e a tentativa de utiliza¸c˜ao de s´ımbolos
n˜ao definidos/n˜ao vis´ıveis
Como exportar s´ımbolos de um m´odulo?
EXPORT SYMBOL(name) ;
EXPORT SYMBOL GPL(name) ;
EXPORT SYMBOL GPL limita a exporta¸c˜ao `a GPL
59 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
72. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odulos
Licensiamento de m´odulos
M´odulos podem ser registrados sob diferentes licensas utilizando a
macro MODULE LICENSE:
GPL
GPL v2
GPL and additional rights
Dual BSD/GPL
Dual MPL/GPL
Proprietary
Um m´odulo ´e considerado propriet´ario at´e segunda ordem
60 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
73. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odulos
Manipula¸c˜ao de erros durante a inicializa¸c˜ao
A fun¸c˜ao init serve para aquisi¸c˜ao de recursos do m´odulo
(mem´oria, locks em dispositivos, registros de protocolos etc)
Por´em o que acontece se um dos recursos n˜ao pode ser
obtido?
61 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
74. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odulos
Manipula¸c˜ao de erros durante a inicializa¸c˜ao
A fun¸c˜ao init serve para aquisi¸c˜ao de recursos do m´odulo
(mem´oria, locks em dispositivos, registros de protocolos etc)
Por´em o que acontece se um dos recursos n˜ao pode ser
obtido?
Duas op¸c˜oes
Continuar a execu¸c˜ao com funcionalidades reduzidas
Cancelar a inicializa¸c˜ao do m´odulo
Neste sentido, qual seria a abordagem mais adequada para fazer
essa manipula¸c˜ao de erros?
61 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
75. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odulos
Manipula¸c˜ao de erros durante a inicializa¸c˜ao
Qual seria uma solu¸c˜ao elegante para a libera¸c˜ao de recursos j´a
alocados?
62 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
76. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odulos
Manipula¸c˜ao de erros durante a inicializa¸c˜ao
Qual seria uma solu¸c˜ao elegante para a libera¸c˜ao de recursos j´a
alocados?
i n t i n i t minha funcao ( void )
{
i n t e r r ;
/∗ r e g i s t r a t i o n takes a p o i n t e r and a name ∗/
e r r = r e g i s t e r t h i s ( ptr1 , "skull" ) ;
i f ( e r r ) goto f a i l t h i s ;
e r r = r e g i s t e r t h a t ( ptr2 , "skull" ) ;
i f ( e r r ) goto f a i l t h a t ;
r e t u r n 0; /∗ s u c c e s s ∗/
f a i l t h a t : u n r e g i s t e r t h i s ( ptr1 , "skull" ) ;
f a i l t h i s : r e t u r n e r r ; /∗ propagate the e r r o r ∗/
}
62 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
77. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odulos
Parˆametro de inicializa¸c˜ao
Muitas vezes precisamos passas configura¸c˜oes espec´ıficas ao
m´odulo que vai ser inicializado
Exemplos:
Ativa¸c˜ao ou desativa¸c˜ao do debug
Configura¸c˜oes espec´ıficas de protocolos
Configur˜oes de m´odulos de dispositivos etc
Para esta tarefas duas fun¸c˜oes est˜ao associadas: module param
(ou module param array) e MODULE PARM DESC
63 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
78. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odulos
Adicionando parˆametros de inicializa¸c˜ao
Sintaxe: module param(parametro, tipo, permissao)
s t a t i c char ∗whom = "world" ;
s t a t i c i n t howmany = 1;
module param (howmany , int , S IRUGO) ;
module param (whom, charp , S IRUGO | S IWUSR) ;
module param array ( vetor , int ,& v e t o r s i z e , S IRUGO |
S IWUSR) ;
Parˆametro: vari´avel a ser utilizada (deve ser static)
Tipo: Tipo da vari´avel a ser exportada (bool, charp, int,
long, short etc)
Caso seja informado um n´umero maior de valores do que o
tamanho do vetor ´e lan¸cado um erro e a inicializa¸c˜ao do m´odulo ´e
abortada
64 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
79. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odulos
Permiss˜oes dos m´odulos
O terceiro parˆametro tem por objetivo definir como o valor
exportado ser´a vis´ıvel ap´os a inicializa¸c˜ao
Os valores dos parˆametros ser˜ao disponibilizados em
/sys/module/<nome modulo>/parameters
Cada parˆametro ser´a armazenado em um arquivo espec´ıficos
´E poss´ıvel definir todas as permiss˜oes poss´ıveis para um
arquivo
65 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
80. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odulos
Permiss˜oes poss´ıveis
#d e f i n e S IRWXU 00700
#d e f i n e S IRUSR 00400
#d e f i n e S IWUSR 00200
#d e f i n e S IXUSR 00100
#d e f i n e S IRWXG 00070
#d e f i n e S IRGRP 00040
#d e f i n e S IWGRP 00020
#d e f i n e S IXGRP 00010
#d e f i n e S IRWXO 00007
#d e f i n e S IROTH 00004
#d e f i n e S IWOTH 00002
#d e f i n e S IXOTH 00001
66 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
81. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odulos
Atividade: Criando m´odulos simples
Com base no apresentado vamos criar a seguinte escrutura de
m´odulos:
Criar 3 m´odulos chamados mod1, mod2, mod3 com seus
respectivos arquivos Makefile
Deve ser criada uma dependˆencia de s´ımbolos (vari´aveis e
fun¸c˜oes) entre os m´odulos (mod1 => mod2 => mod3)
Devem ser adicionados parˆametros para carregamento dos
m´odulos que incluam tanto valores edit´aveis, quanto somente
leitura. Al´em disso deve ser verificado a possibilidade de
escrita ou somente leitura
Deve ser avaliado tanto a exporta¸c˜ao de s´ımbolos GPL para
m´odulos GPL quando para m´odulos n˜ao-GPL
Tempo da atividade: 10 - 15 minutos
67 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
82. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Gerenciamento de mem´oria no Kernel
Em user-space, estamos estamos habituados a trˆes fun¸c˜oes
b´asicas para gerenciamento de mem´oria, que s˜ao malloc,
calloc e free
Todavia, tais fun¸c˜oes fazem parte da libc e, portanto, n˜ao
est˜ao dispon´ıveis
Vale lembrar que toda a mem´oria do n´ucleo ´e armazenada em
mem´oria f´ısica (sem mem´oria virtual)
Deste modo, em n´ıvel de kernel as duas principais estrat´egias
para gerˆencia da mem´oria que s˜ao kmalloc e slab cache
68 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
83. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a aloca¸c˜ao de blocos de mem´oria com base no
argumento size
Uma peculiaridade ´e o fornecimento de flags que serve para
controlar como o bloco de mem´oria ser´a alocado
#i n c l u d e <l i n u x / s l a b . h>
void ∗ kmalloc ( s i z e t s i z e , i n t f l a g s ) ;
k f r e e ( void ∗)
69 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
84. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
kmalloc
Sobre o parˆametro size
Em espa¸co de usu´ario a aloca¸c˜ao ´e orientada `a heap
(abstra¸c˜ao de um bloco cont´ınuo)
Em espa¸co de n´ucleo, a aloca¸c˜ao ´e orientada a p´aginas de
mem´oria (mem´oria segmentar)
kmalloc faz aloca¸c˜ao blocos de p´aginas, ou seja, o tamanho
alocado pode ser ligeiramente MAIOR que o tamanho solicitado!
70 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
85. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
kmalloc
Sobre o parˆametro flag
Define como o bloco de mem´oria ser´a alocado levando em
considera¸c˜ao as p´aginas de mem´orias atualmente dispon´ıveis
GFP ATOMIC: a aloca¸c˜ao ´e realizada em alta prioridade
(como handlers de interrup¸c˜ao) e a a¸c˜ao n˜ao sofre preemp¸c˜ao
GFP KERNEL: maneira padr˜ao de aloca¸c˜ao. A a¸c˜ao ´e
preempt´ıvel
GFP USER: semelhante `a GFP KERNEL por´em alocado em
espa¸co de usu´ario.
Mais 13 tipos! Por´em GFP ATOMIC e GFP KERNEL s˜ao
utilizadas em quase todos os casos de maneira segura
71 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
86. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t my struct ∗ t = NULL;
t = ( s t r u c t my struct ) kmalloc ( s i z e o f ( s t r u c t my struc )
, GFP KERNEL) ;
i f ( ! t ) {
//N˜ao conseguiu a l o c a r . . .
}
//Uso . . .
k f r e e ( t ) ;// L i b e r a r e c u r s o
72 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
87. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc ´e voltada para cria¸c˜ao de
objetos individuais
Por´em, e se fossemos criar diversos objetos do mesmo tipo ao
longo do ciclo de vida de um m´odulo?...
73 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
88. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc ´e voltada para cria¸c˜ao de
objetos individuais
Por´em, e se fossemos criar diversos objetos do mesmo tipo ao
longo do ciclo de vida de um m´odulo?... ter´ıamos de nos
preocupar em configurar o tamanho para cada novo objeto
Exemplo: um objeto sk buff ´e criado todas as vezes que um
pacote de dados ´e recebido ou enviado
Qual seria uma poss´ıvel solu¸c˜ao?
73 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
89. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc ´e voltada para cria¸c˜ao de
objetos individuais
Por´em, e se fossemos criar diversos objetos do mesmo tipo ao
longo do ciclo de vida de um m´odulo?... ter´ıamos de nos
preocupar em configurar o tamanho para cada novo objeto
Exemplo: um objeto sk buff ´e criado todas as vezes que um
pacote de dados ´e recebido ou enviado
Qual seria uma poss´ıvel solu¸c˜ao?
Criar um procedimento que encapsule a cria¸c˜ao de objetos
Para esta funcionalidade, o kernel provˆe o Slab
73 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
90. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de mem´oria
Otimizado para criar objetos do mesmo tipo
S˜ao definidas quatro fun¸c˜oes associadas `a aloca¸c˜ao/desaloca¸c˜ao de
blocos de mem´oria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
91. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
slab cache
Rotinas associadas
75 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
92. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
slab cache
A fun¸c˜ao kmem cache create
kmem cache t ∗ kmem cache create ( const char ∗name ,
s i z e t s i z e ,
s i z e t o f f s e t , unsigned long f l a g s ,
void (∗ c o n s t r u c t o r ) ( void ∗) ;
name: Nome da estrutura (sem espa¸cos em branco)
offset: Deslocalmento desde o come¸co da p´agina de mem´oria.
Usado para alinhamentos espec´ıficos (normalmente zero)
flags: Controla como a aloca¸c˜ao ser´a realizada (normalmente
usa-se o valor SLAB HWCACHE ALIGN, pois ir´a alinhar a
mem´oria seguindo a arquitetura da m´aquina)
constructor: utilizados para contru¸c˜ao personalizada de
objetos complexos (´e aceito NULL)
76 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
93. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
slab cache
Exemplo aloca¸c˜ao via slab
s t r u c t my struct ∗∗ m = ( s t r u c t my struct ∗∗) kmalloc (
num elementos ∗ s i z e o f ( s t r u c t my struct ∗) ,
GFP KERNEL) ;
my struct cache = kmem cache create ( "my_struct_cache"
, s i z e o f ( s t r u c t my struct ) , 0 , SLAB HWCACHE ALIGN
, NULL) ;
i f ( ! my struct cache )
r e t u r n −ENOMEM;
f o r ( ; i < num elementos ; i++)
{
m[ i ] = kmem cache alloc ( my struct cache ,
GFP KERNEL) ;
}
77 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
94. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
slab cache
Atividade: Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a cria¸c˜ao, aloca¸c˜ao e libera¸c˜ao de
recursos utilizando kmalloc e slab
Criar 1 m´odulo que receba como parˆametro de inicializa¸c˜ao o
n´umero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do n´umero de objetos, deve-se construir um array e
cada posi¸c˜ao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outra
metade via
Deve ser implementado o processo de desaloca¸c˜ao dos objetos
da maneira apropriada
Tempo da atividade: 15 - 20 minutos
78 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
95. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Conceitos
79 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
96. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel, assim como qualquer software, faz uso massivo de
estruturas de dados de modo a armazenar seus dados dado em
runtime
Sendo assim, afim de evitar que o desenvolvedor tenha de
criar suas pr´oprias estruturas a cada desenvolvimento foram
desenvolvidas algumas estruturas de dados b´asica que podem
ser reutilizadas
S˜ao elas:
Linked lists
Queues
Maps
Binary trees
A seguir daremos um enfoque nas listas ligadas! :)
80 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
97. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
´E a estrutura de dados mais simples e comum encontrada no
Kernel
Diferentemente de um array ´e uma estrutura expans´ıvel
Faz uso do conceito de n´os que apontam para outros n´os
As listas ligadas podem se dividir em quatro grupos:
Listas simples
Listas duplamente ligadas
Listas circulares simples
Listas circulares duplamente ligadas
81 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
98. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t {
void ∗ data ; /∗ the payload ∗/
s t r u c t l i s t e l e m e n t ∗ next ; /∗ p o i n t e r to the next
element ∗/
};
82 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
99. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t {
void ∗ data ; /∗ the payload ∗/
s t r u c t l i s t e l e m e n t ∗ next ; /∗ next element ∗/
s t r u c t l i s t e l e m e n t ∗ prev ; /∗ p r e v i o u s element ∗/
};
83 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
100. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Conceitos
Listas circulares simples
Figura: Lista circular simples
Figura: Lista circular duplamente ligada
84 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
101. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
A implementa¸c˜ao do Kernel
Em geral, as implementa¸c˜oes de listas ligadas s˜ao feitas
tornando a carga ´util um elemento da lista
s t r u c t my struct {
unsigned long param1 ;
unsigned long para2 ;
bool param3 ;
s t r u c t my struct ∗ next ;
s t r u c t my struct ∗ prev ;
};
Ao inv´es disso, a implementa¸c˜ao do kernel adiciona a lista ligada `a
estrutura de carga ´util
85 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
102. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
A implementa¸c˜ao do Kernel
s t r u c t my struct {
unsigned long param1 ;
unsigned long param2 ;
bool param3 ;
s t r u c t l i s t h e a d l i s t ;
};
list head ´e composta por apenas dois elementos e ´e definida em
linux/list.h
s t r u c t l i s t h e a d {
s t r u c t l i s t h e a d ∗ next
s t r u c t l i s t h e a d ∗ prev ;
};
86 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
103. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Definindo uma lista ligada
1 Definir a estrutura de carga ´util
2 Atribuir os valores do primeiro elemento da lista
3 Invocar a macro INIT LIST HEAD para inicializar a lista
Por que ´e necess´aria a existˆencia de uma macro para inicializa¸c˜ao
da lista?
87 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
104. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Definindo uma lista ligada
1 Definir a estrutura de carga ´util
2 Atribuir os valores do primeiro elemento da lista
3 Invocar a macro INIT LIST HEAD para inicializar a lista
Por que ´e necess´aria a existˆencia de uma macro para inicializa¸c˜ao
da lista?
Porque ´e necess´aria a aloca¸c˜ao da mem´oria para o primeiro
elemento list head
87 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
105. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t my struct ∗ payload ;
payload = kmalloc ( s i z e o f (∗ payload ) , GFP KERNEL) ;
payload−>param1 = 40;
payload−>param2 = 6;
payload−>param3 = f a l s e ;
INIT LIST HEAD(&payload−> l i s t ) ;
Se estiv´essemos trabalhando com elementos est´aticos criar´ıamos da
seguinte maneira
s t r u c t my struct payload = {
. param1 = 40 ,
. param2 = 6 ,
. l i s t = INIT LIST HEAD ( payload . l i s t ) ,
};
88 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
106. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada n˜ao ´e feita nenhuma diferencia¸c˜ao entre
qual elemento ´e a “cabe¸ca” da lista
Por´em, muitas vezes queremos manter esse registro
Podemos fazer isso a partir da macro LIST HEAD
s t a t i c LIST HEAD( head ) ;
A partir disso ´e criado um elemento est´atico list head
89 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
107. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Fun¸c˜oes para adicionar elementos na lista
Existem basicamente dois m´etodos para inser¸c˜ao de elementos da
lista
list add(struct list head *new, struct list head *head)
list add tail(struct list head *new, struct list head *head)
LIST HEAD( head ) ;
s t r u c t my struct ∗ element = . . . // Objeto alocado e com
os parˆametros setados
l i s t a d d (&element−>l i s t , &head ) ;
90 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
108. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Algumas outras fun¸c˜oes para manipula¸c˜ao
list del
list del init
list move
list move tail
list empty: checa se a lista est´a vazia
91 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
109. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Algumas outras fun¸c˜oes para manipula¸c˜ao
list del
list del init
list move
list move tail
list empty: checa se a lista est´a vazia
Mas afinal, como recuperamos a carga ´util tendo referˆencia apenas
ao list head?
Fazemos uso da fun¸c˜ao list entry(ptr, type, member), onde
ptr: ponteiro list head
type: tipo da carga ´util
member: nome do elemento list head dentro da carga ´util
91 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
110. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Curiosidade: o funcionamento da fun¸c˜ao list entry
Trata-se de uma macro que consegue obter o endere¸co da
estrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elemento
interno em rela¸c˜ao `a estrutura externa
#d e f i n e l i s t e n t r y ( ptr , type , member) ({
const typeof ( (( type ∗) 0)−>member ) ∗ mptr = ( ptr ) ;
( type ∗) ( ( char ∗) mptr − o f f s e t o f ( type , member) ) ; } )
92 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
111. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam a
itera¸c˜ao na lista de maneira bastante simples
list for each, list for each entry, list for each entry reverse
s t r u c t l i s t h e a d ∗p ;
s t r u c t my struct ∗ f ;
l i s t f o r e a c h (p , &head ) {
/∗ f aponta para a carga u t i l dos elementos ∗/
f = l i s t e n t r y (p , s t r u c t my struct , l i s t ) ;
}
93 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
112. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Atividade 3: trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de cria¸c˜ao e utiliza¸c˜ao
de listas ligadas
Em um dos m´odulos criados na se¸c˜ao 1 adicione rotinas que
criem, populem, iterem e realizem dele¸c˜ao sobre uma lista
A estrutura deve ser definida em um arquivo .h bem como as
rotinas do m´odulo
Tempo da atividade: 10 - 15 minutos
94 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
113. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Bibliografia I
Jeremy Andrews.
Linux: Documenting how patches reach the kernel.
http://kerneltrap.org/node/3180, Maio 2004.
The Git Community Book.
The git community book.
http://book.git-scm.com/index.html, Outubro 2011.
Ariejan de Vroom.
How to create and apply a patch with git.
http://ariejan.net/2009/10/26/
how-to-create-and-apply-a-patch-with-git/, Outubro
2009.
95 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)
114. Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia Foudation.
Sco-linux controversies.
http:
//en.wikipedia.org/wiki/SCO-Linux_controversies,
Outubro 2011.
96 / 96 Ivo Calado IFAL
Programa¸c˜ao para o Kernel Linux (Parte 1)