SlideShare une entreprise Scribd logo
1  sur  114
Télécharger pour lire hors ligne
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)

Contenu connexe

Tendances

Introdução ao Linux - aula 01
Introdução ao Linux - aula 01Introdução ao Linux - aula 01
Introdução ao Linux - aula 01Renan Aryel
 
Sistema Operativo Linux
Sistema Operativo LinuxSistema Operativo Linux
Sistema Operativo Linuxfilipereira
 
Comandos Linux
Comandos LinuxComandos Linux
Comandos Linuxlol
 
Mini-curso de linux básico
Mini-curso de linux básicoMini-curso de linux básico
Mini-curso de linux básicoAdriano Melo
 
Introdução ao Linux - aula 02
Introdução ao Linux - aula 02Introdução ao Linux - aula 02
Introdução ao Linux - aula 02Renan Aryel
 
Vale a pena usar o Linux!?
Vale a pena usar o Linux!?Vale a pena usar o Linux!?
Vale a pena usar o Linux!?bardo
 
Complemento rodrigo f ormatado
Complemento rodrigo f ormatadoComplemento rodrigo f ormatado
Complemento rodrigo f ormatadoNeon Online
 
História do linux ppt
História do linux pptHistória do linux ppt
História do linux pptshade09
 
Arquivos de Inicialização do Linux
Arquivos de Inicialização do LinuxArquivos de Inicialização do Linux
Arquivos de Inicialização do LinuxIvani Nascimento
 
Minicurso GNU/Linux básico - Aula1 - Semana Sistemas de Informação 2015 - UNI...
Minicurso GNU/Linux básico - Aula1 - Semana Sistemas de Informação 2015 - UNI...Minicurso GNU/Linux básico - Aula1 - Semana Sistemas de Informação 2015 - UNI...
Minicurso GNU/Linux básico - Aula1 - Semana Sistemas de Informação 2015 - UNI...Marlon Willrich
 
Linux - Bruno Oliveira 12ºL
Linux - Bruno Oliveira 12ºLLinux - Bruno Oliveira 12ºL
Linux - Bruno Oliveira 12ºLBrunoOliveira1070
 
Sistema operacional linux
Sistema operacional linuxSistema operacional linux
Sistema operacional linuxgabiel-felipe
 

Tendances (20)

Introdução ao Linux - aula 01
Introdução ao Linux - aula 01Introdução ao Linux - aula 01
Introdução ao Linux - aula 01
 
Introdução Linux
Introdução LinuxIntrodução Linux
Introdução Linux
 
Sistema Operativo Linux
Sistema Operativo LinuxSistema Operativo Linux
Sistema Operativo Linux
 
Comandos Linux
Comandos LinuxComandos Linux
Comandos Linux
 
Mini-curso de linux básico
Mini-curso de linux básicoMini-curso de linux básico
Mini-curso de linux básico
 
Unix - Sistema Operacional
Unix - Sistema OperacionalUnix - Sistema Operacional
Unix - Sistema Operacional
 
Introdução ao Linux - aula 02
Introdução ao Linux - aula 02Introdução ao Linux - aula 02
Introdução ao Linux - aula 02
 
Vale a pena usar o Linux!?
Vale a pena usar o Linux!?Vale a pena usar o Linux!?
Vale a pena usar o Linux!?
 
Slackware Linux
Slackware LinuxSlackware Linux
Slackware Linux
 
U N I X
U N I XU N I X
U N I X
 
Complemento rodrigo f ormatado
Complemento rodrigo f ormatadoComplemento rodrigo f ormatado
Complemento rodrigo f ormatado
 
Soa cap1 introducao a linux
Soa cap1 introducao a linuxSoa cap1 introducao a linux
Soa cap1 introducao a linux
 
História do linux ppt
História do linux pptHistória do linux ppt
História do linux ppt
 
725
725725
725
 
Arquivos de Inicialização do Linux
Arquivos de Inicialização do LinuxArquivos de Inicialização do Linux
Arquivos de Inicialização do Linux
 
Minicurso GNU/Linux básico - Aula1 - Semana Sistemas de Informação 2015 - UNI...
Minicurso GNU/Linux básico - Aula1 - Semana Sistemas de Informação 2015 - UNI...Minicurso GNU/Linux básico - Aula1 - Semana Sistemas de Informação 2015 - UNI...
Minicurso GNU/Linux básico - Aula1 - Semana Sistemas de Informação 2015 - UNI...
 
Administração de Redes Linux - I
Administração de Redes Linux - IAdministração de Redes Linux - I
Administração de Redes Linux - I
 
S.o iuras
S.o iurasS.o iuras
S.o iuras
 
Linux - Bruno Oliveira 12ºL
Linux - Bruno Oliveira 12ºLLinux - Bruno Oliveira 12ºL
Linux - Bruno Oliveira 12ºL
 
Sistema operacional linux
Sistema operacional linuxSistema operacional linux
Sistema operacional linux
 

En vedette

Programação para Kernel Linux - Parte 2
Programação para Kernel Linux - Parte 2Programação para Kernel Linux - Parte 2
Programação para Kernel Linux - Parte 2Ivo Calado
 
Instalação de um servidor debian
Instalação de um servidor debianInstalação de um servidor debian
Instalação de um servidor debianEduardo Mendes
 
Segurança em Servidores Linux - Ênfase em RHEL
Segurança em Servidores Linux - Ênfase em RHELSegurança em Servidores Linux - Ênfase em RHEL
Segurança em Servidores Linux - Ênfase em RHELAlessandro Silva
 
Debian server (Servidor Debian)
Debian server (Servidor Debian)Debian server (Servidor Debian)
Debian server (Servidor Debian)marviowesley
 
Debian para servidores
Debian para servidoresDebian para servidores
Debian para servidoresThiago Finardi
 
BrOffice - Apostila completa
BrOffice - Apostila completaBrOffice - Apostila completa
BrOffice - Apostila completaVera Mln Silva
 
Debian - Sistema Operacional
Debian - Sistema OperacionalDebian - Sistema Operacional
Debian - Sistema OperacionalAnderson Favaro
 
Linux - Shell e Comandos Básicos
Linux - Shell e Comandos BásicosLinux - Shell e Comandos Básicos
Linux - Shell e Comandos BásicosFrederico Madeira
 
Livro Programação em Shell 8 edição Julio Cézar Nevez
Livro Programação em Shell 8 edição   Julio Cézar NevezLivro Programação em Shell 8 edição   Julio Cézar Nevez
Livro Programação em Shell 8 edição Julio Cézar NevezSoftD Abreu
 
Redes e Servidores Linux - Guia Prático - Carlos E. Morimoto
Redes e Servidores Linux - Guia Prático - Carlos E. MorimotoRedes e Servidores Linux - Guia Prático - Carlos E. Morimoto
Redes e Servidores Linux - Guia Prático - Carlos E. MorimotoHeber Gutenberg
 
Livro curso de_hacker_para_iniciantes_cap_1
Livro curso de_hacker_para_iniciantes_cap_1Livro curso de_hacker_para_iniciantes_cap_1
Livro curso de_hacker_para_iniciantes_cap_1Alax Ricard
 
Monografia: como fazer
Monografia: como fazerMonografia: como fazer
Monografia: como fazerCarolina Lara
 
Breve roteiro para elaborar uma monografia
Breve roteiro para elaborar uma monografiaBreve roteiro para elaborar uma monografia
Breve roteiro para elaborar uma monografiaWilson Valle
 
Livro proibido do curso de hacker completo 285 páginas 71
Livro proibido do curso de hacker completo 285 páginas 71Livro proibido do curso de hacker completo 285 páginas 71
Livro proibido do curso de hacker completo 285 páginas 71Guilherme Dias
 
Apostila para hackers iniciantes
Apostila para hackers iniciantesApostila para hackers iniciantes
Apostila para hackers inicianteshackersetruques
 

En vedette (20)

Programação para Kernel Linux - Parte 2
Programação para Kernel Linux - Parte 2Programação para Kernel Linux - Parte 2
Programação para Kernel Linux - Parte 2
 
Instalação de um servidor debian
Instalação de um servidor debianInstalação de um servidor debian
Instalação de um servidor debian
 
Segurança em Servidores Linux - Ênfase em RHEL
Segurança em Servidores Linux - Ênfase em RHELSegurança em Servidores Linux - Ênfase em RHEL
Segurança em Servidores Linux - Ênfase em RHEL
 
Debian server (Servidor Debian)
Debian server (Servidor Debian)Debian server (Servidor Debian)
Debian server (Servidor Debian)
 
Debian para servidores
Debian para servidoresDebian para servidores
Debian para servidores
 
BrOffice - Apostila completa
BrOffice - Apostila completaBrOffice - Apostila completa
BrOffice - Apostila completa
 
Debian - Sistema Operacional
Debian - Sistema OperacionalDebian - Sistema Operacional
Debian - Sistema Operacional
 
Linux - Shell e Comandos Básicos
Linux - Shell e Comandos BásicosLinux - Shell e Comandos Básicos
Linux - Shell e Comandos Básicos
 
Livro Programação em Shell 8 edição Julio Cézar Nevez
Livro Programação em Shell 8 edição   Julio Cézar NevezLivro Programação em Shell 8 edição   Julio Cézar Nevez
Livro Programação em Shell 8 edição Julio Cézar Nevez
 
Redes e Servidores Linux - Guia Prático - Carlos E. Morimoto
Redes e Servidores Linux - Guia Prático - Carlos E. MorimotoRedes e Servidores Linux - Guia Prático - Carlos E. Morimoto
Redes e Servidores Linux - Guia Prático - Carlos E. Morimoto
 
Livro curso de_hacker_para_iniciantes_cap_1
Livro curso de_hacker_para_iniciantes_cap_1Livro curso de_hacker_para_iniciantes_cap_1
Livro curso de_hacker_para_iniciantes_cap_1
 
Monografia: como fazer
Monografia: como fazerMonografia: como fazer
Monografia: como fazer
 
TCC - Pedagogia
TCC - PedagogiaTCC - Pedagogia
TCC - Pedagogia
 
Breve roteiro para elaborar uma monografia
Breve roteiro para elaborar uma monografiaBreve roteiro para elaborar uma monografia
Breve roteiro para elaborar uma monografia
 
Apresentação TCC
Apresentação TCCApresentação TCC
Apresentação TCC
 
Aula de metodologia, monografia e tcc
Aula de metodologia, monografia e tccAula de metodologia, monografia e tcc
Aula de metodologia, monografia e tcc
 
Livro proibido do curso de hacker completo 285 páginas 71
Livro proibido do curso de hacker completo 285 páginas 71Livro proibido do curso de hacker completo 285 páginas 71
Livro proibido do curso de hacker completo 285 páginas 71
 
Apostila para hackers iniciantes
Apostila para hackers iniciantesApostila para hackers iniciantes
Apostila para hackers iniciantes
 
TCC SLIDE DE APRESENTAÇÃO
TCC SLIDE DE APRESENTAÇÃOTCC SLIDE DE APRESENTAÇÃO
TCC SLIDE DE APRESENTAÇÃO
 
Apresentando TCC
Apresentando TCCApresentando TCC
Apresentando TCC
 

Similaire à Kernel Linux Programação Parte 1

Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...
Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...
Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...Tchelinux
 
Seguranca Software Livre
Seguranca Software LivreSeguranca Software Livre
Seguranca Software LivreHelio Marques
 
Linux Desktop (Campus Party Recife)
Linux Desktop (Campus Party Recife)Linux Desktop (Campus Party Recife)
Linux Desktop (Campus Party Recife)Adriano Melo
 
Linux - Sobre a Disciplina + Introdução ao Linux
Linux - Sobre a Disciplina + Introdução ao LinuxLinux - Sobre a Disciplina + Introdução ao Linux
Linux - Sobre a Disciplina + Introdução ao LinuxFrederico Madeira
 
Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling Landgraf
Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling LandgrafDesenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling Landgraf
Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling LandgrafTchelinux
 
Mini-curso de Linux na CPRecife2
Mini-curso de Linux na CPRecife2Mini-curso de Linux na CPRecife2
Mini-curso de Linux na CPRecife2Adriano Melo
 
Mandriva - Sistema Operacional
Mandriva - Sistema OperacionalMandriva - Sistema Operacional
Mandriva - Sistema OperacionalAnderson Favaro
 
OpenSolaris Dtrace SRM Zones
OpenSolaris Dtrace SRM ZonesOpenSolaris Dtrace SRM Zones
OpenSolaris Dtrace SRM ZonesMarcelo Arbore
 
Sistemas Operacionais.pptx
Sistemas Operacionais.pptxSistemas Operacionais.pptx
Sistemas Operacionais.pptxstenio medeiros
 
Unidade 3.1 Introdução ao Sistema Operacional Linux
Unidade 3.1   Introdução ao Sistema Operacional LinuxUnidade 3.1   Introdução ao Sistema Operacional Linux
Unidade 3.1 Introdução ao Sistema Operacional LinuxJuan Carlos Lamarão
 
Instalação do sistemas operacionais dualboot
Instalação do sistemas operacionais dualbootInstalação do sistemas operacionais dualboot
Instalação do sistemas operacionais dualbootWilliam Menegais
 
Sistemas Operacionais - Gnu/Linux
Sistemas Operacionais - Gnu/LinuxSistemas Operacionais - Gnu/Linux
Sistemas Operacionais - Gnu/LinuxLuiz Arthur
 
Introdução ao OpenSolaris
Introdução ao OpenSolarisIntrodução ao OpenSolaris
Introdução ao OpenSolarisCindy Dalfovo
 

Similaire à Kernel Linux Programação Parte 1 (20)

Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...
Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...
Introdução ao Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilli...
 
Seguranca Software Livre
Seguranca Software LivreSeguranca Software Livre
Seguranca Software Livre
 
Linux Desktop (Campus Party Recife)
Linux Desktop (Campus Party Recife)Linux Desktop (Campus Party Recife)
Linux Desktop (Campus Party Recife)
 
Apresentação Final
Apresentação FinalApresentação Final
Apresentação Final
 
Linux - Sobre a Disciplina + Introdução ao Linux
Linux - Sobre a Disciplina + Introdução ao LinuxLinux - Sobre a Disciplina + Introdução ao Linux
Linux - Sobre a Disciplina + Introdução ao Linux
 
Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling Landgraf
Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling LandgrafDesenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling Landgraf
Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling Landgraf
 
Mini-curso de Linux na CPRecife2
Mini-curso de Linux na CPRecife2Mini-curso de Linux na CPRecife2
Mini-curso de Linux na CPRecife2
 
Mandriva - Sistema Operacional
Mandriva - Sistema OperacionalMandriva - Sistema Operacional
Mandriva - Sistema Operacional
 
Minicurso GNU/Linux
Minicurso GNU/LinuxMinicurso GNU/Linux
Minicurso GNU/Linux
 
Linux
LinuxLinux
Linux
 
OpenSolaris Dtrace SRM Zones
OpenSolaris Dtrace SRM ZonesOpenSolaris Dtrace SRM Zones
OpenSolaris Dtrace SRM Zones
 
Sistemas Operacionais.pptx
Sistemas Operacionais.pptxSistemas Operacionais.pptx
Sistemas Operacionais.pptx
 
A.S.O 2 - Linux
A.S.O 2 - LinuxA.S.O 2 - Linux
A.S.O 2 - Linux
 
Unidade 3.1 Introdução ao Sistema Operacional Linux
Unidade 3.1   Introdução ao Sistema Operacional LinuxUnidade 3.1   Introdução ao Sistema Operacional Linux
Unidade 3.1 Introdução ao Sistema Operacional Linux
 
Instalação do sistemas operacionais dualboot
Instalação do sistemas operacionais dualbootInstalação do sistemas operacionais dualboot
Instalação do sistemas operacionais dualboot
 
Linux
LinuxLinux
Linux
 
O kernel do linux
O kernel do linuxO kernel do linux
O kernel do linux
 
Aula 01 So2009
Aula 01   So2009Aula 01   So2009
Aula 01 So2009
 
Sistemas Operacionais - Gnu/Linux
Sistemas Operacionais - Gnu/LinuxSistemas Operacionais - Gnu/Linux
Sistemas Operacionais - Gnu/Linux
 
Introdução ao OpenSolaris
Introdução ao OpenSolarisIntrodução ao OpenSolaris
Introdução ao OpenSolaris
 

Plus de Ivo Calado

Tutorial sobre Jquery
Tutorial sobre JqueryTutorial sobre Jquery
Tutorial sobre JqueryIvo Calado
 
Tutorial sobre Bootstrap
Tutorial sobre BootstrapTutorial sobre Bootstrap
Tutorial sobre BootstrapIvo Calado
 
Introdução a eXtensible Markup Language (XML)
Introdução a eXtensible Markup Language (XML)Introdução a eXtensible Markup Language (XML)
Introdução a eXtensible Markup Language (XML)Ivo Calado
 
XHTML: eXtensible Hypertext Markup Language
XHTML: eXtensible Hypertext Markup LanguageXHTML: eXtensible Hypertext Markup Language
XHTML: eXtensible Hypertext Markup LanguageIvo Calado
 
Java Server Pages
Java Server PagesJava Server Pages
Java Server PagesIvo Calado
 

Plus de Ivo Calado (10)

Tutorial sobre Jquery
Tutorial sobre JqueryTutorial sobre Jquery
Tutorial sobre Jquery
 
Tutorial sobre Bootstrap
Tutorial sobre BootstrapTutorial sobre Bootstrap
Tutorial sobre Bootstrap
 
Introdução a eXtensible Markup Language (XML)
Introdução a eXtensible Markup Language (XML)Introdução a eXtensible Markup Language (XML)
Introdução a eXtensible Markup Language (XML)
 
XHTML: eXtensible Hypertext Markup Language
XHTML: eXtensible Hypertext Markup LanguageXHTML: eXtensible Hypertext Markup Language
XHTML: eXtensible Hypertext Markup Language
 
Java Servlets
Java ServletsJava Servlets
Java Servlets
 
Java Server Pages
Java Server PagesJava Server Pages
Java Server Pages
 
Javascript
JavascriptJavascript
Javascript
 
Java4web
Java4webJava4web
Java4web
 
HTML
HTMLHTML
HTML
 
CSS
CSSCSS
CSS
 

Kernel Linux Programação Parte 1

  • 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)