114
Introdu¸c˜ ao Montando o ambiente Criandom´odulos Gerenciamento de Mem´oria Estruturas de Dados Programa¸c˜ ao para o Kernel Linux (Parte 1) Ivo Augusto Andrade Rocha Calado Instituto Federal de Educa¸c˜ ao, Ciˆ encia e Tecnologia de Alagoas 29 de Junho de 2014 1 / 96 Ivo Calado IFAL Programa¸c˜ ao para o Kernel Linux (Parte 1)

Programação para Kernel Linux - Parte 1

Embed Size (px)

DESCRIPTION

Tutorial sobre desenvolvimento para o Kernel Linux. Atualizei os slides com algumas modificações.

Citation preview

Page 1: Programação para Kernel Linux - Parte 1

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
Page 2: Programação para 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
Page 3: Programação para 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
Page 4: Programação para 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
Page 5: Programação para 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
Page 6: Programação para 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
Page 7: Programação para 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
Page 8: Programação para 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
Page 9: Programação para 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
Page 10: Programação para 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
Page 11: Programação para 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
Page 12: Programação para 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
Page 13: Programação para 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
Page 14: Programação para 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
Page 15: Programação para 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
Page 16: Programação para 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
Page 17: Programação para 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
Page 18: Programação para 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
Page 19: Programação para 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
Page 20: Programação para 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
Page 21: Programação para 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
Page 22: Programação para 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
Page 23: Programação para 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
Page 24: Programação para 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
Page 25: Programação para 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
Page 26: Programação para 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
Page 27: Programação para 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
Page 28: Programação para 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
Page 29: Programação para 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
Page 30: Programação para 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
Page 31: Programação para 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
Page 32: Programação para 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
Page 33: Programação para 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
Page 34: Programação para 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
Page 35: Programação para 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
Page 36: Programação para 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
Page 37: Programação para 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
Page 38: Programação para 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
Page 39: Programação para 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
Page 40: Programação para 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
Page 41: Programação para 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
Page 42: Programação para 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
Page 43: Programação para 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
Page 44: Programação para 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
Page 45: Programação para 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
Page 46: Programação para 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
Page 47: Programação para 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
Page 48: Programação para 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
Page 49: Programação para 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
Page 50: Programação para 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
Page 51: Programação para 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
Page 52: Programação para 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
Page 53: Programação para 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
Page 54: Programação para 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
Page 55: Programação para 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
Page 56: Programação para 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
Page 57: Programação para 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
Page 58: Programação para 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
Page 59: Programação para 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
Page 60: Programação para 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
Page 61: Programação para 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
Page 62: Programação para 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
Page 63: Programação para 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
Page 64: Programação para 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
Page 65: Programação para 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
Page 66: Programação para 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
Page 67: Programação para 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
Page 68: Programação para 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
Page 69: Programação para 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
Page 70: Programação para 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
Page 71: Programação para 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
Page 72: Programação para 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
Page 73: Programação para Kernel Linux - Parte 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
Page 74: Programação para Kernel Linux - Parte 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
Page 75: Programação para Kernel Linux - Parte 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
Page 76: Programação para Kernel Linux - Parte 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
Page 77: Programação para 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
Page 78: Programação para 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
Page 79: Programação para 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
Page 80: Programação para 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
Page 81: Programação para 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
Page 82: Programação para 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
Page 83: Programação para 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
Page 84: Programação para 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
Page 85: Programação para 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
Page 86: Programação para 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
Page 87: Programação para Kernel Linux - Parte 1

Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados

slab cache

slab cache

A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais

Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo

terıamos de nospreocupar em configurar o tamanho para cada novo objeto

Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado

Qual seria uma possıvel solucao

Criar um procedimento que encapsule a criacao de objetos

Para esta funcionalidade o kernel prove o Slab

73 96 Ivo Calado IFAL

Programacao para o Kernel Linux (Parte 1)

Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados

slab cache

slab cache

A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais

Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto

Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado

Qual seria uma possıvel solucao

Criar um procedimento que encapsule a criacao de objetos

Para esta funcionalidade o kernel prove o Slab

73 96 Ivo Calado IFAL

Programacao para o Kernel Linux (Parte 1)

Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados

slab cache

slab cache

A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais

Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto

Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado

Qual seria uma possıvel solucao

Criar um procedimento que encapsule a criacao de objetos

Para esta funcionalidade o kernel prove o Slab

73 96 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
Page 88: Programação para Kernel Linux - Parte 1

Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados

slab cache

slab cache

A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais

Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto

Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado

Qual seria uma possıvel solucao

Criar um procedimento que encapsule a criacao de objetos

Para esta funcionalidade o kernel prove o Slab

73 96 Ivo Calado IFAL

Programacao para o Kernel Linux (Parte 1)

Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados

slab cache

slab cache

A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais

Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto

Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado

Qual seria uma possıvel solucao

Criar um procedimento que encapsule a criacao de objetos

Para esta funcionalidade o kernel prove o Slab

73 96 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
Page 89: Programação para Kernel Linux - Parte 1

Introducao Montando o ambiente Criando modulos Gerenciamento de Memoria Estruturas de Dados

slab cache

slab cache

A abordagem utilizando kmalloc e voltada para criacao deobjetos individuais

Porem e se fossemos criar diversos objetos do mesmo tipo aolongo do ciclo de vida de um modulo terıamos de nospreocupar em configurar o tamanho para cada novo objeto

Exemplo um objeto sk buff e criado todas as vezes que umpacote de dados e recebido ou enviado

Qual seria uma possıvel solucao

Criar um procedimento que encapsule a criacao de objetos

Para esta funcionalidade o kernel prove o Slab

73 96 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
Page 90: Programação para 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
Page 91: Programação para 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
Page 92: Programação para 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
Page 93: Programação para 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
Page 94: Programação para 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
Page 95: Programação para 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
Page 96: Programação para 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
Page 97: Programação para 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
Page 98: Programação para 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
Page 99: Programação para 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
Page 100: Programação para 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
Page 101: Programação para 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
Page 102: Programação para 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
Page 103: Programação para 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
Page 104: Programação para 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
Page 105: Programação para 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
Page 106: Programação para 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
Page 107: Programação para 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
Page 108: Programação para 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
Page 109: Programação para 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
Page 110: Programação para 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
Page 111: Programação para 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
Page 112: Programação para 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
Page 113: Programação para 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
Page 114: Programação para 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