Upload
tchelinux-slides
View
2.582
Download
0
Embed Size (px)
Citation preview
Introdução ao Desenvolvimento Introdução ao Desenvolvimento do Kernel Linuxdo Kernel Linux
Versões 2.6.XVersões 2.6.X
http://www.tchelinux.orghttp://www.tchelinux.org
Palestrante: Douglas Schilling LandgrafEmail: [email protected]
20070324
● Sobre o palestranteSobre o palestrante● Sobre a palestraSobre a palestra● Dicas iniciaisDicas iniciais
Kernel LinuxKernel Linux
20070324
Kernel Linux Kernel Linux
Onde começar ? TODO List ?Onde começar ? TODO List ?
http://www.http://www.kernelkernel.org.org
http://kernelhttp://kerneljanitorsjanitors.org.orghttp://kernelnewbies.org/KernelJanitors/http://kernelnewbies.org/KernelJanitors/TodoTodohttp://kernelnewbies.org/http://kernelnewbies.org/KernelMentorsKernelMentors
http://www.kernelhttp://www.kernelnewbiesnewbies.org.orghttp://http://br.br.kernelnewbies.org/kernelnewbies.org/
20070324
Onde obter o código fonte ? Onde obter o código fonte ?
httphttp://www.kernel.org://www.kernel.orgftpftp://ftp.kernel.org/pub://ftp.kernel.org/pubrsyncrsync://rsync.kernel.org/pub/://rsync.kernel.org/pub/
Kernel Linux Kernel Linux
20070324
Licença: Licença: ● GPL ( versão 2 ) GPL ( versão 2 )
http://www.gnu.org/copyleft/gpl.htmlhttp://www.gnu.org/copyleft/gpl.html
Como funciona?Como funciona?● Podemos Podemos baixarbaixar o software e o software e alteraralterar, desde que publiquemos este , desde que publiquemos este
software com assoftware com as licenças originais, incluindo licenças originais, incluindo a disponibilização do a disponibilização do código fontecódigo fonte..
Kernel LinuxKernel Linux
20070324
Definição:Definição:
● É no kernel que estão É no kernel que estão definidas funções para operação comdefinidas funções para operação com periféricosperiféricos (mouse, discos, impressoras, interface serial/interface (mouse, discos, impressoras, interface serial/interface paralela, usb etc.), gerenciamento de memória, entre outros. paralela, usb etc.), gerenciamento de memória, entre outros.
● Conjunto de programas que fornece, para os programas de usuário Conjunto de programas que fornece, para os programas de usuário (aplicativos), uma(aplicativos), uma interface para utilizar os recursos do sistemainterface para utilizar os recursos do sistema..
KernelKernel
20070324
KernelKernel
Aplicativo 1Aplicativo 1 Aplicativo 2Aplicativo 2
System Call Interface (open, close, brk (malloc), etc.)System Call Interface (open, close, brk (malloc), etc.)
Kernel SubsystemsKernel Subsystems
Device DriversDevice Drivers
User-Space User-Space
Kernel-SpaceKernel-Space
HardwareHardware
20070324
Design: Monolítico versus MicroKernelDesign: Monolítico versus MicroKernel● Monolítico:Monolítico:
● Criado em meados de 1980Criado em meados de 1980● Um grande e único processo (imenso)Um grande e único processo (imenso)● Comunicação trivial (todos rodam em um único processo)Comunicação trivial (todos rodam em um único processo)
● MicroKernel:MicroKernel:● Separado em dois processos (“servers” / userspace)Separado em dois processos (“servers” / userspace)● Comunicação via IPC (interprocess communication)Comunicação via IPC (interprocess communication)● ModularidadeModularidade
KernelKernel
20070324
Exemplo:Exemplo:
KernelKernel
Kernel
Softwares
Kernel
Monolítico MicroKernel
IPC
SoftwaresServers
IPC = Interprocess Communication
20070324
Design:Design: ● Executa em um Executa em um único processoúnico processo● Kernel Linux é Kernel Linux é monolítico monolítico ● ImplementaImplementa recursos do microkernelrecursos do microkernel design design
● Capacidade de Capacidade de carregar dinamicamente móduloscarregar dinamicamente módulos● Suporte a Suporte a processadores SMPprocessadores SMP (symmetrical multiprocessor) (symmetrical multiprocessor)● Sistema de acesso ao dispositivos (Sistema de acesso ao dispositivos (sysfssysfs))
Kernel LinuxKernel Linux
20070324
Versões: Versões:
Kernel Linux Kernel Linux
Estáveis:Estáveis:● Correções de bugsCorreções de bugs● Novos driversNovos drivers
Desenvolvimento:Desenvolvimento:● Alterações frequentes e drásticasAlterações frequentes e drásticas● Desenvolvedores testam novas soluçõesDesenvolvedores testam novas soluções
20070324
Versões: Versões:
Kernel Linux Kernel Linux
2.6.02.6.0Versão principal éVersão principal é 2 2
Versão secundária é Versão secundária é 66 (estável)(estável)
Release éRelease é 0 0
Números pares = versões estáveis Números pares = versões estáveis Ex.: (Ex.: (2.0, 2.4, 2.62.0, 2.4, 2.6))
Números ímpares = versões de desenvolvimento Números ímpares = versões de desenvolvimento Ex.: (Ex.: (1.3, 2.3, 2.51.3, 2.3, 2.5))
Ex.: linux2.6.20.3.tar.bz2Ex.: linux2.6.20.3.tar.bz2
20070324
Versões, e hoje como funciona? Versões, e hoje como funciona?
● Hoje Hoje só temossó temos a versão 2.6.X a versão 2.6.X● Decisão tomada no Linux Kernel Developers Summit ( Decisão tomada no Linux Kernel Developers Summit ( 20042004 ) )● Todas novas implementações são enviadas para o Todas novas implementações são enviadas para o Andrew Morton Andrew Morton
(Árvore mm)(Árvore mm)● Após Após tornarse estável tornarse estável o patch entra na versão principal.o patch entra na versão principal.● Versão 2.7Versão 2.7 ~= ~= Árvore Árvore mm mm
Kernel LinuxKernel Linux
20070324
Diretórios: Diretórios: arch/arch/ Código específico de arquiteturaCódigo específico de arquiteturacrypto/crypto/ API de criptografiaAPI de criptografiaDocumentation/Documentation/ DocumentaçãoDocumentaçãodrivers/drivers/ Device DriversDevice Driversfs/fs/ File systemsFile systemsinclude/include/ HeadersHeadersinit/init/ Kernel bootKernel bootipc/ipc/ Interprocess communicationInterprocess communicationkernel/kernel/ Core do KernelCore do Kernel
Kernel Linux Kernel Linux
20070324
Diretórios: Diretórios:
lib/lib/ Bibliotecas Bibliotecas mm/mm/ Gerenciamento de MemóriaGerenciamento de Memórianet/net/ Sistema de Rede Sistema de Rede scripts/scripts/ Scripts em geralScripts em geralsecurity/security/ Subsistema de segurançaSubsistema de segurançasound/sound/ Susbsistema de somSusbsistema de somusr/usr/ initramfsinitramfs
Kernel LinuxKernel Linux
20070324
Kernel Linux Kernel Linux
CodingStyle: CodingStyle:
IdentaçãoIdentação 1 TAB = 8 caracteres (!= 8 espaços)1 TAB = 8 caracteres (!= 8 espaços)ColunasColunas 80 80
ifif(teste)(teste) { {blah();blah();
} else {} else { bleh();bleh();}}if(foo)if(foo)
bar();bar();$ linux/Documentation/CodingStyle $ linux/Documentation/CodingStyle
20070324
Kernel Linux Kernel Linux
CodingStyle: CodingStyle:
Funções:Funções:1, 2 páginas?1, 2 páginas?< 10 variáveis locais ?< 10 variáveis locais ?
Comentários:Comentários:/*/*
* Olá, Eu sou um comentário!* Olá, Eu sou um comentário! */ */
Outros:Outros: typedef, structs, etc. typedef, structs, etc.
20070324
Kernel Linux Kernel Linux
CodingStyle: CodingStyle:
Ferramenta indentFerramenta indent::
$$ indent indent kr i8 ts8 sob 180 ss bs ps1 <arquivo> kr i8 ts8 sob 180 ss bs ps1 <arquivo>
ou ou
$$ scripts/Lindent scripts/Lindent
20070324
Kernel Linux Kernel Linux
Compilando/Carregando/Listando/Descarregando: Compilando/Carregando/Listando/Descarregando:
$ linux/drivers/net>$ linux/drivers/net> vi hello.c vi hello.c $ linux/drivers/net>$ linux/drivers/net> vi Makefile vi Makefile objm += hello.o objm += hello.o $ linux/drivers/net>$ linux/drivers/net> make C /usr/src/linux SUBDIRS=$PWD modules make C /usr/src/linux SUBDIRS=$PWD modules
Atenção aos WARNINGSAtenção aos WARNINGS
$$ insmod insmod ./modulo.ko ./modulo.ko $$ lsmod lsmod$ $ modprobemodprobe modulo.ko (procura por dependências) modulo.ko (procura por dependências)$ $ rmmodrmmod modulo.ko modulo.ko
20070324
Kernel Linux Kernel Linux
hello.chello.c
#include <linux/init.h>#include <linux/init.h>#include <linux/module.h>#include <linux/module.h>MODULE_LICENSE("Dual BSD/GPL");MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)static int hello_init(void){{ printk(KERN_ALERT "hello!\n");printk(KERN_ALERT "hello!\n"); return 0;return 0;}}
20070324
Kernel Linux Kernel Linux
hello.c hello.c
static void hello_exit(void)static void hello_exit(void){{ printk(KERN_ALERT "Goodbye\n");printk(KERN_ALERT "Goodbye\n");}}
module_init(hello_init);module_init(hello_init);module_exit(hello_exit);module_exit(hello_exit);
20070324
Kernel Linux Kernel Linux
Depuração com printfk(): Depuração com printfk():
printk() ~= printf()printk() ~= printf()
printk(KERN_WARNING “mensagem de warning!\n”);printk(KERN_WARNING “mensagem de warning!\n”);printk(KERN_DEBUG “mensagem de debug!\n”);printk(KERN_DEBUG “mensagem de debug!\n”);printk(<1> “mensagem de alerta!!\n”);printk(<1> “mensagem de alerta!!\n”); <linux/kernel.h> valores das MACROS {0,1,2,3, ... 7}<linux/kernel.h> valores das MACROS {0,1,2,3, ... 7}
Prioridade: 0 > 7Prioridade: 0 > 7
20070324
Kernel Linux Kernel Linux
Ferramentas: Ferramentas:
diff diff Ferramenta para comparar arquivos Ferramenta para comparar arquivospatchpatch Ferramenta para aplicar patchs Ferramenta para aplicar patchs quiltquilt Scripts para manutenção de patchs Scripts para manutenção de patchs vimdiffvimdiff Feramenta para comparar arquivosFeramenta para comparar arquivosqemuqemu EmuladorEmuladorgitgit Controle de fontes/versõesControle de fontes/versõesctagsctags Tags no código fonteTags no código fontecscopecscope Navega no código fonteNavega no código fonteketchupketchup Ferramenta para atualização do kernelFerramenta para atualização do kernel
20070324
Kernel Linux Kernel Linux
Ctags: Ctags:
$ $ make tagsmake tags
$ vi $ vi .vimrc.vimrcset tags=/usr/src/linux/tagsset tags=/usr/src/linux/tags
:ta:ta printk printk$ vim t printk$ vim t printkCTRL + ]CTRL + ]CTRL + tCTRL + t
http://ctags.sourceforge.net.http://ctags.sourceforge.net.
20070324
Kernel Linux Kernel Linux
Ferramentas Diff e Patch: Ferramentas Diff e Patch:
$$ diff ruN linuxx.y.z/ linux/ > meupatch.diff diff ruN linuxx.y.z/ linux/ > meupatch.diff
r r RecursivoRecursivouu Formato compreensivoFormato compreensivoNN Incluir arquivos novosIncluir arquivos novos
$ patch p1 < ../meupatch.diff$ patch p1 < ../meupatch.diff (diretório abaixo) (diretório abaixo)
p1p1 Indica qual ponto da árvore ele vai aplicar o patchIndica qual ponto da árvore ele vai aplicar o patchlinux/drivers/net/arquivo.clinux/drivers/net/arquivo.c
20070324
Kernel Linux Kernel Linux
Ferramentas Diff e Patch (exemplo): Ferramentas Diff e Patch (exemplo):
linux2.6.20.3.orig/ linux2.6.20.3.orig/drivers/net/ni65.cdrivers/net/ni65.c+++ linux2.6.20.3/+++ linux2.6.20.3/drivers/net/ni65.cdrivers/net/ni65.c@@ 295,7 +295,7 @@ static void ni65_set_performance(struct@@ 295,7 +295,7 @@ static void ni65_set_performance(struct */*/ static int ni65_open(struct net_device *dev)static int ni65_open(struct net_device *dev) {{ struct priv *p = (struct priv *) dev>priv; struct priv *p = (struct priv *) dev>priv;+ struct priv *p = dev>priv;+ struct priv *p = dev>priv;
20070324
Kernel Linux Kernel Linux
Ferramenta Quilt: Ferramenta Quilt:
$ $ mkdir patchesmkdir patches$ $ quilt quilt newnew nomedopatch.diff nomedopatch.diff$ $ quilt quilt addadd nome_do_arquivo nome_do_arquivo$ $ quilt quilt refreshrefresh$ $ quilt quilt toptop$ $ quilt quilt diffdiff$ $ quilt quilt pop [f] [a]pop [f] [a]$ $ quilt quilt push [f] [a]push [f] [a]$ $ quilt quilt removeremove
http://savannah.nongnu.org/projects/quilt/
20070324
Kernel Linux Kernel Linux
Enviando um patch: Enviando um patch:
Você testouVocê testou ? ?Escolheu a Escolheu a lista certalista certa? ?
Assunto:Assunto: [PATCH] arquivo.c O que ele faz [PATCH] arquivo.c O que ele faz Mensagem: Mensagem: O que o patch faz com detalhes O que o patch faz com detalhesO patch esta conforme o O patch esta conforme o CodingStyleCodingStyle??
Assinatura:Assinatura: Signedoffby: Autor <email> Signedoffby: Autor <email>
Mensagem em Mensagem em TEXTO PUROTEXTO PURO ( SEM HTML )( SEM HTML ) SEM anexosSEM anexos, patchs , patchs INLINEINLINE
No No máximo um patch por emailmáximo um patch por email ( Depende de outro patch?) ( Depende de outro patch?)
20070324
Kernel Linux Kernel Linux
Enviando um patch (exemplo): Enviando um patch (exemplo):
To:To: kerneljanitors@.... [email protected]:Subject: [PATCH] ni65.c: cleanup not needed casts [PATCH] ni65.c: cleanup not needed castsMensagem: Mensagem: Removed all unnecessary casts.Removed all unnecessary casts.Signedoffby:Signedoffby: Douglas Schilling Landgraf <[email protected]> Douglas Schilling Landgraf <[email protected]> linux2.6.20.3.orig/drivers/net/ni65.c linux2.6.20.3.orig/drivers/net/ni65.c+++ linux2.6.20.3/drivers/net/ni65.c+++ linux2.6.20.3/drivers/net/ni65.c@@ 295,7 +295,7 @@ static void ni65_set_performance(struct@@ 295,7 +295,7 @@ static void ni65_set_performance(struct */*/ static int ni65_open(struct net_device *dev)static int ni65_open(struct net_device *dev)
20070324
Instalando o código fonte: Instalando o código fonte: Diretório padrão:Diretório padrão:
/usr/src/linux/usr/src/linux (Devemos usar esse path ?) (Devemos usar esse path ?)
Descompactando:Descompactando:
$$ tar xvjf linuxxyz.tar.bz2tar xvjf linuxxyz.tar.bz2linuxx.y.z/Documentation/devicemapper/linear.txtlinuxx.y.z/Documentation/devicemapper/linear.txtlinuxx.y.z/Documentation/devicemapper/snapshot.txtlinuxx.y.z/Documentation/devicemapper/snapshot.txtlinuxx.y.z/Documentation/devicemapper/striped.txtlinuxx.y.z/Documentation/devicemapper/striped.txt
Kernel Linux Kernel Linux
20070324
Compilando: Compilando:
$$ make help make help ajudaajuda
$$ make mrproper make mrproper Remover todos os arquivos + .config + backup Remover todos os arquivos + .config + backup
$$ make config make config modo texto modo texto
$$ make menuconfig make menuconfig modo texto (ncurses) modo texto (ncurses)
$ $ make xconfigmake xconfig modo gráfico (Xwindows)modo gráfico (Xwindows)
$ $ make gconfigmake gconfig modo gráfico (GTK+)modo gráfico (GTK+)
Kernel LinuxKernel Linux
20070324
Compilando: Compilando:
Opções:Opções:[ * ][ * ] Habilitado (builtin) Habilitado (builtin) [ ] Não[ ] Não esta habilitado esta habilitado[ M ][ M ] Habilitado (Módulo) Habilitado (Módulo)
$ $ makemake Compilando o Kernel Compilando o Kernel
$ $ make modules_installmake modules_install Instalando os módulos Instalando os módulos
Kernel LinuxKernel Linux
20070324
Compilando: Compilando:
# cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz2.6.X# cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz2.6.X
vmlinuz = Kernel Linux Compactadovmlinuz = Kernel Linux Compactado# cp /usr/src/linux/System.map /boot/System.map2.6.X# cp /usr/src/linux/System.map /boot/System.map2.6.X
System.map = Tabela de SímbolosSystem.map = Tabela de Símbolos# cp /usr/src/linux/.config /boot/config2.6.X# cp /usr/src/linux/.config /boot/config2.6.X
Copiar o .config para /boot (backup)Copiar o .config para /boot (backup)
Kernel LinuxKernel Linux
20070324
Compilando: Compilando:
Será necessário criar uma imagem inicial para que o kernel carregue Será necessário criar uma imagem inicial para que o kernel carregue alguns módulos básicos (IDE, SCSI, RAID) antes de acessar o alguns módulos básicos (IDE, SCSI, RAID) antes de acessar o filesystem.filesystem.
## mkinitrd k /boot/vmlinuz2.6.X i /boot/initrd2.6.Xmkinitrd k /boot/vmlinuz2.6.X i /boot/initrd2.6.X
ouou# # mkinitrd /boot/initrd2.6.X.img 2.6.Xmkinitrd /boot/initrd2.6.X.img 2.6.X
Kernel LinuxKernel Linux
20070324
$$ vi /boot/grub/menu.list vi /boot/grub/menu.list
title Kernel2.6.Xdefaulttitle Kernel2.6.Xdefault root (hd0,5)root (hd0,5)
kernel /boot/vmlinuz2.6.Xdefault root=/dev/hda6 kernel /boot/vmlinuz2.6.Xdefault root=/dev/hda6 vga=0x314 resume=/dev/hda5 splash=silent showoptsvga=0x314 resume=/dev/hda5 splash=silent showopts
initrd /boot/initrd2.6.Xdefaultinitrd /boot/initrd2.6.Xdefault
Kernel Linux Kernel Linux
Compilando (Grub boot loader): Compilando (Grub boot loader):
20070324
$$ vi /etc/lilo/lilo.confvi /etc/lilo/lilo.conf
image=/boot/vmlinuz2.6.Xdefaultimage=/boot/vmlinuz2.6.Xdefaultlabel=2.6.Xlabel=2.6.Xroot=/dev/hda3root=/dev/hda3readonlyreadonly
$$ /sbin/lilo/sbin/lilo Grava as configuraçõesGrava as configurações$ $ rebootreboot Reiniciando o sistemaReiniciando o sistema$ $ uname auname a Exibe o kernel atualExibe o kernel atual
Kernel Linux Kernel Linux
Compilando (LILO boot loader): Compilando (LILO boot loader):
20070324
Kernel Linux Kernel Linux
Documentação: Documentação: linux2.6.X/Documentationlinux2.6.X/Documentation
Linux Kernel Development 2Linux Kernel Development 2rd rd Edition Edition (Robert Love) (Robert Love) ISBN: 0672327201ISBN: 0672327201Linux Device Drivers 3Linux Device Drivers 3rdrd Edition Edition (Cobert, Rubini, KroahHartman) (Cobert, Rubini, KroahHartman)ISBN: 0596005903ISBN: 0596005903Versão Online (free)Versão Online (free): : http://kroah.com/lkn/http://kroah.com/lkn/Linux Weekly NewsLinux Weekly Newshttp://www.lwn.nethttp://www.lwn.netGoogleGooglehttp://www.google.comhttp://www.google.com
20070324
Dúvidas ?Dúvidas ?Sugestões?Sugestões?
http://tchelinux.orghttp://tchelinux.orghttp://dougsland.livejournal.comhttp://dougsland.livejournal.com
Palestrante: Douglas Schilling LandgrafEmail: [email protected]