You are on page 1of 107

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Programa c ao para o Kernel Linux (Parte 1)


Ivo Augusto Andrade Rocha Calado
Instituto Federal de Educa c ao, Ci encia e Tecnologia de Alagoas

30 de Janeiro de 2013

1 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Sobre o palestrante
Titula c ao: Graduado em Ci encia da Computa c ao pela UFAL Mestre em Ci encia da Computa c ao pela UFCG Doutorando em Engenharia El etrica pela UFCG Email: ivo.calado@ee.ufcg.edu.br ivo.augusto@ifalpalmeira.edu.br ou Site: https://sites.google.com/a/ee.ufcg.edu.br/ivocalado/

2 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Experi encia com o Linux

Contato com Linux desde 2004 Utiliza o Linux como principal SO desde 2006 Contribui com o Kernel Linux a partir do desenvolvimento de algoritmos de controle de congestionamento no protocolo DCCP
CCID-4 e CCID-5

3 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

E sobre voc es?...

Qual a experi encia com sistemas operacionais? ... E com o Linux? Apenas usu ario dom estico ou um pouco mais? Quem j a fu cou e/ou compilou o kernel? Qual o conhecimento sobre a linguagem de programa c ao C, Redes de computadores, Estruturas de Dados e Sistemas Operacionais

4 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Objetivo do curso

Mostrar o que e e como o Kernel Linux est a organizado Apresentar uma vis ao geral sobre a programa c ao para o Kernel Linux
Quais as etapas necess arias para para implementa c ao de m odulos? Que ferramentas auxiliam no processo de cria c ao e submiss ao de patches?

Muita m ao na massa! :)

5 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Agenda I
1

Introdu c ao O que e um sistema operacional? Linux Caracter sticas do Kernel Linux Diferen cas entre desenvolvimento para Kernel e User space Montando o ambiente Obtendo e Compilando o Kernel Linux A Ferramenta de Ger encia de C odigo Git Criando e aplicando patches com o Git Criando m odulos O m odulo Hello World Um pouco mais sobre m odulos
Ivo Calado IFAL

6 / 89 Programa c ao para o Kernel Linux (Parte 1)

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Agenda II
4

Gerenciamento de Mem oria kmalloc slab cache

Estruturas de Dados Conceitos Linked list

7 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Observa c ao sobre este material

Este material e derivado de diversos trabalhos livremente dispon veis na Internet

8 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

O que e um sistema operacional?

O que e um sistema operacional?


O que viria a ser um sistema operacional? Uma m aquina estendida? Um gerenciador de recursos?

9 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

O que e um sistema operacional?

O que e um sistema operacional?


O que viria a ser um sistema operacional? Uma m aquina estendida? Um gerenciador de recursos? Ambos! Atribui c oes de um SO Gerenciamento de processos Gerenciamento de mem oria Gerenciamento de dispositivos Sistemas de arquivos Entrada e sa da de dados
9 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

O que e um sistema operacional?

Arquitetura de um sistema operacional

10 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

O que e um sistema operacional?

Arquitetura de um sistema operacional


Dois espa cos de endere camento Espa co de Usu ario (User-space) Espa co de Kernel (Kernel-space) Tr es componentes b asicos System calls: engloba um conjunto de fun c oes disponibilizadas pelo sistema operacional para prover servi cos N ucleo: engloba mecanismos respons aveis pelas ger encia de mem oria, processos, sistemas de arquivos, abstra c oes de acesso a hardware etc Device Drivers: fornecem implementa c oes que proporcionam acesso a diversos mecanismos de hardware
11 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linux

GNU, Linux ou GNU/Linux


Qual a diferen ca entre Linux e GNU/Linux?

12 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linux

GNU, Linux ou GNU/Linux


Qual a diferen ca entre Linux e GNU/Linux? Linux: n ucleo do SO (e para alguns considerado o SO) Ferramentas GNU: conjunto de ferramentas como compiladores, editores de texto, linguagem bash etc

12 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linux

GNU, Linux ou GNU/Linux


Qual a diferen ca entre Linux e GNU/Linux? Linux: n ucleo do SO (e para alguns considerado o SO) Ferramentas GNU: conjunto de ferramentas como compiladores, editores de texto, linguagem bash etc A controv ersia sobre o nome Existe uma grande controv ersia sobre o nome correto do SO. Um grupo de usu arios, em especial desenvolvedores GNU, armam que o nome correto e GNU/Linux. Por outro lado, outro grupo encabe cado por Linus Torvalds preferem simplesmente Linux Em termos pr aticos, do ponto de vista de um usu ario o SO == GNU + Linux
12 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linux

Versionamento
Durante muito tempo foi utilizado a nota c ao baseada em 3 n umeros + 1 adicional

Segundo um dos mantenedores do Linux, Willy Tarreau, a nota c ao parece muito mais um endere co IP que um n umero de vers ao
13 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linux

Versionamento
Em vista da situa c ao apresentada, e tamb em para comemorar os 20 anos do Linux, Linus Torvalds decidiu alterar a forma como as vers oes denidas

3.0, 3.1.1, 3.2-rc1, ...


Agora s ao 2 n umeros + 1 Por em, em termos pr aticos a vers ao 2.6.40 == 3.0

14 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Caracter sticas do Kernel Linux

Kernels monol ticos x Micro Kernels


O desenvolvimento de sistemas operacionais e marcado por duas escolas que s ao
Kernels Monol ticos Micro Kernels

(a) Micro Kernel

(b) Kernel Monol tico: u nico espa co de endere camento


Ivo Calado IFAL

15 / 89 Programa c ao para o Kernel Linux (Parte 1)

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Caracter sticas do Kernel Linux

Micro Kernels
Possui como mais conhecido defensor Andrew Tanenbaum Implementado como v arios processos Diferentes bin arios e espa cos de endere camento. Comunica c ao via IPC (lento) Faz uso extensivo do conceito de servidores, onde apenas poucos servi cos devem rodar em modo privilegiado Desvantagens: teoricamente robusto por em complexo de se desenvolver Exemplos: Minix e Symbian
16 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Caracter sticas do Kernel Linux

Kernels Monol ticos

Unico espa co de endere camento Unico processo executante Mais f acil de implementar, comunica c ao r apida e facilidade de utiliza c ao (fun c oes s ao globais) Desvantagem: Mais suscet vel a crashes Exemplos: BSD, Windows, Linux*

17 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Caracter sticas do Kernel Linux

Linux: Monol tico mas modular

O Linux e considerado um Kernel monol tico. Por em ele implementa diversas ideias do mundo Micro Kernel: Projeto modular Ser preempt vel Possibilita o carregamento de m odulos bin arios dinamicamente Ou seja, o projeto do Linux e baseado no melhor dos dois mundos

18 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Diferen cas entre desenvolvimento para Kernel e User space

Diferente, n ao dif cil

Muitas pessoas tem uma vis ao que o desenvolvimento para Kernel Linux e bastante dif cil Todavia, grande parte dessa diculdade reside no fato das diferen cas existentes no modo de programa c ao entre Kernel space e User space Algumas diferen cas s ao obvias (o kernel pode fazer qualquer coisa! :))...

19 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Diferen cas entre desenvolvimento para Kernel e User space

Diferente, n ao dif cil

Muitas pessoas tem uma vis ao que o desenvolvimento para Kernel Linux e bastante dif cil Todavia, grande parte dessa diculdade reside no fato das diferen cas existentes no modo de programa c ao entre Kernel space e User space Algumas diferen cas s ao obvias (o kernel pode fazer qualquer coisa! :))... outras nem t ao obvias Vamos ver algumas das principais diferen cas...

19 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Diferen cas entre desenvolvimento para Kernel e User space

Libc e cabe calhos C padr ao


A libc e a biblioteca padr ao em user space Ela fornece as implementa c ao de grande parte das fun c oes dispon veis Por em ela n ao pode ser utilizada em kernel space por diversas raz oes:
Velocidade Tamanho Problema do Ovo e da Galinha! :)

Quais as consequencias? Fun c oes como printf e scanf, malloc, calloc n ao est ao dispon veis
20 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Diferen cas entre desenvolvimento para Kernel e User space

Libc e cabe calhos C padr ao


Como discutido, o kernel n ao prov e fun c oes da libc, por em algumas fun c oes substitutas s ao disponibilizadas As assinaturas de tais fun c oes s ao armanezadas no diret orio include na arvore do kernel A fun c ao printk A fun c ao printk possibilita a impress ao de uma mensagem na tela printk(LOG LEVEL Mensagem e formatadores!, vars...); KERN EMERG KERN ALERT KERN INFO ...
21 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Diferen cas entre desenvolvimento para Kernel e User space

Sem prote c ao de mem oria


O que acontece quando, em n vel de aplica c ao tentamos acessar uma area inv alida de mem oria (ex.: deferenciar um ponteiro nulo)?

22 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Diferen cas entre desenvolvimento para Kernel e User space

Sem prote c ao de mem oria


O que acontece quando, em n vel de aplica c ao tentamos acessar uma area inv alida de mem oria (ex.: deferenciar um ponteiro nulo)? O t ao famoso segmentation fault! Em termos t ecnicos, o kernel captura o acesso indevido e lan ca um sinal SIGSEGV mantando o processo Por em voltamos para o problema do ovo e da galinha. Isso seria poss vel de ser feito no kernel?

22 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Diferen cas entre desenvolvimento para Kernel e User space

Sem prote c ao de mem oria


O que acontece quando, em n vel de aplica c ao tentamos acessar uma area inv alida de mem oria (ex.: deferenciar um ponteiro nulo)? O t ao famoso segmentation fault! Em termos t ecnicos, o kernel captura o acesso indevido e lan ca um sinal SIGSEGV mantando o processo Por em voltamos para o problema do ovo e da galinha. Isso seria poss vel de ser feito no kernel? Quais as consequencias de um acesso inv alido de mem oria? No melhor dos casos um kernel panic.

22 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Diferen cas entre desenvolvimento para Kernel e User space

Sem prote c ao de mem oria


O que acontece quando, em n vel de aplica c ao tentamos acessar uma area inv alida de mem oria (ex.: deferenciar um ponteiro nulo)? O t ao famoso segmentation fault! Em termos t ecnicos, o kernel captura o acesso indevido e lan ca um sinal SIGSEGV mantando o processo Por em voltamos para o problema do ovo e da galinha. Isso seria poss vel de ser feito no kernel? Quais as consequencias de um acesso inv alido de mem oria? No melhor dos casos um kernel panic. No pior uma brecha de seguran ca!
22 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Diferen cas entre desenvolvimento para Kernel e User space

Mem oria sem pagina c ao


Mem oria virtual e pagina c ao e um poderoso recurso de ger encia de mem oria Possibilita que aplica c oes fa cam uso de mais mem oria que a mem oria f sica dispon vel alocando as p aginas mais acessadas na mem oria principal e mandando o restante para o disco Se esse conceito tamb em valer para o Kernel, o que acontece se o bloco de mem oria contendo instru c oes que efetuam a ger encia de mem oria for por acaso enviado para o disco???

23 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Diferen cas entre desenvolvimento para Kernel e User space

Mem oria sem pagina c ao


Mem oria virtual e pagina c ao e um poderoso recurso de ger encia de mem oria Possibilita que aplica c oes fa cam uso de mais mem oria que a mem oria f sica dispon vel alocando as p aginas mais acessadas na mem oria principal e mandando o restante para o disco Se esse conceito tamb em valer para o Kernel, o que acontece se o bloco de mem oria contendo instru c oes que efetuam a ger encia de mem oria for por acaso enviado para o disco??? Qual a solu c ao? Manter todo o bloco de mem oria do Kernel alocado em mem oria sica! Sendo assim, cada byte de mem oria no Kernel e precioso!
23 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Obtendo o Kernel Linux

24 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Obtendo e Compilando o Kernel Linux

Obtendo e compilando o Kernel Linux

Existem basicamente duas formas de se obter o Kernel Linux: Baixando um tarball da u ltima vers ao do kernel dispon vel em kernel.org ou via pacotes de distribui c oes Baixando uma vers ao de desenvolvimento via git

25 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Obtendo e Compilando o Kernel Linux

Baixando e instalando pacotes


Ap os a instala c ao de uma vers ao limpa do Ubuntu, diversos pacotes s ao necess arios antes da compila c ao propriamente dita
apt g e t i n s t a l l l i n u x s o u r c e 2 . 6 . 3 8 k e r n e l p a c k a g e l i b n c u r s e s 5 dev f a k e r o o t

Ap os a instala c ao, deve ser descompactado e criado um link ligando o diret orio do kernel para /usr/src/linux
t a r x v f l i n u x s o u r c e 2 . 6 . 3 8 . t a r . bz2 l n s l i n u x s o u r c e 2 . 6 . 3 8 / u s r / s r c / l i n u x

26 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Obtendo e Compilando o Kernel Linux

Reutilizando arquivo de congura c ao

A pr oxima etapa e a c opia do arquivo de congura c ao para o diret orio base do kernel
% cp / b o o t / c o n f i g uname r / u s r / s r c / l i n u x / . c o n f i g

Por m, deve-se entrar no diret orio do c odigo do kernel e executar o menu para visualiza c ao das op c oes

27 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Obtendo e Compilando o Kernel Linux

Menu de congura c ao
Vamos fu car um pouco... :)

28 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Obtendo e Compilando o Kernel Linux

Compila c ao :)
Limpar diret orio antes da compila c ao
makekpkg c l e a n

Compilando
f a k e r o o t makekpkg i n i t r d append to v e r s i o n= custom 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 compila c ao gen erica s o seria necess ario a execu c ao do comando make
29 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Obtendo e Compilando o Kernel Linux

Instalando

Por m, basta instalar os arquivos *.deb que foram armazenados na pasta /usr/src
dpkg i . deb

Esse comando realiza as seguintes tarefas Instalar a imagem Instalar os headers do kernel Congurar o grub para dual-boot

30 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Obtendo e Compilando o Kernel Linux

A estrutura de diret orios do kernel

Composta por 5 blocos Includes Documenta c ao Scripts Exemplos (samples ) Implementa c oes (net, arch, init, block, crypt etc)

31 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

A Ferramenta de Ger encia de C odigo Git

Controle de Vers ao Git

32 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

A Ferramenta de Ger encia de C odigo Git

A Ferramenta de Ger encia de C odigo Git


Trata-se de um sistema de controle de vers ao distribu do O Git foi inicialmente projetado e desenvolvido por Linus Torvalds para o desenvolvimento do n ucleo do Linux, por em atualmente ele e amplamente utilizado para os mais diversos prop ositos N ao h a a ideia de reposit orio central como no CVS ou SVN mas sim diversas arvores distribu das onde uma elas podem fazer push e pull uma das outras Ideal para montarmos um reposit orio local sem a necessidade de instala c ao (a cria c ao de um reposit orio leva apenas 1 comando!)
33 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

A Ferramenta de Ger encia de C odigo Git

A Ferramenta de Ger encia de C odigo Git


Foco na cria c ao de branches, realiza c ao de merges e gera c ao de dis entre diferentes pontos da arvore

34 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

A Ferramenta de Ger encia de C odigo Git

Instalando e congurando o git

apt g e t i n s t a l l g i t g i t c o n f i g g l o b a l u s e r . name " Nome " g i t c o n f i g g l o b a l u s e r . e m a i l " email@dominio . com "

35 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

A Ferramenta de Ger encia de C odigo Git

Criando nosso primeiro reposit orio


Para cria c ao de um reposit orio precisamos de apenas um comando! :)
$ mkdir repo $ cd r e p o $ git init .

Ap os a inicializa c ao do reposit orio precisamos apenas adicionar os arquivos via o comando git add
g i t add f i l e 1 [ f i l e 2 ] [ f i l e 3 ] [ f i l e 4 ] . . . g i t commit a

36 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

A Ferramenta de Ger encia de C odigo Git

branches, dis, checkouts, merges, stashes, logs...


g i t branch # l i s t a branches g i t b r a n c h nome # c r i a uma b r a n c h g i t checkout nome da branch # a l t e r n a e n t r e branches git diff # lista a diferenc as adicionadas e a diferen ca e n t r e d o i s p o n t o s do r e p o s i t o rio g i t merge # a t u a l i z a uma b r a n c h com b a s e em o u t r a s g i t r e s e t h a r d HEAD # remove o u l t i m o commit g i t l o g # l i s t a t o d o s o s commits r e a l i z a d o s g i t a r c h i v e f o r m a t t a r . gz o u t p u t a r q u i v o . t a r . gz b r a n c h n a m e v g i t rm f i l e # remove um a r q u i v o da arvore g i t mv f i l e # r e n o m e i a um a r q u i v o da arvore

Vamos praticar um pouco!? Inicializem um projeto e realizem diversas altera c oes fazendo uso das op c oes dispon veis acima
37 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

A Ferramenta de Ger encia de C odigo Git

Clonando uma arvore git

At e agora, vimos como criar, modicar e manipular o reposit orio de diversas maneiras Por em, como obtemos um c odigo de outra pessoa? Devemos fazer uso do comando git clone
g i t c l o n e g i t : / / eden f e e d . e r g . abdn . ac . uk / d c c p e x p my dccp

38 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Criando e aplicando patches com o Git

Criando patches com o Git


Ap os criarmos fazermos nossas modica c oes chegou a hora de gerarmos o patch para submiss ao Para isso fazemos uso do comando git format-patch
g i t f o r m a t p a t c h [ o b j e c t i d ou b r a n c h n a m e ] s t d o u t > p . patch g i t f o r m a t p a t c h [ o b j e c t i d ou b r a n c h n a m e ] g i t f o r m a t p a t c h s [ o b j e c t i d ou b r a n c h n a m e ]

O primeiro comando ir a gerar uma u nica sa da enquanto que o segundo cria v arios arquivos de sa da (um para cada commit)

39 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Criando e aplicando patches com o Git

Checando os patches com checkpatch.pl


Ap os criamos nossos patches temos de vericar se eles est ao dentro do estilo de c odigo adotado no kernel linux (80 colunas, sem espa cos antes do tab, sem espa cos no nal da linha etc)
s c r i p t s / checkpatch . p l [ arquivo . patch ]

Este comando ir a listar todos os problemas de estilo existentes no c odigo Antes de ser submetido todos os problemas devem ser resolvidos

40 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Criando e aplicando patches com o Git

Estrutura do patch

O patch gerado e dividida em 5 partes distintas: Cabe calho do email Descri c ao do patch Assinaturas Sum ario das altera c oes Patch propriamente dito

41 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Criando e aplicando patches com o Git

Assinaturas
A assinatura tem por objetivo possibilitar um rastreio da autoria das altera c oes realizadas Em geral, o c odigo e revisto por diversos desenvolvedores at e chegar na arvore do kernel Tamb em serve como uma declara c ao, por parte do autor, de que est a disponibilizando o c odigo como open-source Uma forma de eternizar o autor! :) Signed-o-by: Autor 1 <random@developer.example.org> Outras entradas poss veis: Ack-by e Cc, Reported-by e Tested-by
42 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Criando e aplicando patches com o Git

Curiosidade: porque utilizar o signo?


Em meados de 2003, uma empresa chamada SCO come cou a questionar a autoria de diversos c odigos do kernel Linux em virtude dela possuir contratos com a IBM que na epoca fez a doa c ao de c odigos para open source. A empresa armava que trechos de c odigo do Unix V estavam incorporados ao Linux. Foram iniciados uma s erie de processos envolvendo a SCO e diversas empresas como: IBM, Red Hat, Novell etc. onde foi comprovado que a SCO estava errada! :) http://en.wikipedia.org/wiki/Timeline_of_SCO-Linux_ controversies

43 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Criando e aplicando patches com o Git

Ultimo teste antes do envio

Antes de realizar o envio do patch e recomend avel tentar aplicar o patch em uma arvore limpa de modo a vericar se algum erro inesperado ir a acontecer A ideia e tentar reproduzir o procedimento de quem ir a aplicar o patch ` a arvore
g i t a p p l y s t a t . p a t c h # Sum a rio de m o d i f i c a c oes g i t a p p l y c h e c k . p a t c h # Checagem p o r e r r o s g i t am s i g n o f f . p a t c h # A p l i c a c a o do p a t c h

44 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Criando e aplicando patches com o Git

Envio de patches: Para quem? de que maneira?


O envio de patches do kernel do Linux e realizado atrav es de emails para listas de discuss oes espec cas Existem diversas listas dispon veis em vger.kernel.org: alsa-devel, autofs, ceph-devel, dccp, netdev etc. Escolha a correspondente e a lista com um n vel acima
ex.: dccp e netdev

Regras b asicas: email sem formata c ao e sem anexos! O c odigo ir a no corpo do email

45 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Criando e aplicando patches com o Git

Envio de patches: Para quem? de que maneira?


O envio de patches do kernel do Linux e realizado atrav es de emails para listas de discuss oes espec cas Existem diversas listas dispon veis em vger.kernel.org: alsa-devel, autofs, ceph-devel, dccp, netdev etc. Escolha a correspondente e a lista com um n vel acima
ex.: dccp e netdev

Regras b asicas: email sem formata c ao e sem anexos! O c odigo ir a no corpo do email Dica nal: se poss vel, envie o patch para que outras pessoas dar uma olhada antes do envio propriamente dito!
45 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Criando e aplicando patches com o Git

Atividade: gerenciando o c odigo com git


O objetivo desta atividade e a pr atica da ger encia de c odigo utilizando o git Congure as propriedades de usu ario e email Iniciar um reposit orio na arvore do kernel Adicionar os arquivos no reposit orio e realizar primeiro commit Criar uma branch com nome teste e realizar alguns commit com diferentes modica c oes Vericar a diferen ca entre o branch atual e a master Voltar para a branch master e realizar um merge das modica c oes Preparar um patch de envio Tempo da atividade: 15 - 20 minutos
46 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

O m odulo Hello World

Criando m odulos para o Kernel

47 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

O m odulo Hello World

Congurando ambiente de teste

Finalmente chegou a hora de rodarmos o nosso primeiro m odulo O mais simples dos m odulos deve oferecer duas funcionalidades b asicas: Carregamente e descarregamento do m odulo

48 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

O m odulo Hello World

O m odulo Hello World


#i n c l u d e < l i n u x / i n i t . h> #i n c l u d e < l i n u x / module . h> MODULE LICENSE ( " GPL " ) ; s t a t i c int h e l l o i n i t ( void ) { p r i n t k (KERN ALERT " Hello , world \n" ) ; return 0; } s t a t i c void h e l l o e x i t ( void ) { p r i n t k (KERN ALERT " Goodbye , cruel world \n" ) ; } module init ( h e l l o i n i t ) ; module exit ( h e l l o e x i t ) ;
49 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

O m odulo Hello World

O m odulo Hello World

As macros module init e module exit s ao respons aveis por indicar quais fun c oes ir ao carregar e descarregar o m odulo No exemplo apresentado, o m odulo exibe apenas uma mensagem na abertura e no descarregamento do m odulo!

50 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

O m odulo Hello World

Compilando
A forma de compilar m odulos do Kernel e um pouco diferente da compila c ao normal de uma aplica c ao C O primeiro passo e contruir o arquivo Makele Nosso arquivo Makele
o b j m := h e l l o . o

ou
o b j m := module . o module o b j s := f i l e 1 . o f i l e 2 . o

Compila c ao: make -C /usr/src/linux M=pwd modules


51 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

O m odulo Hello World

Executando
Inser c ao, remo c ao, listagem...
insmod h e l l o . ko # I n s e r e modulo lsmod # L i s t a modulos rmmod h e l l o # Remove modulo

52 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

O m odulo Hello World

Executando
Inser c ao, remo c ao, listagem...
insmod h e l l o . ko # I n s e r e modulo lsmod # L i s t a modulos rmmod h e l l o # Remove modulo

Onde s ao exibidas as mensagens provenientes do Kernel? Mensagens impressas via fun c ao printk tem dois direcionamentos /var/log/messages dmesg

52 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

O m odulo Hello World

Entendendo o funcionamento de um m odulo

Fun c oes init e exit servem apenas para aloca c ao de recursos e registro de servi cos atrav es de callbacks. Um bom exemplo e o registro de novos protocolos de transporte M odulos apenas provem servi cos. N ao s ao entidades ativas! Por ser um n ucleo preempt vel o m odulo deve suportar concorr encia (race conditions )

53 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Um pouco mais sobre m odulos

Como funcionam as callbacks em C?


Em C, o endere co de uma fun c ao e acess vel ao programador atrav es de uma vari avel do tipo ponteiro para fun c ao A partir desse mecanismos torna-se poss vel abstrair qual implementa c ao ser a executada de maneira semelhante a polimorsmo

54 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Um pouco mais sobre m odulos

Como funcionam as callbacks em C?


Em C, o endere co de uma fun c ao e acess vel ao programador atrav es de uma vari avel do tipo ponteiro para fun c ao A partir desse mecanismos torna-se poss vel abstrair qual implementa c ao ser a executada de maneira semelhante a polimorsmo
s t r u c t opr { int value1 ; int value2 ; i n t ( o p e r a t i o n ) ( i n t , i n t ) ; };

54 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Um pouco mais sobre m odulos

A tabela de s mbolos do Kernel


Todo m odulo ao ser desenvolvido tem acesso a um conjunto de s mbolos disponibilizados pelo Kernel S mbolos podem ser tanto vari aveis quanto fun c oes (ex.: a fun c ao printk) Analogia a s mbolos exportados de uma lib din amica Um problema comum e a tentativa de utiliza c ao de s mbolos n ao denidos/n ao vis veis Como exportar s mbolos de um m odulo?
EXPORT SYMBOL( name ) ; EXPORT SYMBOL GPL( name ) ;

55 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Um pouco mais sobre m odulos

A tabela de s mbolos do Kernel


Todo m odulo ao ser desenvolvido tem acesso a um conjunto de s mbolos disponibilizados pelo Kernel S mbolos podem ser tanto vari aveis quanto fun c oes (ex.: a fun c ao printk) Analogia a s mbolos exportados de uma lib din amica Um problema comum e a tentativa de utiliza c ao de s mbolos n ao denidos/n ao vis veis Como exportar s mbolos de um m odulo?
EXPORT SYMBOL( name ) ; EXPORT SYMBOL GPL( name ) ;

EXPORT SYMBOL GPL limita a exporta c ao ` a GPL


55 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Um pouco mais sobre m odulos

Licensiamento de m odulos
M odulos podem ser registrados sob diferentes licensas utilizando a macro MODULE LICENSE: GPL GPL v2 GPL and additional rights Dual BSD/GPL Dual MPL/GPL Proprietary Um m odulo e considerado propriet ario at e segunda ordem
56 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Um pouco mais sobre m odulos

Manipula c ao de erros durante a inicializa c ao


A fun c ao init serve para aquisi c ao de recursos do m odulo (mem oria, locks em dispositivos, registros de protocolos etc) Por em o que acontece se um dos recursos n ao pode ser obtido?

57 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Um pouco mais sobre m odulos

Manipula c ao de erros durante a inicializa c ao


A fun c ao init serve para aquisi c ao de recursos do m odulo (mem oria, locks em dispositivos, registros de protocolos etc) Por em o que acontece se um dos recursos n ao pode ser obtido? Duas op c oes Continuar a execu c ao com funcionalidades reduzidas Cancelar a inicializa c ao do m odulo Neste sentido, qual seria a abordagem mais adequada para fazer essa manipula c ao de erros?
57 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Um pouco mais sobre m odulos

Manipula c ao de erros durante a inicializa c ao


Qual seria uma solu c ao elegante para a libera c ao de recursos j a alocados?

58 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Um pouco mais sobre m odulos

Manipula c ao de erros durante a inicializa c ao


Qual seria uma solu c ao elegante para a libera c ao de recursos j a alocados?
int i n i t minha funcao ( void ) { int err ; / r e g i s t r a t i o n t a k e s a p o i n t e r and a name / e r r = r e g i s t e r t h i s ( p t r 1 , " skull " ) ; i f ( e r r ) goto f a i l t h i s ; e r r = r e g i s t e r t h a t ( p t r 2 , " skull " ) ; i f ( e r r ) goto f a i l t h a t ; r e t u r n 0 ; / s u c c e s s / f a i l t h a t : u n r e g i s t e r t h i s ( p t r 1 , " skull " ) ; f a i l t h i s : r e t u r n e r r ; / p r o p a g a t e t h e e r r o r / }
58 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Um pouco mais sobre m odulos

Par ametro de inicializa c ao

Muitas vezes precisamos passas congura c oes espec cas ao m odulo que vai ser inicializado Exemplos: Ativa c ao ou desativa c ao do debug Congura c oes espec cas de protocolos Congur oes de m odulos de dispositivos etc Para esta tarefas duas fun c oes est ao associadas: module param (ou module param array) e MODULE PARM DESC

59 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Um pouco mais sobre m odulos

Adicionando par ametros de inicializa c ao (Ex-04)


Sintaxe: module param(parametro, tipo, permissao)
s t a t i c c h a r whom = " world " ; s t a t i c i n t howmany = 1 ; module param ( howmany , i n t , S IRUGO ) ; module param (whom , c h a r p , 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 ,& v e t o r s i z e , S IRUGO | S IWUSR ) ;

Par ametro: vari avel a ser utilizada (deve ser static) Tipo: Tipo da vari avel a ser exportada (bool, charp, int, long, short etc) Caso seja informado um n umero maior de valores do que o tamanho do vetor e lan cado um erro e a inicializa c ao do m odulo e abortada
60 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Um pouco mais sobre m odulos

Permiss oes dos m odulos

O terceiro par ametro tem por objetivo denir como o valor exportado ser a vis vel ap os a inicializa c ao Os valores dos par ametros ser ao disponibilizados em /sys/module/<nome modulo>/parameters Os seguintes valores de permiss oes s ao poss veis 0 => o valor n ao ser a disponibilizados S IRUGO => Somente leitura S IRUGO|S IWUSR => Leitura e escrita

61 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Um pouco mais sobre m odulos

Atividade: Criando m odulos simples


Com base no apresentado vamos criar a seguinte escrutura de m odulos: Criar 3 m odulos chamados mod1, mod2, mod3 com seus respectivos arquivos Makele Deve ser criada uma depend encia de s mbolos (vari aveis e fun c oes) entre os m odulos (mod1 => mod2 => mod3) Devem ser adicionados par ametros para carregamento dos m odulos que incluam tanto valores edit aveis, quanto somente leitura. Al em disso deve ser vericado a possibilidade de escrita ou somente leitura Deve ser avaliado tanto a exporta c ao de s mbolos GPL para m odulos GPL quando para m odulos n ao-GPL Tempo da atividade: 10 - 15 minutos
62 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Gerenciamento de mem oria no Kernel


Em user-space, estamos estamos habituados a tr es fun c oes b asicas para gerenciamento de mem oria, que s ao malloc, calloc e free Todavia, tais fun c oes fazem parte da libc e, portanto, n ao est ao dispon veis Vale lembrar que toda a mem oria do n ucleo e armazenada em mem oria f sica (sem mem oria virtual) Deste modo, o kernel prov e duas estrat egias para ger encia da mem oria que s ao kmalloc e slab cache

63 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

kmalloc

kmalloc (ex-kmalloc-01)
Bastante semelhante a malloc e free Possibilita a aloca c ao de blocos de mem oria com base no argumento size Uma peculiaridade e o fornecimento de ags que serve para controlar como o bloco de mem oria ser a alocado
#i n c l u d e < l i n u x / s l a b . h> void kmalloc ( s i z e t size , i n t f l a g s ) ; k f r e e ( v o i d )

64 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

kmalloc

Sobre o par ametro size

Em espa co de usu ario a aloca c ao e orientada ` a heap (abstra c ao de um bloco cont nuo) Em espa co de n ucleo, a aloca c ao e orientada a p aginas de mem oria (mem oria segmentar) kmalloc faz aloca c ao blocos de p aginas, ou seja, o tamanho alocado pode ser ligeiramente MAIOR que o tamanho solicitado!

65 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

kmalloc

Sobre o par ametro ag

Dene como o bloco de mem oria ser a alocado levando em considera c ao as p aginas de mem orias atualmente dispon veis GFP ATOMIC GFP KERNEL GFP USE Mais 11 tipos! Por em GFP ATOMIC e GFP KERNEL s ao utilizadas em quase todos os casos de maneira segura

66 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

slab cache

slab cache
A abordagem utilizando kmalloc e voltada para cria c ao de objetos individuais Por em, e se fossemos criar diversos objetos do mesmo tipo ao longo do ciclo de vida de um m odulo?...

67 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

slab cache

slab cache
A abordagem utilizando kmalloc e voltada para cria c ao de objetos individuais Por em, e se fossemos criar diversos objetos do mesmo tipo ao amos de nos longo do ciclo de vida de um m odulo?... ter preocupar em congurar o tamanho para cada novo objeto Exemplo: um objeto sk bu e criado todas as vezes que um pacote de dados e recebido ou enviado Qual seria uma poss vel solu c ao?

67 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

slab cache

slab cache
A abordagem utilizando kmalloc e voltada para cria c ao de objetos individuais Por em, e se fossemos criar diversos objetos do mesmo tipo ao amos de nos longo do ciclo de vida de um m odulo?... ter preocupar em congurar o tamanho para cada novo objeto Exemplo: um objeto sk bu e criado todas as vezes que um pacote de dados e recebido ou enviado Qual seria uma poss vel solu c ao? Criar um procedimento que encapsule a cria c ao de objetos Para esta funcionalidade, o kernel prov e o Slab
67 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

slab cache

Arquitetura Slab
Cria um pool de blocos de mem oria Otimizado para criar objetos do mesmo tipo

68 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

slab cache

Rotinas associadas

S ao denidas quatro fun c oes associadas ` a aloca c ao/desaloca c ao de blocos de mem oria utilizando Slab kmem cache create kmem cache alloc kmem cache free kmem cache destroy

69 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

slab cache

A fun c ao kmem cache create (ex-slab-01)


kme m c a c h e t k m e m c a c h e c r e a t e ( c o n s t c h a r name , s i z e t size , s i z e t offset , unsigned long flags , v o i d ( c o n s t r u c t o r ) ( v o i d , km em cach e t , unsigned long f l a g s ) ;

name: Nome da estrutura (sem espa cos em branco) oset: Deslocalmento desde o come co da p agina de mem oria. Usado para alinhamentos espec cos (normalmente zero) ags: Controla como a aloca c ao ser a realizada (normalmente usa-se o valor SLAB HWCACHE ALIGN) constructor: utilizados para contru c ao personalizada de objetos complexos ( e aceito NULL)
70 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

slab cache

Atividade: Alocando objetos com kmalloc e slab


Nesta atividade iremos praticar a cria c ao, aloca c ao e libera c ao de recursos utilizando kmalloc e slab Criar 1 m odulo que receba como par ametro de inicializa c ao o n umero de objetos a serem alocados Deve-se denir uma struct que possua pelo menos 2 elementos A partir do n umero de objetos, deve-se construir um array e cada posi c ao do array deve ser alocado Metade dos elementos deve ser alocado via kmalloc e a outra metade via Deve ser implementado o processo de desaloca c ao dos objetos da maneira apropriada Tempo da atividade: 15 - 20 minutos
71 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Conceitos

72 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Conceitos

O uso de estruturas de dados no Kernel


O Kernel, assim como qualquer software, faz uso massivo de estruturas de dados de modo a armazenar seus dados dado em runtime Sendo assim, am de evitar que o desenvolvedor tenha de criar suas pr oprias estruturas a cada desenvolvimento foram desenvolvidas algumas estruturas de dados b asica que podem ser reutilizadas S ao elas: Linked lists Queues Maps Binary trees A seguir daremos um enfoque nas listas ligadas! :)
73 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Conceitos

Listas ligadas (Linked Lists)


a estrutura de dados mais simples e comum encontrada no E Kernel Diferentemente de um array e uma estrutura expans vel Faz uso do conceito de n os que apontam para outros n os As listas ligadas podem se dividir em quatro grupos: Listas simples Listas duplamente ligadas Listas circulares simples Listas circulares duplamente ligadas
74 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Conceitos

Listas simples

struct list element { v o i d d a t a ; / t h e p a y l o a d / s t r u c t l i s t e l e m e n t n e x t ; / p o i n t e r t o t h e n e x t e l e m e n t / };

75 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Conceitos

Listas duplamente ligadas

struct list element { v o i d d a t a ; / t h e p a y l o a d / s t r u c t l i s t e l e m e n t n e x t ; / n e x t e l e m e n t / s t r u c t l i s t e l e m e n t p r e v ; / p r e v i o u s e l e m e n t };

76 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Conceitos

Listas circulares simples

Figura : Lista circular simples

Figura : Lista circular duplamente ligada


77 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linked list

A implementa c ao do Kernel
Em geral, as implementa c oes de listas ligadas s ao feitas tornando a carga u til um elemento da lista
struct my struct { u n s i g n e d l o n g param1 ; unsigned long para2 ; b o o l param3 ; s t r u c t my struct next ; s t r u c t my struct prev ; };

Ao inv es disso, a implementa c ao do kernel adiciona a lista ligada ` a estrutura de carga u til
78 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linked list

A implementa c ao do Kernel
struct my struct { u 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 ; struct list head l i s t ; };

list head e composta por apenas dois elementos e e denida em linux/list.h


struct list head { s t r u c t l i s t h e a d next s t r u c t l i s t h e a d prev ; };
79 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linked list

Denindo uma lista ligada

1 2 3

Denir a estrutura de carga u til Atribuir os valores do primeiro elemento da lista Invocar a macro INIT LIST HEAD para inicializar a lista

Por que e necess aria a exist encia de uma macro para inicializa c ao da lista?

80 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linked list

Denindo uma lista ligada

1 2 3

Denir a estrutura de carga u til Atribuir os valores do primeiro elemento da lista Invocar a macro INIT LIST HEAD para inicializar a lista

Por que e necess aria a exist encia de uma macro para inicializa c ao da lista? Porque e necess aria a aloca c ao da mem oria para o primeiro elemento list head

80 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linked list

Denindo uma lista ligada


s t r u c t my struct payload ; p a y l o a d = k m a l l o c ( s i z e o f ( p a y l o a d ) , GFP KERNEL ) ; p a y l o a d >param1 = 4 0 ; p a y l o a d >param2 = 6 ; p a y l o a d >param3 = f a l s e ; INIT LIST HEAD(& p a y l o a d > l i s t ) ;

Se estiv essemos trabalhando com elementos est aticos criar amos da seguinte maneira
struct . param1 . param2 . list = };
81 / 89 Programa c ao para o Kernel Linux (Parte 1)

my struct payload = { = 40 , = 6, LIST HEAD INIT ( p a y l o a d . l i s t ) ,

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linked list

Forma alternativa (ex-linked-list-01)

Na estrutura criada n ao e feita nenhuma diferencia c ao entre qual elemento e a cabe ca da lista Por em, muitas vezes queremos manter esse registro Podemos fazer isso a partir da macro LIST HEAD
s t a t i c LIST HEAD ( head ) ;

A partir disso e criado um elemento est atico list head

82 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linked list

Fun co es para adicionar elementos na lista


Existem basicamente dois m etodos para inser c ao de elementos da lista list add(struct list head *new, struct list head *head) list add tail(struct list head *new, struct list head *head)
LIST HEAD ( head ) ; s t r u c t m y s t r u c t e l e m e n t = . . . // O b j e t o a l o c a d o e com os par ametros setados l i s t a d d (& e l e m e n t > l i s t , &head ) ;

83 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linked list

Algumas outras fun co es para manipula c ao (ex-linked-list-02)


list del: deleta elementos da lista (sem desalocar o payload ) list move: move um elemento de uma lista para outra list empty: checa se a lista est a vazia

84 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linked list

Algumas outras fun co es para manipula c ao (ex-linked-list-02)


list del: deleta elementos da lista (sem desalocar o payload ) list move: move um elemento de uma lista para outra list empty: checa se a lista est a vazia Mas anal, como recuperamos a carga u til tendo refer encia apenas ao list head? Fazemos uso da fun c ao list entry(ptr, type, member), onde ptr: ponteiro list head type: tipo da carga u til member: nome do elemento list head dentro da estrutura da carga u til
84 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linked list

Curiosidade: o funcionamento da fun c ao list entry

Trata-se de uma macro que consegue obter o endere co da estrutura externa a partir de um elemento interno Faz uso do deslocamento (oset ) apresentado pelo elemento interno em rela c ao ` a estrutura externa
#d e f i n e l i s t e n t r y ( p t r , t y p e , member ) ( { \ c o n s t t y p e o f ( ( ( t y p e ) 0 )>member ) m p t r = ( p t r ) ; \ ( t y p e ) ( ( c h a r ) m p t r o f f s e t o f ( t y p e , member ) ) ; } )

85 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linked list

Percorrendo a lista
O Kernel disponibiliza um conjunto de macros que possibilitam a itera c ao na lista de maneira bastante simples list for each, list for each entry, list for each entry reverse
s t r u c t l i s t h e a d p ; struct my struct f ; l i s t f o r e a c h ( p , &head ) { / f a p o n t a p a r a a c a r g a u t i l d o s e l e m e n t o s / f = l i s t e n t r y (p , s t r u c t my struct , l i s t ) ; }

86 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linked list

Atividade 3: trabalhando com listas ligadas

Iremos trabalhar nesta atividade no processo de cria c ao e utiliza c ao de listas ligadas Em um dos m odulos criados na se c ao 1 adicione rotinas que criem, populem, iterem e realizem dele c ao sobre uma lista A estrutura deve ser denida em um arquivo .h bem como as rotinas do m odulo Tempo da atividade: 10 - 15 minutos

87 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linked list

Bibliograa I
Jeremy Andrews. Linux: Documenting how patches reach the kernel. http://kerneltrap.org/node/3180, Maio 2004. The Git Community Book. The git community book. http://book.git-scm.com/index.html, Outubro 2011. Ariejan de Vroom. How to create and apply a patch with git. http://ariejan.net/2009/10/26/ how-to-create-and-apply-a-patch-with-git/, Outubro 2009.
88 / 89 Programa c ao para o Kernel Linux (Parte 1) Ivo Calado IFAL

Introdu c ao

Montando o ambiente

Criando m odulos

Gerenciamento de Mem oria

Estruturas de Dados

Linked list

Bibliograa II

Wikipedia Foudation. Sco-linux controversies. http: //en.wikipedia.org/wiki/SCO-Linux_controversies, Outubro 2011.

89 / 89 Programa c ao para o Kernel Linux (Parte 1)

Ivo Calado

IFAL

You might also like