1Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Sistemas Operacionais II
KernelCódigo Fonte
Anderson L. S. [email protected]
© Copyright 2004-2009, Free Electrons.Creative Commons BY-SA 3.0 licenseLatest update: 30 de Mar de 2010, http://dase.ifpe.edu.br/~alsmAdaptation by: Anderson L. S. Moreira [email protected]
2Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Desenvolvimento de Drivers para Linux
Código do Linux e drivers de dispositivos
3Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Versão do Kernel
As APIs cobertas nos slidessão compatíveis com os fontes do Linux 2.6.33.Outros recursos são de patchs aplicados ao Linux.
4Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Linguagem de Programação
Implementado em C igual a todo sistema UNIX.(C foi criado para implementar o primeiro sistema UNIX)Também se usa um pouco de Assembly:
Exceções da inicialização da CPU e máquinaBibliotecas de rotinas críticas.
Não usa C++, veja em http://www.tux.org/lkml/#s15-3Todo o código compilado com gcc, o GNU C Compiler
Muitas extensões do gcc-specific foram usadas no fonte do kernel, qualquer compilador padrão ANSI C não irá compilar o kernel;Uns poucos compiladores alternativos funcionam (Intel e Marvell)Veja http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/C-Extensions.html
5Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Sem Biblioteca de C
O kernel tem de ser do tipo standalone e não pode usar o espaço de usuário.Espaço de usuário é implementado no topo dos serviços do kernel, não o oposto.O fonte do kernel tem de suportar suas próprias implementações de bibliotecas(string utilities, criptografia, descompressão...)Não se pode usar as bibliotecas padrões do C no fonte do kernel.(printf(), memset(), malloc()...).Tem de usar os cabeçalhos de C do kernel.
O kernel tem funções similares de C, como printk(), memset(), kmalloc() ...
6Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Portabilidade
O fonte do kernel do Linux foi projetado para ser portável;
Todo fonte fora do diretório arch/ deverá ser portável;
O kernel provê macros e funções para abstrair detalhes específicos da arquitetura
Endianness(cpu_to_be32, cpu_to_le32, be32_to_cpu, le32_to_cpu)Acesso a memória de E/SSe necessário, barreiras de memória para garantir ordenamento;DMA API para nivelar e invalidar caches.
7Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Não computa FPU
Nunca use números FPU no fonte do kernel. Seu código poderá rodar em um processador sem uma unidade de co-processador (como o arm).Algumas configurações opcionais para uso de FPU
Podem ser emulados em operações de ponto flutuante em aplicações de espaço de usuário, gatilhos e exceções no kernelÉ recomendável por motivos de performance.
8Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
API interna do Linux instável (1)
A API interna do kernel para implementar o fonte do kernel pode passar por mudanças entre duas versões da 2.6.x. Um dispositivo standalone compilado para uma determinada versão pode não compilar ou funcionar em uma nova versão.Veja Documentation/stable_api_nonsense.txtpara saber porque.
A API externa deverá não mudar (system calls, /proc, /sys), como também pode quebrar determinados programas. Novos recursos podem ser adicionados, mas os desenvolvedores do kernel uma compatibilidade com versões antigas, por um ou mais anos.
Sempre que um desenvolvedor muda uma API interna, Este deve atualizar todo o código do kernel que usa essa determinada função.
Funciona perfeitamente para o código na árvore do kernel.Referencia da API: http://lwn.net/Articles/2.6-kernel-api/
Recursos removidos: Documentation/feature-removal-schedule.txt
9Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
API interna do Linux instável (2)
Exemplo USB
Linux tem atualizado a API interna para USB pelo menos 3x (ajustes, segurança, suporte a dispositivos de alta velocidade) e atualmente tem o barramento USB mais veloz (comparado a outros sistemas)
Windows XP também teve de reescrever os códigos do USB 3 vezes. Mas por causa do fonte-fechado, binários de dispositivos não puderam ser atualizados, tiveram de manter um retrocompatibilidade com versões antigas. Isso é muito custoso (desenvolvimento, segurança, estabilidade, performance).
Veja “Myths, Lies, and Truths about the Linux Kernel”, de Greg K.H., para detalhes sobre o prcesso de desenvolvimento do kernel: http://kroah.com/log/linux/ols_2006_keynote.html
10Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Restrições da memória do Kernel
Quem pode cuidar do kernel?
Sem proteção de memóriaAcessando locais de memória ilegal no kernel (sempre fatal).
Tamanho de pilha fixo (8 or 4 KB)Ao contrário no espaço de usuário não tem como aumentar.
Memória do kernel não pode executar swap out (por mesmas razões).
Processode usuário
KernelLocalilegal
memória
Tentativade acessar
Exception(MMU)
SIGSEGV, kill
Gerenciador do espaço de usuárioUsado para implementar:- proteção de memória- crescimento da pilha- troca de memória com disco (swap out)- demanda de paginação
11Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Drivers de Dispositivos no Espaço de usuário (1)
É possível implementar drivers de dispositivos no espaço de usuário!Tais drivers apenas precisam acessar os dispositivos através de mínimos e genéricos kernel drivers.Exemplos
Drivers para impressoras e scanner(Porta paralela / USB drivers)X drivers: drivers do kernel de baixo nível + espaço de usuário X drivers.Drivers de espaço de usuário baseados em UIO,framework introduzido em 2.6.23
12Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Drivers de Dispositivos no Espaço de usuário (1)
VantagensNão precisa de grandes habilidades com o fonte do kernel. Fácil de executar reuso entre dispositivos.Drivers podem ser escritos em qualquer linguagem, até Perl!Drivers podem ser mantidos proprietários.Código de driver podem ser mortos e debugados. Não interrompe o kernel.Podem executar troca com disco (swap out) (código do kernel não pode).Pode usar computação FPU.Menos complexidade que o kernel.
InconvenientesMenos simplicidade para acessar interrupções.Aumenta a latência do que no modo kernel.
Veja http://www.celinux.org/elc08_presentations/uio080417celfelc08.pdf.
13Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Linux Kernel
Linux sources
14Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Localização dos fontes do Kernel
A versão oficial dos fontes, como o lançado por Linus Torvalds está disponível em http://www.kernel.org
Essa versão segue a o modelo de desenvolvimento do kernelContudo, pode não conter a versão de desenvolvimento mais recente de uma determinada área.
Muitas sub-comunidades do kernel contém as versões mais estáveis
Comunidade de arquitetura (ARM, MIPS, PowerPC, etc.), Comunidade de drivers de dispositivos (I2C, SPI, USB, PCI, network, etc.), outras comunidades (real-time, etc.)Geralmente não lançam versões oficiais, apenas árvores de desenvolvimento são disponíveis
15Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Estrutura dos fontes do Linux (1)
arch/<arch> Código de arquitetura específicaarch/<arch>/<mach> Código específico de Máquina / Placablock/ Núcleo da camada de blocoCOPYING Condições de copia (GNU GPL)CREDITS Principais contribuidorescrypto/ Bibliotecas de criptografiaDocumentation/ Documentação. Não perca isso!drivers/ Todos os drivers exceto de som (usb, pci...)fs/ Filesystems (fs/ext3/, etc.)include/ Cabeçalhos do kernelinclude/asm-<arch> Cabeçalhos de arquitetura e máquinainclude/linux Cabeçalhos do núcleo do kernelinit/ Inicialização do Linux (incluindo main.c)
16Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Estrutura dos fontes do Linux (2)
ipc/ Comunicação de ProcessosKbuild Parte do sistema de construção do kernelkernel/ Linux kernel core (pequeno!)lib/ Bibliotecas de rotina (zlib, crc32...)MAINTAINERS Mantedores de cada parte do kernel. Útil!Makefile Top Linux makefile (setado para arquitetura)mm/ Memory management code (pequeno!)net/ Código de suporte de rede (não drivers)README Instruções de montagemREPORTING-BUGS Instruções para reportar bugssamples/ Código exemplo (markers, kprobes, kobjects)scripts/ Scripts para uso interno ou externosecurity/ Implementações de segurança (SELinux...)sound/ Códigos e Drivers de somusr/ Código para gerar um arquivo initramfs cpio.
17Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Acessando o desenvolvimento do código (1)
Útil se está envolvido com o desenvolvimento do códigoou se encontrou um bug no código.
Fontes de desenvolvimento do Kernel são gerenciados com git:http://kernel.org/pub/software/scm/git/
Navegar na árvore de Linus' git (if you just need to check a few files):http://www.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=tree
Pode usar diretamente git no desktop
Debian / Ubuntu: instalar pacote git-core
18Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Acessando o desenvolvimento do código (2)
Escolha uma árvore de desenvolvimento git em http://git.kernel.org/Clone essa árvore.Exemplo (Linus,usa uma versão estável Linux):git-clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Atualize a árvore (Linus exemplo):cd linux-2.6git pull
Veja outros materiais de git:http://free-electrons.com/docs/git/
19Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Linux device drivers
Ferramentas de gerenciamento
20Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Cscope
Permite procurar código por:- todas referencias a um símbolo- definições globais- funções chamada por uma função- funções chamando uma função- text string- expressões regulares- um arquivo- arquivos incluindo um arquivo
http://cscope.sourceforge.net/
Ferramenta para navegar em código fonte(principalmente C, mas outras C++ ou Java)
Suporta grandes projeto como kernel do LinuxMenos de 1 min. Para indexar o Linux 2.6.17 (rápido!)
Pode usar editores como o vim e emacs.
Nos fontes do kernel do linux, execute com: cscope -Rk (man cscope para ajuda)
21Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Cscope screenshot
22Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
LXR: Linux Cross Reference
http://sourceforge.net/projects/lxr
Ferramenta para indexar fontes e navegar em código
Web server baseMuito fácil e rápido de usar
Procura por identificador ou um texto
Fácil de encontrar declaração, implementação ou uso de símbolos
Suporta C e C++
Suporta projetos como o Linux kernel(264 M na versão 2.6.26).
Leva um tempo e paciência para configurar (configuration, indexing, server configuration).
Indexando uma nova versão é rápido:~ 20 minutos com LXR 0.3.1.
Servidor pronto http://lxr.free-electrons.com Outros podem ser encontrados em:http://free-electrons.com/community/kernel/lxr/
23Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
LXR screenshot
24Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Practical lab – Kernel sources
Familiaridade com os fontesUso de uma ferramenta de configuração
25Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
Bibliografia
Sistemas operacionais, Romulo Oliveira, 2009;Arquitetura de Sistemas Operacionais, Francis Machado, 2008;Embedded Linux Experts – http://free-electrons.com
26Anderson Moreira. [email protected], Sistemas Operacionais II. http//dase.ifpe.edu.br/~alsm
No próximo episódio de SO II !!!
Explicação sobre o projeto;Divisão de tarefas;Início prático dos trabalhos.