Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Programa¸c˜ao para o Kerne...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Sobre o palestrante
Titula...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Experiˆencia com o Linux
C...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
E sobre vocˆes?...
Qual a ...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Objetivo do curso
Mostrar ...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Agenda I
1 Introdu¸c˜ao
O ...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Agenda II
4 Gerenciamento ...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Observa¸c˜ao sobre este ma...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O que ´e um sistema operac...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O que ´e um sistema operac...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O que ´e um sistema operac...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O que ´e um sistema operac...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linux
GNU, Linux ou GNU/Li...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linux
GNU, Linux ou GNU/Li...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linux
GNU, Linux ou GNU/Li...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linux
Versionamento
Durant...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linux
Versionamento
Em vis...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Caracter´ısticas do Kernel...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Caracter´ısticas do Kernel...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Caracter´ısticas do Kernel...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Caracter´ısticas do Kernel...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvol...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvol...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvol...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvol...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvol...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvol...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvol...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvol...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvol...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Diferen¸cas entre desenvol...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo o Kernel Linux
24 ...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Ker...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Ker...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Ker...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Ker...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Ker...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Ker...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Ker...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Ker...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Ker...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Obtendo e Compilando o Ker...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
A Ferramenta de Gerˆencia ...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
A Ferramenta de Gerˆencia ...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
A Ferramenta de Gerˆencia ...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
A Ferramenta de Gerˆencia ...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
A Ferramenta de Gerˆencia ...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
A Ferramenta de Gerˆencia ...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
A Ferramenta de Gerˆencia ...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Criando e aplicando patche...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Criando e aplicando patche...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Criando e aplicando patche...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Criando e aplicando patche...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Criando e aplicando patche...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Criando e aplicando patche...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Criando e aplicando patche...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Criando e aplicando patche...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Criando e aplicando patche...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O m´odulo Hello World
Cria...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O m´odulo Hello World
Confi...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O m´odulo Hello World
O m´...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O m´odulo Hello World
O m´...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O m´odulo Hello World
Comp...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O m´odulo Hello World
Exec...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O m´odulo Hello World
Exec...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O m´odulo Hello World
Ente...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
O m´odulo Hello World
Adic...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odul...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odul...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odul...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odul...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odul...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odul...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odul...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odul...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odul...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odul...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odul...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odul...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odul...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Um pouco mais sobre m´odul...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Gerenciamento de mem´oria ...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
kmalloc
kmalloc
Bastante s...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
kmalloc
Sobre o parˆametro...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
kmalloc
Sobre o parˆametro...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
kmalloc
Modo de uso
s t r ...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
slab cache
slab cache
A ab...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
slab cache
slab cache
A ab...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
slab cache
slab cache
A ab...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
slab cache
Arquitetura Sla...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
slab cache
Rotinas associa...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
slab cache
A fun¸c˜ao kmem...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
slab cache
Exemplo aloca¸c...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
slab cache
Atividade: Aloc...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Conceitos
79 / 96 Ivo Cala...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Conceitos
O uso de estrutu...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Conceitos
Listas ligadas (...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Conceitos
Listas simples
s...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Conceitos
Listas duplament...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Conceitos
Listas circulare...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
A implementa¸c...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
A implementa¸c...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Definindo uma l...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Definindo uma l...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Definindo uma l...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Forma alternat...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Fun¸c˜oes para...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Algumas outras...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Algumas outras...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Curiosidade: o...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Percorrendo a ...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Atividade 3: t...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Bibliografia I
...
Introdu¸c˜ao Montando o ambiente Criando m´odulos Gerenciamento de Mem´oria Estruturas de Dados
Linked list
Bibliografia II...
Próximos SlideShares
Carregando em…5
×

Programação para Kernel Linux - Parte 1

2.600 visualizações

Publicada em

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

5 comentários
10 gostaram
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
2.600
No SlideShare
0
A partir de incorporações
0
Número de incorporações
5
Ações
Compartilhamentos
0
Downloads
102
Comentários
5
Gostaram
10
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Programação para Kernel Linux - Parte 1

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

×