programação para kernel linux - parte 1
DESCRIPTION
Tutorial sobre desenvolvimento para o Kernel Linux. Atualizei os slides com algumas modificações.TRANSCRIPT
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Programacao para o Kernel Linux (Parte 1)
Ivo Augusto Andrade Rocha Calado
Instituto Federal de Educacao Ciencia e Tecnologia de Alagoas
29 de Junho de 2014
1 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Sobre o palestrante
Titulacao
Graduado em Ciencia da Computacao pela UFAL
Mestre em Ciencia da Computacao pela UFCG
Doutorando em Engenharia Eletrica pela UFCG
Emailivocaladoeeufcgedubrivocaladoifaledubr ouSitehttpssitesgooglecomaeeufcgedubrivocalado
2 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Experiencia 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 dealgoritmos de controle de congestionamento no protocoloDCCP
CCID-4 e CCID-5 (DCCP Cubic)
3 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
E sobre voces
Qual a experiencia com sistemas operacionais
E com o Linux Apenas usuario domestico ou um poucomais
Quem ja fucou eou compilou o kernel
Qual o conhecimento sobre a linguagem de programacao CRedes de Computadores Estruturas de Dados e SistemasOperacionais
4 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Objetivo do curso
Mostrar o que e e como o Kernel Linux esta organizado
Apresentar uma visao geral sobre a programacao para oKernel Linux
Quais as etapas necessarias para para implementacao demodulosQue ferramentas auxiliam no processo de criacao e submissaode patches
5 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Agenda I
1 IntroducaoO que e um sistema operacionalLinuxCaracterısticas do Kernel LinuxDiferencas entre desenvolvimento para Kernel e User space
2 Montando o ambienteObtendo e Compilando o Kernel LinuxA Ferramenta de Gerencia de Codigo GitCriando e aplicando patches com o Git
3 Criando modulosO modulo Hello WorldUm pouco mais sobre modulos
6 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Agenda II
4 Gerenciamento de Memoriakmallocslab cache
5 Estruturas de DadosConceitosLinked list
7 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Observacao sobre este material
Este material e derivado de diversos trabalhos livrementedisponıveis na Internet
8 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
10 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
Dois espacos de enderecamento
Espaco de Usuario (User-space)
Espaco de Kernel (Kernel-space)
Tres componentes basicos
System calls engloba um conjunto de funcoesdisponibilizadas pelo sistema operacional para prover servicos
Nucleo engloba mecanismos responsaveis pelas gerencia dememoria processos sistemas de arquivos abstracoes deacesso a hardware etc
Device Drivers fornecem implementacoes que proporcionamacesso a diversos mecanismos de hardware
11 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Durante muito tempo foi utilizado a notacao baseada em 3numeros + 1 adicional
Segundo um dos mantenedores do Linux Willy Tarreau ldquoThe4-integer numbering was a real nightmare with kernel versionslooking like IP addresses Now it will get back to something morecommon and much more maintainablerdquo
13 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Em vista da situacao apresentada e tambem para comemoraros 20 anos do Linux Linus Torvalds decidiu alterar a formacomo as versoes definidas
30 311 32-rc1
Agora sao 2 numeros + 1
Porem em termos praticos a versao 2640 == 30
14 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels monolıticos x Micro Kernels
O desenvolvimento de sistemas operacionais e marcado porduas escolas que sao
Kernels MonolıticosMicro Kernels
(a) Micro Kernel (b) Kernel Monolıtico unico espaco deenderecamento
15 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Sobre o palestrante
Titulacao
Graduado em Ciencia da Computacao pela UFAL
Mestre em Ciencia da Computacao pela UFCG
Doutorando em Engenharia Eletrica pela UFCG
Emailivocaladoeeufcgedubrivocaladoifaledubr ouSitehttpssitesgooglecomaeeufcgedubrivocalado
2 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Experiencia 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 dealgoritmos de controle de congestionamento no protocoloDCCP
CCID-4 e CCID-5 (DCCP Cubic)
3 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
E sobre voces
Qual a experiencia com sistemas operacionais
E com o Linux Apenas usuario domestico ou um poucomais
Quem ja fucou eou compilou o kernel
Qual o conhecimento sobre a linguagem de programacao CRedes de Computadores Estruturas de Dados e SistemasOperacionais
4 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Objetivo do curso
Mostrar o que e e como o Kernel Linux esta organizado
Apresentar uma visao geral sobre a programacao para oKernel Linux
Quais as etapas necessarias para para implementacao demodulosQue ferramentas auxiliam no processo de criacao e submissaode patches
5 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Agenda I
1 IntroducaoO que e um sistema operacionalLinuxCaracterısticas do Kernel LinuxDiferencas entre desenvolvimento para Kernel e User space
2 Montando o ambienteObtendo e Compilando o Kernel LinuxA Ferramenta de Gerencia de Codigo GitCriando e aplicando patches com o Git
3 Criando modulosO modulo Hello WorldUm pouco mais sobre modulos
6 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Agenda II
4 Gerenciamento de Memoriakmallocslab cache
5 Estruturas de DadosConceitosLinked list
7 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Observacao sobre este material
Este material e derivado de diversos trabalhos livrementedisponıveis na Internet
8 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
10 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
Dois espacos de enderecamento
Espaco de Usuario (User-space)
Espaco de Kernel (Kernel-space)
Tres componentes basicos
System calls engloba um conjunto de funcoesdisponibilizadas pelo sistema operacional para prover servicos
Nucleo engloba mecanismos responsaveis pelas gerencia dememoria processos sistemas de arquivos abstracoes deacesso a hardware etc
Device Drivers fornecem implementacoes que proporcionamacesso a diversos mecanismos de hardware
11 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Durante muito tempo foi utilizado a notacao baseada em 3numeros + 1 adicional
Segundo um dos mantenedores do Linux Willy Tarreau ldquoThe4-integer numbering was a real nightmare with kernel versionslooking like IP addresses Now it will get back to something morecommon and much more maintainablerdquo
13 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Em vista da situacao apresentada e tambem para comemoraros 20 anos do Linux Linus Torvalds decidiu alterar a formacomo as versoes definidas
30 311 32-rc1
Agora sao 2 numeros + 1
Porem em termos praticos a versao 2640 == 30
14 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels monolıticos x Micro Kernels
O desenvolvimento de sistemas operacionais e marcado porduas escolas que sao
Kernels MonolıticosMicro Kernels
(a) Micro Kernel (b) Kernel Monolıtico unico espaco deenderecamento
15 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Experiencia 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 dealgoritmos de controle de congestionamento no protocoloDCCP
CCID-4 e CCID-5 (DCCP Cubic)
3 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
E sobre voces
Qual a experiencia com sistemas operacionais
E com o Linux Apenas usuario domestico ou um poucomais
Quem ja fucou eou compilou o kernel
Qual o conhecimento sobre a linguagem de programacao CRedes de Computadores Estruturas de Dados e SistemasOperacionais
4 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Objetivo do curso
Mostrar o que e e como o Kernel Linux esta organizado
Apresentar uma visao geral sobre a programacao para oKernel Linux
Quais as etapas necessarias para para implementacao demodulosQue ferramentas auxiliam no processo de criacao e submissaode patches
5 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Agenda I
1 IntroducaoO que e um sistema operacionalLinuxCaracterısticas do Kernel LinuxDiferencas entre desenvolvimento para Kernel e User space
2 Montando o ambienteObtendo e Compilando o Kernel LinuxA Ferramenta de Gerencia de Codigo GitCriando e aplicando patches com o Git
3 Criando modulosO modulo Hello WorldUm pouco mais sobre modulos
6 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Agenda II
4 Gerenciamento de Memoriakmallocslab cache
5 Estruturas de DadosConceitosLinked list
7 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Observacao sobre este material
Este material e derivado de diversos trabalhos livrementedisponıveis na Internet
8 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
10 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
Dois espacos de enderecamento
Espaco de Usuario (User-space)
Espaco de Kernel (Kernel-space)
Tres componentes basicos
System calls engloba um conjunto de funcoesdisponibilizadas pelo sistema operacional para prover servicos
Nucleo engloba mecanismos responsaveis pelas gerencia dememoria processos sistemas de arquivos abstracoes deacesso a hardware etc
Device Drivers fornecem implementacoes que proporcionamacesso a diversos mecanismos de hardware
11 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Durante muito tempo foi utilizado a notacao baseada em 3numeros + 1 adicional
Segundo um dos mantenedores do Linux Willy Tarreau ldquoThe4-integer numbering was a real nightmare with kernel versionslooking like IP addresses Now it will get back to something morecommon and much more maintainablerdquo
13 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Em vista da situacao apresentada e tambem para comemoraros 20 anos do Linux Linus Torvalds decidiu alterar a formacomo as versoes definidas
30 311 32-rc1
Agora sao 2 numeros + 1
Porem em termos praticos a versao 2640 == 30
14 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels monolıticos x Micro Kernels
O desenvolvimento de sistemas operacionais e marcado porduas escolas que sao
Kernels MonolıticosMicro Kernels
(a) Micro Kernel (b) Kernel Monolıtico unico espaco deenderecamento
15 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
E sobre voces
Qual a experiencia com sistemas operacionais
E com o Linux Apenas usuario domestico ou um poucomais
Quem ja fucou eou compilou o kernel
Qual o conhecimento sobre a linguagem de programacao CRedes de Computadores Estruturas de Dados e SistemasOperacionais
4 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Objetivo do curso
Mostrar o que e e como o Kernel Linux esta organizado
Apresentar uma visao geral sobre a programacao para oKernel Linux
Quais as etapas necessarias para para implementacao demodulosQue ferramentas auxiliam no processo de criacao e submissaode patches
5 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Agenda I
1 IntroducaoO que e um sistema operacionalLinuxCaracterısticas do Kernel LinuxDiferencas entre desenvolvimento para Kernel e User space
2 Montando o ambienteObtendo e Compilando o Kernel LinuxA Ferramenta de Gerencia de Codigo GitCriando e aplicando patches com o Git
3 Criando modulosO modulo Hello WorldUm pouco mais sobre modulos
6 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Agenda II
4 Gerenciamento de Memoriakmallocslab cache
5 Estruturas de DadosConceitosLinked list
7 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Observacao sobre este material
Este material e derivado de diversos trabalhos livrementedisponıveis na Internet
8 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
10 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
Dois espacos de enderecamento
Espaco de Usuario (User-space)
Espaco de Kernel (Kernel-space)
Tres componentes basicos
System calls engloba um conjunto de funcoesdisponibilizadas pelo sistema operacional para prover servicos
Nucleo engloba mecanismos responsaveis pelas gerencia dememoria processos sistemas de arquivos abstracoes deacesso a hardware etc
Device Drivers fornecem implementacoes que proporcionamacesso a diversos mecanismos de hardware
11 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Durante muito tempo foi utilizado a notacao baseada em 3numeros + 1 adicional
Segundo um dos mantenedores do Linux Willy Tarreau ldquoThe4-integer numbering was a real nightmare with kernel versionslooking like IP addresses Now it will get back to something morecommon and much more maintainablerdquo
13 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Em vista da situacao apresentada e tambem para comemoraros 20 anos do Linux Linus Torvalds decidiu alterar a formacomo as versoes definidas
30 311 32-rc1
Agora sao 2 numeros + 1
Porem em termos praticos a versao 2640 == 30
14 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels monolıticos x Micro Kernels
O desenvolvimento de sistemas operacionais e marcado porduas escolas que sao
Kernels MonolıticosMicro Kernels
(a) Micro Kernel (b) Kernel Monolıtico unico espaco deenderecamento
15 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Objetivo do curso
Mostrar o que e e como o Kernel Linux esta organizado
Apresentar uma visao geral sobre a programacao para oKernel Linux
Quais as etapas necessarias para para implementacao demodulosQue ferramentas auxiliam no processo de criacao e submissaode patches
5 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Agenda I
1 IntroducaoO que e um sistema operacionalLinuxCaracterısticas do Kernel LinuxDiferencas entre desenvolvimento para Kernel e User space
2 Montando o ambienteObtendo e Compilando o Kernel LinuxA Ferramenta de Gerencia de Codigo GitCriando e aplicando patches com o Git
3 Criando modulosO modulo Hello WorldUm pouco mais sobre modulos
6 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Agenda II
4 Gerenciamento de Memoriakmallocslab cache
5 Estruturas de DadosConceitosLinked list
7 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Observacao sobre este material
Este material e derivado de diversos trabalhos livrementedisponıveis na Internet
8 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
10 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
Dois espacos de enderecamento
Espaco de Usuario (User-space)
Espaco de Kernel (Kernel-space)
Tres componentes basicos
System calls engloba um conjunto de funcoesdisponibilizadas pelo sistema operacional para prover servicos
Nucleo engloba mecanismos responsaveis pelas gerencia dememoria processos sistemas de arquivos abstracoes deacesso a hardware etc
Device Drivers fornecem implementacoes que proporcionamacesso a diversos mecanismos de hardware
11 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Durante muito tempo foi utilizado a notacao baseada em 3numeros + 1 adicional
Segundo um dos mantenedores do Linux Willy Tarreau ldquoThe4-integer numbering was a real nightmare with kernel versionslooking like IP addresses Now it will get back to something morecommon and much more maintainablerdquo
13 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Em vista da situacao apresentada e tambem para comemoraros 20 anos do Linux Linus Torvalds decidiu alterar a formacomo as versoes definidas
30 311 32-rc1
Agora sao 2 numeros + 1
Porem em termos praticos a versao 2640 == 30
14 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels monolıticos x Micro Kernels
O desenvolvimento de sistemas operacionais e marcado porduas escolas que sao
Kernels MonolıticosMicro Kernels
(a) Micro Kernel (b) Kernel Monolıtico unico espaco deenderecamento
15 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Agenda I
1 IntroducaoO que e um sistema operacionalLinuxCaracterısticas do Kernel LinuxDiferencas entre desenvolvimento para Kernel e User space
2 Montando o ambienteObtendo e Compilando o Kernel LinuxA Ferramenta de Gerencia de Codigo GitCriando e aplicando patches com o Git
3 Criando modulosO modulo Hello WorldUm pouco mais sobre modulos
6 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Agenda II
4 Gerenciamento de Memoriakmallocslab cache
5 Estruturas de DadosConceitosLinked list
7 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Observacao sobre este material
Este material e derivado de diversos trabalhos livrementedisponıveis na Internet
8 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
10 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
Dois espacos de enderecamento
Espaco de Usuario (User-space)
Espaco de Kernel (Kernel-space)
Tres componentes basicos
System calls engloba um conjunto de funcoesdisponibilizadas pelo sistema operacional para prover servicos
Nucleo engloba mecanismos responsaveis pelas gerencia dememoria processos sistemas de arquivos abstracoes deacesso a hardware etc
Device Drivers fornecem implementacoes que proporcionamacesso a diversos mecanismos de hardware
11 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Durante muito tempo foi utilizado a notacao baseada em 3numeros + 1 adicional
Segundo um dos mantenedores do Linux Willy Tarreau ldquoThe4-integer numbering was a real nightmare with kernel versionslooking like IP addresses Now it will get back to something morecommon and much more maintainablerdquo
13 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Em vista da situacao apresentada e tambem para comemoraros 20 anos do Linux Linus Torvalds decidiu alterar a formacomo as versoes definidas
30 311 32-rc1
Agora sao 2 numeros + 1
Porem em termos praticos a versao 2640 == 30
14 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels monolıticos x Micro Kernels
O desenvolvimento de sistemas operacionais e marcado porduas escolas que sao
Kernels MonolıticosMicro Kernels
(a) Micro Kernel (b) Kernel Monolıtico unico espaco deenderecamento
15 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Agenda II
4 Gerenciamento de Memoriakmallocslab cache
5 Estruturas de DadosConceitosLinked list
7 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Observacao sobre este material
Este material e derivado de diversos trabalhos livrementedisponıveis na Internet
8 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
10 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
Dois espacos de enderecamento
Espaco de Usuario (User-space)
Espaco de Kernel (Kernel-space)
Tres componentes basicos
System calls engloba um conjunto de funcoesdisponibilizadas pelo sistema operacional para prover servicos
Nucleo engloba mecanismos responsaveis pelas gerencia dememoria processos sistemas de arquivos abstracoes deacesso a hardware etc
Device Drivers fornecem implementacoes que proporcionamacesso a diversos mecanismos de hardware
11 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Durante muito tempo foi utilizado a notacao baseada em 3numeros + 1 adicional
Segundo um dos mantenedores do Linux Willy Tarreau ldquoThe4-integer numbering was a real nightmare with kernel versionslooking like IP addresses Now it will get back to something morecommon and much more maintainablerdquo
13 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Em vista da situacao apresentada e tambem para comemoraros 20 anos do Linux Linus Torvalds decidiu alterar a formacomo as versoes definidas
30 311 32-rc1
Agora sao 2 numeros + 1
Porem em termos praticos a versao 2640 == 30
14 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels monolıticos x Micro Kernels
O desenvolvimento de sistemas operacionais e marcado porduas escolas que sao
Kernels MonolıticosMicro Kernels
(a) Micro Kernel (b) Kernel Monolıtico unico espaco deenderecamento
15 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Observacao sobre este material
Este material e derivado de diversos trabalhos livrementedisponıveis na Internet
8 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
10 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
Dois espacos de enderecamento
Espaco de Usuario (User-space)
Espaco de Kernel (Kernel-space)
Tres componentes basicos
System calls engloba um conjunto de funcoesdisponibilizadas pelo sistema operacional para prover servicos
Nucleo engloba mecanismos responsaveis pelas gerencia dememoria processos sistemas de arquivos abstracoes deacesso a hardware etc
Device Drivers fornecem implementacoes que proporcionamacesso a diversos mecanismos de hardware
11 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Durante muito tempo foi utilizado a notacao baseada em 3numeros + 1 adicional
Segundo um dos mantenedores do Linux Willy Tarreau ldquoThe4-integer numbering was a real nightmare with kernel versionslooking like IP addresses Now it will get back to something morecommon and much more maintainablerdquo
13 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Em vista da situacao apresentada e tambem para comemoraros 20 anos do Linux Linus Torvalds decidiu alterar a formacomo as versoes definidas
30 311 32-rc1
Agora sao 2 numeros + 1
Porem em termos praticos a versao 2640 == 30
14 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels monolıticos x Micro Kernels
O desenvolvimento de sistemas operacionais e marcado porduas escolas que sao
Kernels MonolıticosMicro Kernels
(a) Micro Kernel (b) Kernel Monolıtico unico espaco deenderecamento
15 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
10 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
Dois espacos de enderecamento
Espaco de Usuario (User-space)
Espaco de Kernel (Kernel-space)
Tres componentes basicos
System calls engloba um conjunto de funcoesdisponibilizadas pelo sistema operacional para prover servicos
Nucleo engloba mecanismos responsaveis pelas gerencia dememoria processos sistemas de arquivos abstracoes deacesso a hardware etc
Device Drivers fornecem implementacoes que proporcionamacesso a diversos mecanismos de hardware
11 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Durante muito tempo foi utilizado a notacao baseada em 3numeros + 1 adicional
Segundo um dos mantenedores do Linux Willy Tarreau ldquoThe4-integer numbering was a real nightmare with kernel versionslooking like IP addresses Now it will get back to something morecommon and much more maintainablerdquo
13 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Em vista da situacao apresentada e tambem para comemoraros 20 anos do Linux Linus Torvalds decidiu alterar a formacomo as versoes definidas
30 311 32-rc1
Agora sao 2 numeros + 1
Porem em termos praticos a versao 2640 == 30
14 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels monolıticos x Micro Kernels
O desenvolvimento de sistemas operacionais e marcado porduas escolas que sao
Kernels MonolıticosMicro Kernels
(a) Micro Kernel (b) Kernel Monolıtico unico espaco deenderecamento
15 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
O que e um sistema operacional
O que viria a ser um sistema operacional
Uma maquina estendida
Um gerenciador de recursos
AmbosAtribuicoes de um SO
Gerenciamento de processos
Gerenciamento de memoria
Gerenciamento de dispositivos
Sistemas de arquivos
Entrada e saıda de dados
9 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
10 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
Dois espacos de enderecamento
Espaco de Usuario (User-space)
Espaco de Kernel (Kernel-space)
Tres componentes basicos
System calls engloba um conjunto de funcoesdisponibilizadas pelo sistema operacional para prover servicos
Nucleo engloba mecanismos responsaveis pelas gerencia dememoria processos sistemas de arquivos abstracoes deacesso a hardware etc
Device Drivers fornecem implementacoes que proporcionamacesso a diversos mecanismos de hardware
11 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Durante muito tempo foi utilizado a notacao baseada em 3numeros + 1 adicional
Segundo um dos mantenedores do Linux Willy Tarreau ldquoThe4-integer numbering was a real nightmare with kernel versionslooking like IP addresses Now it will get back to something morecommon and much more maintainablerdquo
13 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Em vista da situacao apresentada e tambem para comemoraros 20 anos do Linux Linus Torvalds decidiu alterar a formacomo as versoes definidas
30 311 32-rc1
Agora sao 2 numeros + 1
Porem em termos praticos a versao 2640 == 30
14 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels monolıticos x Micro Kernels
O desenvolvimento de sistemas operacionais e marcado porduas escolas que sao
Kernels MonolıticosMicro Kernels
(a) Micro Kernel (b) Kernel Monolıtico unico espaco deenderecamento
15 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
10 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
Dois espacos de enderecamento
Espaco de Usuario (User-space)
Espaco de Kernel (Kernel-space)
Tres componentes basicos
System calls engloba um conjunto de funcoesdisponibilizadas pelo sistema operacional para prover servicos
Nucleo engloba mecanismos responsaveis pelas gerencia dememoria processos sistemas de arquivos abstracoes deacesso a hardware etc
Device Drivers fornecem implementacoes que proporcionamacesso a diversos mecanismos de hardware
11 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Durante muito tempo foi utilizado a notacao baseada em 3numeros + 1 adicional
Segundo um dos mantenedores do Linux Willy Tarreau ldquoThe4-integer numbering was a real nightmare with kernel versionslooking like IP addresses Now it will get back to something morecommon and much more maintainablerdquo
13 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Em vista da situacao apresentada e tambem para comemoraros 20 anos do Linux Linus Torvalds decidiu alterar a formacomo as versoes definidas
30 311 32-rc1
Agora sao 2 numeros + 1
Porem em termos praticos a versao 2640 == 30
14 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels monolıticos x Micro Kernels
O desenvolvimento de sistemas operacionais e marcado porduas escolas que sao
Kernels MonolıticosMicro Kernels
(a) Micro Kernel (b) Kernel Monolıtico unico espaco deenderecamento
15 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O que e um sistema operacional
Arquitetura de um sistema operacional
Dois espacos de enderecamento
Espaco de Usuario (User-space)
Espaco de Kernel (Kernel-space)
Tres componentes basicos
System calls engloba um conjunto de funcoesdisponibilizadas pelo sistema operacional para prover servicos
Nucleo engloba mecanismos responsaveis pelas gerencia dememoria processos sistemas de arquivos abstracoes deacesso a hardware etc
Device Drivers fornecem implementacoes que proporcionamacesso a diversos mecanismos de hardware
11 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Durante muito tempo foi utilizado a notacao baseada em 3numeros + 1 adicional
Segundo um dos mantenedores do Linux Willy Tarreau ldquoThe4-integer numbering was a real nightmare with kernel versionslooking like IP addresses Now it will get back to something morecommon and much more maintainablerdquo
13 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Em vista da situacao apresentada e tambem para comemoraros 20 anos do Linux Linus Torvalds decidiu alterar a formacomo as versoes definidas
30 311 32-rc1
Agora sao 2 numeros + 1
Porem em termos praticos a versao 2640 == 30
14 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels monolıticos x Micro Kernels
O desenvolvimento de sistemas operacionais e marcado porduas escolas que sao
Kernels MonolıticosMicro Kernels
(a) Micro Kernel (b) Kernel Monolıtico unico espaco deenderecamento
15 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Durante muito tempo foi utilizado a notacao baseada em 3numeros + 1 adicional
Segundo um dos mantenedores do Linux Willy Tarreau ldquoThe4-integer numbering was a real nightmare with kernel versionslooking like IP addresses Now it will get back to something morecommon and much more maintainablerdquo
13 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Em vista da situacao apresentada e tambem para comemoraros 20 anos do Linux Linus Torvalds decidiu alterar a formacomo as versoes definidas
30 311 32-rc1
Agora sao 2 numeros + 1
Porem em termos praticos a versao 2640 == 30
14 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels monolıticos x Micro Kernels
O desenvolvimento de sistemas operacionais e marcado porduas escolas que sao
Kernels MonolıticosMicro Kernels
(a) Micro Kernel (b) Kernel Monolıtico unico espaco deenderecamento
15 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Durante muito tempo foi utilizado a notacao baseada em 3numeros + 1 adicional
Segundo um dos mantenedores do Linux Willy Tarreau ldquoThe4-integer numbering was a real nightmare with kernel versionslooking like IP addresses Now it will get back to something morecommon and much more maintainablerdquo
13 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Em vista da situacao apresentada e tambem para comemoraros 20 anos do Linux Linus Torvalds decidiu alterar a formacomo as versoes definidas
30 311 32-rc1
Agora sao 2 numeros + 1
Porem em termos praticos a versao 2640 == 30
14 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels monolıticos x Micro Kernels
O desenvolvimento de sistemas operacionais e marcado porduas escolas que sao
Kernels MonolıticosMicro Kernels
(a) Micro Kernel (b) Kernel Monolıtico unico espaco deenderecamento
15 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
GNU Linux ou GNULinux
Qual a diferenca entre Linux e GNULinux
Linux nucleo do SO (e para alguns considerado o ldquoSOrdquo)
Ferramentas GNU conjunto de ferramentas comocompiladores editores de texto linguagem bash etc
A controversia sobre o nome
Existe uma grande controversia sobre o nome correto do SO Umgrupo de usuarios em especial desenvolvedores GNU afirmam queo nome correto e GNULinux Por outro lado outro grupoencabecado por Linus Torvalds preferem simplesmente Linux
Em termos praticos do ponto de vista de um usuario o SO ==GNU + Linux
12 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Durante muito tempo foi utilizado a notacao baseada em 3numeros + 1 adicional
Segundo um dos mantenedores do Linux Willy Tarreau ldquoThe4-integer numbering was a real nightmare with kernel versionslooking like IP addresses Now it will get back to something morecommon and much more maintainablerdquo
13 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Em vista da situacao apresentada e tambem para comemoraros 20 anos do Linux Linus Torvalds decidiu alterar a formacomo as versoes definidas
30 311 32-rc1
Agora sao 2 numeros + 1
Porem em termos praticos a versao 2640 == 30
14 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels monolıticos x Micro Kernels
O desenvolvimento de sistemas operacionais e marcado porduas escolas que sao
Kernels MonolıticosMicro Kernels
(a) Micro Kernel (b) Kernel Monolıtico unico espaco deenderecamento
15 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Durante muito tempo foi utilizado a notacao baseada em 3numeros + 1 adicional
Segundo um dos mantenedores do Linux Willy Tarreau ldquoThe4-integer numbering was a real nightmare with kernel versionslooking like IP addresses Now it will get back to something morecommon and much more maintainablerdquo
13 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Em vista da situacao apresentada e tambem para comemoraros 20 anos do Linux Linus Torvalds decidiu alterar a formacomo as versoes definidas
30 311 32-rc1
Agora sao 2 numeros + 1
Porem em termos praticos a versao 2640 == 30
14 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels monolıticos x Micro Kernels
O desenvolvimento de sistemas operacionais e marcado porduas escolas que sao
Kernels MonolıticosMicro Kernels
(a) Micro Kernel (b) Kernel Monolıtico unico espaco deenderecamento
15 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linux
Versionamento
Em vista da situacao apresentada e tambem para comemoraros 20 anos do Linux Linus Torvalds decidiu alterar a formacomo as versoes definidas
30 311 32-rc1
Agora sao 2 numeros + 1
Porem em termos praticos a versao 2640 == 30
14 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels monolıticos x Micro Kernels
O desenvolvimento de sistemas operacionais e marcado porduas escolas que sao
Kernels MonolıticosMicro Kernels
(a) Micro Kernel (b) Kernel Monolıtico unico espaco deenderecamento
15 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels monolıticos x Micro Kernels
O desenvolvimento de sistemas operacionais e marcado porduas escolas que sao
Kernels MonolıticosMicro Kernels
(a) Micro Kernel (b) Kernel Monolıtico unico espaco deenderecamento
15 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum
Implementado como varios processos
Diferentes binarios e espacos de enderecamentoComunicacao via IPC (lento)
Faz uso extensivo do conceito de servidores onde apenaspoucos servicos devem rodar em modo privilegiado
Desvantagens teoricamente robusto porem complexo de sedesenvolverExemplos Minix e Symbian
16 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Kernels Monolıticos
Unico espaco de enderecamento
Unico processo executante
Mais facil de implementar comunicacao rapida e facilidade deutilizacao (funcoes sao globais)
Desvantagem Mais suscetıvel a crashesExemplos BSD Windows Linux
17 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Caracterısticas do Kernel Linux
Linux Monolıtico mas modular
O Linux e considerado um Kernel monolıtico Porem eleimplementa diversas ideias do mundo ldquoMicro Kernelrdquo
Projeto modular
Ser preemptıvel
Possibilita o carregamento de modulos binarios dinamicamente
Ou seja o projeto do Linux e baseado no melhor dos dois mundos
18 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa ))
outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Diferente nao difıcil
Muitas pessoas tem uma visao que o desenvolvimento paraKernel Linux e bastante difıcil
Todavia grande parte dessa ldquodificuldaderdquo reside no fato dasdiferencas existentes no modo de programacao entre Kernelspace e User space
Algumas diferencas sao obvias (o kernel pode fazer qualquercoisa )) outras nem tao obvias
Vamos ver algumas das principais diferencas
19 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
A libc e a biblioteca padrao em user space
Ela fornece as implementacao de grande parte das funcoesdisponıveis
Porem ela nao pode ser utilizada em kernel space por diversasrazoes
VelocidadeTamanhoProblema do Ovo e da Galinha )
Quais as consequencias
Funcoes como printf e scanf malloc calloc nao estao disponıveis
20 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Libc e cabecalhos C padrao
Como discutido o kernel nao prove funcoes da libc poremalgumas funcoes substitutas sao disponibilizadasAs assinaturas de tais funcoes sao armanezadas no diretorioinclude na arvore do kernel
A funcao printk
A funcao printk possibilita a impressao de uma mensagem na telaprintk(LOG LEVEL ldquoMensagem e formatadoresrdquo vars)
KERN EMERG
KERN ALERT
KERN INFO
21 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic
No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Sem protecao de memoria
O que acontece quando em nıvel de aplicacao tentamos acessaruma area invalida de memoria (ex deferenciar um ponteiro nulo)
O tao famoso segmentation fault
Em termos tecnicos o kernel captura o acesso indevido elanca um sinal SIGSEGV mantando o processo
Porem voltamos para o problema do ovo e da galinha Isso seriapossıvel de ser feito no kernel
Quais as consequencias de um acesso invalido de memoria
No melhor dos casos um kernel panic No pior uma brecha deseguranca
22 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Diferencas entre desenvolvimento para Kernel e User space
Memoria sem paginacao
Memoria virtual e paginacao e um poderoso recurso degerencia de memoriaPossibilita que aplicacoes facam uso de mais memoria que amemoria fısica disponıvel alocando as ldquopaginasrdquo maisacessadas na memoria principal e mandando o restante para odisco
Se esse conceito tambem valer para o Kernel o que acontece se obloco de memoria contendo instrucoes que efetuam a gerencia dememoria for ldquopor acasordquo enviado para o disco
Qual a solucao
Manter todo o bloco de memoria do Kernel alocado em memoriafisica Sendo assim cada byte de memoria no Kernel e precioso
23 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo o Kernel Linux
24 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 versao do kernel disponıvel emkernelorg ou via pacotes de distribuicoes
Baixando uma versao de desenvolvimento via git
25 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando os pacotes basicos
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l b u i l dminuse s s e n t i a l l i b g t k 2 0minusdev l i b g l i b 20minusdev l i b g l a d e 2minusdev l i b n c u r s e s 5minusdev
Apos a instalacao dos pacotes basicos necessarios a compilacaodevemos obter e compilar o kernel propriamente dito Para talpodemos seguir a opcao Linux-like ou Ubuntu-like
26 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e configurando o kernel (Linux-like)
Para obter o kernel Linux mais atual basta baixa-lo dehttpswwwkernelorg
Apos o download podemos configura-lo de 3 maneirasdistintas
make menuconf igmake c o n f i gmeke g c o n f i g
Tambem e possıvel carregar configuracoes antigas via makeoldconfig
27 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Menu de configuracao
Vamos fucar um pouco )
28 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilando o kernel (Linux-like)
Para construir o kernel basta executar o seguinte comando
make [minus j n ]sudo make m o d u l e s i n s t a l l
O primeiro comando ira salvar um arquivo bzImage emarch[arquitetura]boot
O segundo comando ira salvar os modulos gerados emlibmodules
Apos isso devemos manualmente configurar o gerenciador de Boot(lilo ou grub) para carregar a nova imagem
29 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Baixando e instalando o kernel (Ubuntu-like)
O Ubuntu (assim como outras distribuicoes) oferece uma maneirapropria de baixar compilar e instalar um kernel
Apos a instalacao de uma versao limpa do Ubuntu diversospacotes sao necessarios antes da compilacao propriamente dita
aptminusg e t i n s t a l l l i n u xminuss o u r c e minus3130 k e r n e lminuspackagef a k e r o o t
Apos a instalacao deve ser descompactado e criado um linkligando o diretorio do kernel para usrsrclinux
t a r minusx v f l i n u xminuss o u r c e minus3 1 3 0 t a r bz2l n minuss l i n u xminuss o u r c e minus3130 u s r s r c l i n u x
30 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Reutilizando arquivo de configuracao
A proxima etapa e a copia do arquivo de configuracao para odiretorio base do kernel
cp boot c o n f i g minuslsquouname minusr lsquo u s r s r c l i n u x c o n f i g
Por fim deve-se entrar no diretorio do codigo do kernel eexecutar o menu para visualizacao das opcoes
31 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Compilacao )
Limpar diretorio antes da compilacao
makeminuskpkg c l e a n
Compilando
f a k e r o o t makeminuskpkg minusminus i n i t r d minusminusappendminustominusv e r s i o n=minuscustom k e r n e l i m a g e k e r n e l h e a d e r s
Caso fosse realizada a compilacao generica so seria necessario aexecucao do comando make
32 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
Instalando
Por fim basta instalar os arquivos deb que foramarmazenados na pasta usrsrc
dpkg minus i lowast 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Obtendo e Compilando o Kernel Linux
A estrutura de diretorios do kernel
Composta por 5 blocos
Includes
Documentacao
Scripts
Exemplos (samples)
Implementacoes (net arch init block crypt etc)
34 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Controle de Versao Git
35 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Trata-se de um sistema de controle de versao distribuıdo
O Git foi inicialmente projetado e desenvolvido por LinusTorvalds para o desenvolvimento do nucleo do Linux porematualmente ele e amplamente utilizado para os mais diversospropositos
Nao ha a ideia de repositorio central como no CVS ou SVNmas sim diversas arvores distribuıdas onde uma elas podemfazer push e pull uma das outras
Ideal para montarmos um repositorio local sem a necessidadede instalacao (a criacao de um repositorio leva apenas 1comando)
36 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
A Ferramenta de Gerencia de Codigo Git
Foco na criacao de branches realizacao de merges e geracaode diffs entre diferentes pontos da arvore
37 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Instalando e configurando o git
aptminusg e t i n s t a l l g i tg i t c o n f i g minusminusg l o b a l u s e r name Nome
g i t c o n f i g minusminusg l o b a l u s e r e m a i l emaildominiocom
38 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Criando nosso primeiro repositorio
Para criacao de um repositorio precisamos de apenas um comando)
$ mkdir r ep o$ cd r e p o$ g i t i n i t
Apos a inicializacao do repositorio precisamos apenas adicionar osarquivos 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 minusa
39 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
branches diffs checkouts merges stashes logs
g i t branch l i s t a b r a n c h e sg i t branch nome c r i a uma branchg i t c h e c k o u t nome da branch a l t e r n a e n t r e b r a n c h e sg 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 og i t merge a t u a l i z a uma branch com base em o u t r a sg i t r e s e t minusminushard HEADˆ remove o u l t i m o commitg i t l o g l i s t a t o d o s os commits r e a l i z a d o sg i t a r c h i v e minusminusfo rmat t a r gz minusminusoutput a r q u i v o t a r gz
branch name minusvg i t rm f i l e remove um a r q u i v o da a r v o r eg i t mv f i l e renomeia um a r q u i v o da a r v o r e
Vamos praticar um pouco Inicializem um projeto e realizemdiversas alteracoes fazendo uso das opcoes disponıveis acima
40 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
A Ferramenta de Gerencia de Codigo Git
Clonando uma arvore git
Ate agora vimos como criar modificar e manipular orepositorio de diversas maneiras
Porem como obtemos um codigo de outra pessoa
Devemos fazer uso do comando git clone
g i t c l o n e g i t edenminusf e e d e r g abdn ac uk d c c p e x pmy dccp
41 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Criando patches com o Git
Apos criarmos fazermos nossas modificacoes chegou a hora degerarmos o patch para submissao
Para isso fazemos uso do comando git format-patch
g i t formatminuspatch [ o b j e c t i d ou branch name ] minusminuss t d o u t gtp patch
g i t formatminuspatch [ o b j e c t i d ou branch name ]g i t formatminuspatch minuss [ o b j e c t i d ou branch name ]
O primeiro comando ira gerar uma unica saıda enquanto que osegundo cria varios arquivos de saıda (um para cada commit)
42 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Checando os patches com checkpatchpl
Apos criamos nossos patches temos de verificar se eles estaodentro do estilo de codigo adotado no kernel linux (80 colunassem espacos antes do tab sem espacos no final da linha etc)
s c r i p t s c h e c k p a t c h p l [ a r q u i v o patch ]
Este comando ira listar todos os problemas de estilo existentesno codigo
Antes de ser submetido todos os problemas devem serresolvidos
43 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Estrutura do patch
O patch gerado e dividida em 5 partes distintas
Cabecalho do email
Descricao do patch
Assinaturas
Sumario das alteracoes
Patch propriamente dito
44 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Assinaturas
A assinatura tem por objetivo possibilitar um rastreio daautoria das alteracoes realizadas
Em geral o codigo e revisto por diversos desenvolvedores atechegar na arvore do kernel
Tambem serve como uma declaracao por parte do autor deque esta disponibilizando o codigo como open-source
Uma forma de eternizar o autor )
Signed-off-by Autor 1 ltrandomdeveloperexampleorggt
Outras entradas possıveis Ack-by e Cc Reported-by eTested-by
45 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Curiosidade porque utilizar o signoff
Em meados de 2003 uma empresa chamada SCO comecou aquestionar a autoria de diversos codigos do kernel Linux em virtudedela possuir contratos com a IBM que na epoca fez a doacao decodigos para open source A empresa afirmava que trechos decodigo do Unix V estavam incorporados ao LinuxForam iniciados uma serie de processos envolvendo a SCO ediversas empresas como IBM Red Hat Novell etc onde foicomprovado que a SCO estava errada )httpenwikipediaorgwikiTimeline_of_SCO-Linux_
controversies
46 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Ultimo teste antes do envio
Antes de realizar o envio do patch e recomendavel tentaraplicar o patch em uma arvore limpa de modo a verificar sealgum erro inesperado ira acontecer
A ideia e tentar reproduzir o procedimento de quem ira aplicaro patch a arvore
g i t a p p l y minusminuss t a t lowast patch Sumar io de m o d i f i c a c o e sg i t a p p l y minusminuscheck lowast patch Checagem por e r r o sg i t am minusminuss i g n o f f lowast patch A p l i c a c a o do patch
47 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 atraves deemails para listas de discussoes especıficas
Existem diversas listas disponıveis em vgerkernelorgalsa-devel autofs ceph-devel dccp netdev etc Escolhaa correspondente e a lista com um nıvel acima
ex dccp e netdev
Regras basicas email sem formatacao e sem anexos Ocodigo ira no corpo do email
Dica final se possıvel envie o patch para que outras pessoas daruma olhada antes do envio propriamente dito
48 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Criando e aplicando patches com o Git
Atividade gerenciando o codigo com git
O objetivo desta atividade e a pratica da gerencia de codigoutilizando o git
Configure as propriedades de usuario e email
Iniciar um repositorio na arvore do kernel
Adicionar os arquivos no repositorio e realizar primeiro commit
Criar uma branch com nome ldquotesterdquo e realizar alguns commitcom diferentes modificacoes
Verificar a diferenca entre o branch atual e a master
Voltar para a branch master e realizar um merge dasmodificacoes
Preparar um patch de envio
Tempo da atividade 15 - 20 minutos49 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Criando modulos para o Kernel
50 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Configurando ambiente de teste
Finalmente chegou a hora de rodarmos o nosso primeiromodulo
O mais simples dos modulos deve oferecer duasfuncionalidades basicas Carregamente e descarregamentodo modulo
51 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
i n c l u d e lt l i n u x i n i t hgti n c l u d e lt l i n u x module hgtMODULE LICENSE(GPL ) s t a t i c i n t h e l l o i n i t ( v o i d )p r i n t k (KERN ALERT Hello worldn ) r e t u r n 0 s t a t i c v o i d h e l l o e x i t ( v o i d )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 ) m o d u l e e x i t ( h e l l o e x i t )
52 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
O modulo Hello World
As macros module init e module exit sao responsaveis porindicar quais funcoes irao carregar e descarregar o modulo
No exemplo apresentado o modulo exibe apenas umamensagem na abertura e no descarregamento do modulo
53 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Compilando
A forma de compilar modulos do Kernel e um pouco diferenteda compilacao normal de uma aplicacao C
O primeiro passo e contruir o arquivo Makefile
Nosso arquivo Makefile
objminusm = h e l l o o
ou
objminusm = module omoduleminuso b j s = f i l e 1 o f i l e 2 o
Compilacao make -C usrsrclinux M=lsquopwdlsquo modules54 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Executando
Insercao remocao listagem
insmod h e l l o ko I n s e r e modulolsmod L i s t a modulosrmmod h e l l o Remove modulo
Onde sao exibidas as mensagens provenientes do Kernel
Mensagens impressas via funcao printk tem dois direcionamentos
varlogsyslog
dmesg
55 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Entendendo o funcionamento de um modulo
Funcoes init e exit servem apenas para alocacao de recursose registro de servicos atraves de callbacks Um bomexemplo e o registro de novos protocolos de transporte
Modulos apenas provem servicos Nao sao entidades ativas
Por ser um nucleo preemptıvel o modulo deve suportarconcorrencia (race conditions)
56 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
O modulo Hello World
Adicionando o modulo como uma nova opcao
Para adicionar o modulo no menuconfig deve-se adicionar a arvoredo kernel e editar arquivos Makefile e Kconfig (tanto do moduloquanto do nıvel acima)
K c o n f i g c o n f i g HELLO BUILDTIN EXAMPLEt r i s t a t e Modulo exemplo Hello World
depends on INETminusminusminushe lpminusminusminusE s t e modulo tem o b j e t i v o puramente e x p e r i m e n t a l
M a k e f i l e objminus$ (CONFIG HELLO BUILDTIN EXAMPLE) = h e l l o b u i l t i n
o
57 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Como funcionam as callbacks em C
Em C o endereco de uma funcao e acessıvel ao programadoratraves de uma variavel do tipo ponteiro para funcao
A partir desse mecanismos torna-se possıvel abstrair qualimplementacao sera executada de maneira semelhante apolimorfismo
s t r u c t opr i n t v a l u e 1 i n t v a l u e 2 i n t (lowast o p e r a t i o n ) ( i n t i n t )
58 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL
59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
A tabela de sımbolos do Kernel
Todo modulo ao ser desenvolvido tem acesso a um conjuntode sımbolos disponibilizados pelo KernelSımbolos podem ser tanto variaveis quanto funcoes (ex afuncao printk)Analogia a sımbolos exportados de uma lib dinamicaUm problema comum e a tentativa de utilizacao de sımbolosnao definidosnao visıveis
Como exportar sımbolos de um modulo
EXPORT SYMBOL( name ) EXPORT SYMBOL GPL( name )
EXPORT SYMBOL GPL limita a exportacao a GPL59 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Licensiamento de modulos
Modulos podem ser registrados sob diferentes licensas utilizando amacro MODULE LICENSE
GPL
GPL v2
GPL and additional rights
Dual BSDGPL
Dual MPLGPL
Proprietary
Um modulo e considerado proprietario ate segunda ordem
60 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
A funcao init serve para aquisicao de recursos do modulo(memoria locks em dispositivos registros de protocolos etc)
Porem o que acontece se um dos recursos nao pode serobtido
Duas opcoes
Continuar a execucao com funcionalidades reduzidas
Cancelar a inicializacao do modulo
Neste sentido qual seria a abordagem mais adequada para fazeressa manipulacao de erros
61 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Manipulacao de erros durante a inicializacao
Qual seria uma solucao elegante para a liberacao de recursos jaalocados
i n t i n i t minha funcao ( v o i d )
i n t e r r lowast r e g i s t r a t i o n t a k e s a p o i n t e r and a name lowaste r r = r e g i s t e r t h i s ( pt r1 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 ( pt r2 skull ) i f ( e r r ) goto f a i l t h a t
r e t u r n 0 lowast s u c c e s s lowastf a i l t h a t u n r e g i s t e r t h i s ( pt r1 skull ) f a i l t h i s r e t u r n e r r lowast p r o p a g a t e t h e e r r o r lowast
62 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Parametro de inicializacao
Muitas vezes precisamos passas configuracoes especıficas aomodulo que vai ser inicializado
Exemplos
Ativacao ou desativacao do debug
Configuracoes especıficas de protocolos
Configuroes de modulos de dispositivos etc
Para esta tarefas duas funcoes estao associadas module param(ou module param array) e MODULE PARM DESC
63 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Adicionando parametros de inicializacao
Sintaxe module param(parametro tipo permissao)
s t a t i c c h a r lowastwhom = world s t a t i c i n t howmany = 1 module param ( howmany i n t S IRUGO ) module param (whom charp S IRUGO | S IWUSR ) m o d u l e p a r a m a r r a y ( v e t o r i n t amp v e t o r s i z e S IRUGO |
S IWUSR )
Parametro variavel a ser utilizada (deve ser static)
Tipo Tipo da variavel a ser exportada (bool charp intlong short etc)
Caso seja informado um numero maior de valores do que otamanho do vetor e lancado um erro e a inicializacao do modulo eabortada
64 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes dos modulos
O terceiro parametro tem por objetivo definir como o valorexportado sera visıvel apos a inicializacao
Os valores dos parametros serao disponibilizados emsysmoduleltnome modulogtparameters
Cada parametro sera armazenado em um arquivo especıficos
E possıvel definir todas as permissoes possıveis para umarquivo
65 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Permissoes possıveis
d e f i n e S IRWXU 00700d e f i n e S IRUSR 00400d e f i n e S IWUSR 00200d e f i n e S IXUSR 00100
d e f i n e S IRWXG 00070d e f i n e S IRGRP 00040d e f i n e S IWGRP 00020d e f i n e S IXGRP 00010
d e f i n e S IRWXO 00007d e f i n e S IROTH 00004d e f i n e S IWOTH 00002d e f i n e S IXOTH 00001
66 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Um pouco mais sobre modulos
Atividade Criando modulos simples
Com base no apresentado vamos criar a seguinte escrutura demodulos
Criar 3 modulos chamados mod1 mod2 mod3 com seusrespectivos arquivos MakefileDeve ser criada uma dependencia de sımbolos (variaveis efuncoes) entre os modulos (mod1 =gt mod2 =gt mod3)Devem ser adicionados parametros para carregamento dosmodulos que incluam tanto valores editaveis quanto somenteleitura Alem disso deve ser verificado a possibilidade deescrita ou somente leituraDeve ser avaliado tanto a exportacao de sımbolos GPL paramodulos GPL quando para modulos nao-GPL
Tempo da atividade 10 - 15 minutos67 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Gerenciamento de memoria no Kernel
Em user-space estamos estamos habituados a tres funcoesbasicas para gerenciamento de memoria que sao malloccalloc e free
Todavia tais funcoes fazem parte da libc e portanto naoestao disponıveis
Vale lembrar que toda a memoria do nucleo e armazenada emmemoria fısica (sem memoria virtual)
Deste modo em nıvel de kernel as duas principais estrategiaspara gerencia da memoria que sao kmalloc e slab cache
68 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
kmalloc
Bastante semelhante a malloc e free
Possibilita a alocacao de blocos de memoria com base noargumento size
Uma peculiaridade e o fornecimento de flags que serve paracontrolar como o bloco de memoria sera alocado
i n c l u d e lt l i n u x s l a b hgtv o i d lowast k m a l l o c ( s i z e t s i z e i n t f l a g s ) k f r e e ( v o i d lowast)
69 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro size
Em espaco de usuario a alocacao e orientada a heap(abstracao de um bloco contınuo)
Em espaco de nucleo a alocacao e orientada a paginas dememoria (memoria segmentar)
kmalloc faz alocacao blocos de paginas ou seja o tamanhoalocado pode ser ligeiramente MAIOR que o tamanho solicitado
70 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Sobre o parametro flag
Define como o bloco de memoria sera alocado levando emconsideracao as paginas de memorias atualmente disponıveis
GFP ATOMIC a alocacao e realizada em alta prioridade(como handlers de interrupcao) e a acao nao sofre preempcao
GFP KERNEL maneira padrao de alocacao A acao epreemptıvel
GFP USER semelhante a GFP KERNEL porem alocado emespaco de usuario
Mais 13 tipos Porem GFP ATOMIC e GFP KERNEL saoutilizadas em quase todos os casos de maneira segura
71 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
kmalloc
Modo de uso
s t r u c t m y s t r u c t lowast t = NULL t = ( s t r u c t m y s t r u c t ) k m a l l o c ( s i z e o f ( s t r u c t m y s t r u c )
GFP KERNEL) i f ( t )
Nao c o n s e g u i u 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo
terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
slab cache
A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais
Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto
Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado
Qual seria uma possıvel solucao
Criar um procedimento que encapsule a criacao de objetos
Para esta funcionalidade o kernel prove o Slab
73 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Arquitetura Slab
Cria um pool de blocos de memoria
Otimizado para criar objetos do mesmo tipo
Sao definidas quatro funcoes associadas a alocacaodesalocacao deblocos de memoria utilizando Slab
kmem cache create
kmem cache alloc
kmem cache free
kmem cache destroy
74 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Rotinas associadas
75 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
A funcao kmem cache create
kmem cache t lowast kmem cache create ( c o n s t c h a r lowastname s i z e t s i z e s i z e t o f f s e t u n s i g n e d l o n g f l a g s
v o i d (lowast c o n s t r u c t o r ) ( v o i d lowast)
name Nome da estrutura (sem espacos em branco)
offset Deslocalmento desde o comeco da pagina de memoriaUsado para alinhamentos especıficos (normalmente zero)
flags Controla como a alocacao sera realizada (normalmenteusa-se o valor SLAB HWCACHE ALIGN pois ira alinhar amemoria seguindo a arquitetura da maquina)
constructor utilizados para contrucao personalizada deobjetos complexos (e aceito NULL)
76 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Exemplo alocacao via slab
s t r u c t m y s t r u c t lowastlowast m = ( s t r u c t m y s t r u c t lowastlowast) k m a l l o c (num elementos lowast s i z e o f ( s t r u c t m y s t r u c t lowast) GFP KERNEL)
m y s t r u c t c a c h e = kmem cache create (my_struct_cache s i z e o f ( s t r u c t m y s t r u c t ) 0 SLAB HWCACHE ALIGN NULL)
i f ( m y s t r u c t c a c h e )r e t u r n minusENOMEM
f o r ( i lt num elementos i ++)
m[ i ] = k m e m c a c h e a l l o c ( m y s t r u c t c a c h e GFP KERNEL)
77 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
slab cache
Atividade Alocando objetos com kmalloc e slab
Nesta atividade iremos praticar a criacao alocacao e liberacao derecursos utilizando kmalloc e slab
Criar 1 modulo que receba como parametro de inicializacao onumero de objetos a serem alocados
Deve-se definir uma struct que possua pelo menos 2 elementos
A partir do numero de objetos deve-se construir um array ecada posicao do array deve ser alocado
Metade dos elementos deve ser alocado via kmalloc e a outrametade via
Deve ser implementado o processo de desalocacao dos objetosda maneira apropriada
Tempo da atividade 15 - 20 minutos78 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
79 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
O uso de estruturas de dados no Kernel
O Kernel assim como qualquer software faz uso massivo deestruturas de dados de modo a armazenar seus dados dado emruntimeSendo assim afim de evitar que o desenvolvedor tenha decriar suas proprias estruturas a cada desenvolvimento foramdesenvolvidas algumas estruturas de dados basica que podemser reutilizadas
Sao elas
Linked listsQueuesMapsBinary trees
A seguir daremos um enfoque nas listas ligadas )80 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas ligadas (Linked Lists)
E a estrutura de dados mais simples e comum encontrada noKernel
Diferentemente de um array e uma estrutura expansıvel
Faz uso do conceito de nos que apontam para outros nos
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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas simples
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast p o i n t e r to t h e n e x t
e l em e n t lowast
82 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas duplamente ligadas
s t r u c t l i s t e l e m e n t v o i d lowast data lowast t h e p a y l o a d lowasts t r u c t l i s t e l e m e n t lowast n e x t lowast n e x t e l e m e n t lowasts t r u c t l i s t e l e m e n t lowast p r e v lowast p r e v i o u s e l e m en t lowast
83 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Conceitos
Listas circulares simples
Figura Lista circular simples
Figura Lista circular duplamente ligada
84 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
Em geral as implementacoes de listas ligadas sao feitastornando a carga util um elemento da lista
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g para2 b o o l param3 s t r u c t m y s t r u c t lowast n e x t s t r u c t m y s t r u c t lowast p r e v
Ao inves disso a implementacao do kernel adiciona a lista ligada aestrutura de carga util
85 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
A implementacao do Kernel
s t r u c t m y s t r u c t u n s i g n e d l o n g param1 u n s i g n e d l o n g param2 b o o l 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 emlinuxlisth
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 lowast n e x ts t r u c t l i s t h e a d lowast p r e v
86 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria 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 necessaria a existencia de uma macro para inicializacaoda lista
Porque e necessaria a alocacao da memoria para o primeiroelemento list head
87 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Definindo uma lista ligada
s t r u c t m y s t r u c t lowast p a y l o a d p a y l o a d = k m a l l o c ( s i z e o f (lowast p a y l o a d ) GFP KERNEL) pay loadminusgtparam1 = 4 0 pay loadminusgtparam2 = 6 pay loadminusgtparam3 = f a l s e INIT LIST HEAD(amp pay loadminusgt l i s t )
Se estivessemos trabalhando com elementos estaticos criarıamos daseguinte maneira
s t r u c t m y s t r u c t p a y l o a d = param1 = 40 param2 = 6 l i s t = INIT LIST HEAD ( p a y l o a d l i s t )
88 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Forma alternativa
Na estrutura criada nao e feita nenhuma diferenciacao entrequal elemento e a ldquocabecardquo da lista
Porem 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 estatico list head
89 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Funcoes para adicionar elementos na lista
Existem basicamente dois metodos para insercao de elementos dalista
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 m y s t r u c t lowast e l em e n t = Objeto a l o c a d o e com
os p a r a m e t r o s s e t a d o sl i s t a d d (amp elementminusgt l i s t amphead )
90 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Algumas outras funcoes para manipulacao
list del
list del init
list move
list move tail
list empty checa se a lista esta vazia
Mas afinal como recuperamos a carga util tendo referencia apenasao list head
Fazemos uso da funcao 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
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Curiosidade o funcionamento da funcao list entry
Trata-se de uma macro que consegue obter o endereco daestrutura externa a partir de um elemento interno
Faz uso do deslocamento (offset) apresentado pelo elementointerno em relacao a estrutura externa
d e f i n e l i s t e n t r y ( pt r type member ) ( c o n s t t y p e o f ( ( ( t y p e lowast) 0)minusgtmember ) lowast m p t r = ( p t r ) ( t y p e lowast) ( ( c h a r lowast) m p t r minus o f f s e t o f ( type member ) ) )
92 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam aiteracao 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 lowastp s t r u c t m y s t r u c t lowast f l i s t f o r e a c h ( p amphead )
lowast f aponta para a c a r g a u t i l dos e l e m e n t o s lowastf = l i s t e n t r y ( p s t r u c t m y s t r u c t l i s t )
93 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Atividade 3 trabalhando com listas ligadas
Iremos trabalhar nesta atividade no processo de criacao e utilizacaode listas ligadas
Em um dos modulos criados na secao 1 adicione rotinas quecriem populem iterem e realizem delecao sobre uma lista
A estrutura deve ser definida em um arquivo h bem como asrotinas do modulo
Tempo da atividade 10 - 15 minutos
94 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia I
Jeremy AndrewsLinux Documenting how patches reach the kernelhttpkerneltraporgnode3180 Maio 2004
The Git Community BookThe git community bookhttpbookgit-scmcomindexhtml Outubro 2011
Ariejan de VroomHow to create and apply a patch with githttpariejannet20091026
how-to-create-and-apply-a-patch-with-git Outubro2009
95 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-
Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados
Linked list
Bibliografia II
Wikipedia FoudationSco-linux controversieshttp
enwikipediaorgwikiSCO-Linux_controversiesOutubro 2011
96 96 Ivo Calado IFAL
Programacao para o Kernel Linux (Parte 1)
- Introduccedilatildeo
-
- O que eacute um sistema operacional
- Linux
- Caracteriacutesticas do Kernel Linux
- Diferenccedilas entre desenvolvimento para Kernel e User space
-
- Montando o ambiente
-
- Obtendo e Compilando o Kernel Linux
- A Ferramenta de Gerecircncia de Coacutedigo Git
- Criando e aplicando patches com o Git
-
- Criando moacutedulos
-
- O moacutedulo Hello World
- Um pouco mais sobre moacutedulos
-
- Gerenciamento de Memoacuteria
-
- kmalloc
- slab_cache
-
- Estruturas de Dados
-
- Conceitos
- Linked list
-