Desenvolvimento
 do Kernel Linux
        Versões 2.6.X

   http://www.tchelinux.org

  Douglas Schilling Landgraf
Email: d...
Kernel Linux



  ●
      Sobre o palestrante
  ●
      Sobre a palestra




30/09/07
Kernel Linux

   Dicas Iniciais:

     - Kernel não é algo místico :)
     - Máquina exclusiva para desenvolvimento (VM po...
Kernel Linux

   Licença:
   ●
       GPL ( versão 2 )
       http://www.gnu.org/copyleft/gpl.html


   Como funciona?
   ...
Kernel Linux

   Como ajudar ?


     - Você é desenvolvedor ?
     - Você NÃO tem medo de crashs ?
     - Você sabe inglê...
Kernel Linux

   Onde começar ? TODO List ?

               http://www.kernelnewbies.org
               http://br.kernelne...
Kernel Linux

   Definição:

  ●
      É no kernel que estão definidas funções para operação com periféricos
      (mouse,...
Kernel Linux

                               User-Space


                       Aplicativo 1    Aplicativo 2




        ...
Kernel Linux

    Onde obter o código fonte ?
            http://www.kernel.org
            ftp://ftp.kernel.org/pub
     ...
Kernel Linux

   Diretórios:
           arch/            Código específico de arquitetura (i386, mk68..)
           block/...
Kernel Linux

   Diretórios:
           lib/        Bibliotecas
           mm/         Gerenciamento de Memória
          ...
Kernel Linux

   Design: Monolítico versus MicroKernel
  ●
      Monolítico:
           ●
               Criado em meados ...
Kernel

    Exemplo:

         Monolítico                      MicroKernel


            Kernel                           ...
Kernel Linux

  Linux Design:
  ●
      Executa em um único processo
  ●
      Kernel Linux é monolítico
  ●
      Impleme...
Kernel Linux

   Versões:

    Estáveis:
                ●
                    Correções de bugs
                ●
       ...
Kernel Linux

   Versões:
                                   2.6.0
    Versão principal é 2                         Releas...
Kernel Linux

   Versões:

   E hoje como funciona ?

      ●
           Hoje só temos a versão 2.6.X
      ●
           D...
Kernel Linux

   CodingStyle:

                  Identação         1 TAB = 8 caracteres (!= 8 espaços)
                  C...
Kernel Linux

   CodingStyle:

           Funções:
                         1, 2 páginas?
                         < 10 va...
Kernel Linux

   CodingStyle:

           Ferramenta indent:

           $ indent -kr -i8 -ts8 -sob -180 -ss -bs -ps1 <arq...
Kernel Linux

   Kbuild (compilação):

       Kbuild é um framework para escrever Makefiles simples para tarefas
       co...
Kernel Linux

   Kbuild (exemplo):

   Módulos externos

            make -C <path> M=`pwd`


   Módulos (Kernel que esta ...
Kernel Linux

   Compilando/Carregando/Listando/Descarregando:

                                                 Atenção a...
Kernel Linux

   hello.c

   #include <linux/init.h>
   #include <linux/module.h>

   static int __init hello_init(void)
 ...
Kernel Linux

   hello.c                                  Onde esta o main() ? :)

   static void __exit hello_exit(void)
...
Kernel Linux

   hello.c

           E para adicionar parâmetros ?

           module_param(io, int, 0);
           MODULE...
Kernel Linux

   hello.c

           Exportando Símbolos

           O kernel tem centenas de funções e estruturas globais...
Kernel Linux

   hello.c


           Como adicionar uma entrada no /proc ?

           create_proc_read_entry()
         ...
Kernel Linux

   hello.c


   Como adicionar uma entrada no /dev e /sys ?


       KERNEL =”hello” executa o resto das reg...
Kernel Linux

   Interfaces com o Kernel

           Externas:

               - System Calls
               - Interface e...
Kernel Linux

   System Calls (trace)

           - Faz o trace das chamadas de sistemas (system calls)
           - ptrac...
Kernel Linux

   Sistema de log - Timestamps
           Kernel hacking
               [*] Show timing information on print...
Kernel Linux

   Sistema de log - printk():


     Sistema de log via /proc/kmsg
     Klog -> /proc/kmsg -> syslogd

     ...
Kernel Linux

   Sistema de log - printk():


     printk(KERN_WARNING “mensagem de warning!n”);
     printk(KERN_DEBUG “m...
Kernel Linux

   Ferramentas:


     diff         Ferramenta para comparar arquivos
     patch        Ferramenta para apli...
Kernel Linux
                                                       Autor: Linus Torvalds.
 git / gitk:
                  ...
Kernel Linux

   Ctags:

     $ make tags

     $ vi .vimrc
         set tags=/usr/src/linux/tags

     :ta printk
     $ ...
Kernel Linux

   Ferramentas Diff e Patch:

     $ diff -ruN linux-x.y.z/ linux/ > meu-patch.diff

     -r     Recursivo
 ...
Kernel Linux

   Ferramentas Diff e Patch (exemplo):

   --- linux-2.6.20.3.orig/drivers/net/ni65.c
   +++ linux-2.6.20.3/...
Kernel Linux

   Ferramenta Quilt:

           $ mkdir patches
           $ quilt new nome-do-patch.diff
           $ quil...
Kernel Linux

   Assinaturas em patches:

       Signed-off-by: Assinatura
       Signed-off-by: Douglas Landgraf <dougsla...
Kernel Linux

   Enviando um patch:

     SEM anexos, patchs INLINE
     Mensagem em TEXTO PURO ( SEM HTML )
     Você tes...
Kernel Linux

   Enviando um patch (exemplo):

     To: kerneljanitors@....
     Subject: [PATCH] ni65.c: cleanup not need...
Kernel Linux

   Instalando o código fonte:
  Diretório padrão:
           /usr/src/linux (Devemos usar esse path ?)

  De...
Kernel Linux

   Compilando:

  $ make help        ajuda
  $ make mrproper    Remover todos os arquivos + .config + backup...
Kernel Linux

   Compilando (opções):
    [ * ] - Habilitado (built-in) [   ] - Não esta habilitado
            [ M ] - Ha...
Kernel Linux

   Compilando (Cross-Compilation):

  Exemplo 1:
  $> export CROSS_COMPILE=”powerpc-cross-compile-aqui”
  $>...
Kernel Linux

   Compilando:

  # cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.6.X
           vmlinuz = Kernel...
Kernel Linux

   Compilando:

   # cp /usr/src/linux/System.map /boot/System.map-2.6.X

   System.map contém:

           ...
Kernel Linux

   Compilando:

  Será necessário criar uma imagem inicial para que o kernel carregue
  alguns módulos básic...
Kernel Linux

   Compilando (Grub boot loader):

           $ vi /boot/grub/menu.list

               title Kernel-2.6.X-d...
Kernel Linux

   Compilando (LILO boot loader):

  $ vi /etc/lilo/lilo.conf
     image=/boot/vmlinuz-2.6.X-default
       ...
Kernel Linux

   Documentação:

     linux-2.6.X/Documentation

     Linux Kernel Development 2rd Edition (Robert Love)
  ...
Dúvidas ?
                 Sugestões?
                   http://tchelinux.org
           http://dougsland.livejournal.com
...
Próximos SlideShares
Carregando em…5
×

Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling Landgraf

2.134 visualizações

Publicada em

Publicada em: Tecnologia
0 comentários
4 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
2.134
No SlideShare
0
A partir de incorporações
0
Número de incorporações
4
Ações
Compartilhamentos
0
Downloads
74
Comentários
0
Gostaram
4
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Desenvolvimento do Kernel Linux Versões 2.6.X - Douglas Schilling Landgraf

  1. 1. Desenvolvimento do Kernel Linux Versões 2.6.X http://www.tchelinux.org Douglas Schilling Landgraf Email: dougsland@tchelinux.org OpenOffice Template by: Chih-Hao Tsai
  2. 2. Kernel Linux ● Sobre o palestrante ● Sobre a palestra 30/09/07
  3. 3. Kernel Linux Dicas Iniciais: - Kernel não é algo místico :) - Máquina exclusiva para desenvolvimento (VM pode?) - Precisa saber inglês ? - Desenvolvimento não é igual ao “dia-dia” - Crashs repentinos ? - Kernel, uma coleção de rotinas ? - Cliente de email 30/09/07
  4. 4. Kernel Linux Licença: ● GPL ( versão 2 ) http://www.gnu.org/copyleft/gpl.html Como funciona? ● Podemos baixar o software e alterar, desde que publiquemos este software com as licenças originais, incluindo a disponibilização do código fonte. 30/09/07
  5. 5. Kernel Linux Como ajudar ? - Você é desenvolvedor ? - Você NÃO tem medo de crashs ? - Você sabe inglês ? - Gosta de traduzir ? 30/09/07
  6. 6. Kernel Linux Onde começar ? TODO List ? http://www.kernelnewbies.org http://br.kernelnewbies.org/ http://kerneljanitors.org http://kernelnewbies.org/KernelJanitors/Todo http://kernelnewbies.org/KernelMentors http://www.kernel.org 30/09/07
  7. 7. Kernel Linux Definição: ● É no kernel que estão definidas funções para operação com periféricos (mouse, discos, impressoras, interface serial/interface paralela, usb etc.), gerenciamento de memória, entre outros. ● Coleção de rotinas que oferecem, recursos para programas tradicionais. 30/09/07
  8. 8. Kernel Linux User-Space Aplicativo 1 Aplicativo 2 System Call Interface (open, close, brk (malloc), etc) Kernel-Space Kernel Subsystems Device Drivers Hardware 30/09/07
  9. 9. Kernel Linux Onde obter o código fonte ? http://www.kernel.org ftp://ftp.kernel.org/pub rsync://rsync.kernel.org/pub/ Alguns dados: ~= 9.000 arquivos C ~= 10.000 headers ~= 800 arquivos assembly DADOS: Professional Linux Programming 2007 30/09/07
  10. 10. Kernel Linux Diretórios: arch/ Código específico de arquitetura (i386, mk68..) block/ Dispositivos de bloco (e.x: HDs) crypto/ API de criptografia Documentation/ Documentação drivers/ Device Drivers fs/ File systems include/ Headers init/ Kernel boot ipc/ Interprocess communication kernel/ Core do Kernel 30/09/07
  11. 11. Kernel Linux Diretórios: lib/ Bibliotecas mm/ Gerenciamento de Memória net/ Sistema de Rede scripts/ Scripts de configuração security/ Subsistema de segurança (SELinux) sound/ Susbsistema de som (ALSA/OSS) usr/ initramfs 30/09/07
  12. 12. Kernel Linux Design: Monolítico versus MicroKernel ● Monolítico: ● Criado em meados de 1980 ● Um grande e único processo (imenso) ● Comunicação trivial (todos rodam em um único processo) ● MicroKernel: ● Separado em dois processos (“servers” / user-space) ● Comunicação via IPC (interprocess communication) ● Modularidade 30/09/07
  13. 13. Kernel Exemplo: Monolítico MicroKernel Kernel Kernel IPC Softwares Servers Softwares IPC = Interprocess Communication 30/09/07
  14. 14. Kernel Linux Linux Design: ● Executa em um único processo ● Kernel Linux é monolítico ● Implementa recursos do microkernel design ● Capacidade de carregar dinamicamente módulos ● Suporte a processadores SMP (symmetrical multiprocessor) ● Sistema de acesso ao dispositivos (sysfs) 30/09/07
  15. 15. Kernel Linux Versões: Estáveis: ● Correções de bugs ● Novos drivers Desenvolvimento: Alterações frequentes e drásticas ● Desenvolvedores testam novas soluções ● 30/09/07
  16. 16. Kernel Linux Versões: 2.6.0 Versão principal é 2 Release é 0 Versão secundária é 6 (estável) No passado como eram as versões ? Números pares = versões estáveis Ex.: (2.0, 2.4) Números ímpares = versões de desenvolvimento Ex.: (1.3, 2.3) Ex.: linux-2.6.20.3.tar.bz2 30/09/07
  17. 17. Kernel Linux Versões: E hoje como funciona ? ● Hoje só temos a versão 2.6.X ● Decisão tomada no Linux Kernel Developers Summit ( 2004 ) ● Todas novas implementações são enviadas para o Andrew Morton (Árvore -mm) ● Após tornar-se estável o patch entra na versão principal. ● Versão 2.7 ~= Árvore -mm 30/09/07
  18. 18. Kernel Linux CodingStyle: Identação 1 TAB = 8 caracteres (!= 8 espaços) Colunas 80 if (teste) { blah(); } else { bleh(); } if (foo) bar(); $ linux/Documentation/CodingStyle 30/09/07
  19. 19. Kernel Linux CodingStyle: Funções: 1, 2 páginas? < 10 variáveis locais ? Comentários: /* * Olá, Eu sou um comentário! */ Outros: typedef, structs, etc. 30/09/07
  20. 20. Kernel Linux CodingStyle: Ferramenta indent: $ indent -kr -i8 -ts8 -sob -180 -ss -bs -ps1 <arquivo> ou $ scripts/Lindent 30/09/07
  21. 21. Kernel Linux Kbuild (compilação): Kbuild é um framework para escrever Makefiles simples para tarefas complicadas. :) - Economiza nosso tempo - Comportamento similar em todas as plataformas suportadas - Internamente ele se basea em complexos templates - Atualmente poucas pessoas realmente sabem como ele funciona 30/09/07
  22. 22. Kernel Linux Kbuild (exemplo): Módulos externos make -C <path> M=`pwd` Módulos (Kernel que esta em execução) make -C /lib/modules/`uname -r`/build M=`pwd` 30/09/07
  23. 23. Kernel Linux Compilando/Carregando/Listando/Descarregando: Atenção aos WARNINGS $ linux/drivers/net> vi hello.c $ linux/drivers/net> vi Makefile $ insmod ./hello.ko $ modprobe hello.ko (procura por dependências) $ lsmod (lista os módulos carregados em memória) $ modinfo ./hello.ko $ modprobe -r hello $ rmmod hello.ko 30/09/07
  24. 24. Kernel Linux hello.c #include <linux/init.h> #include <linux/module.h> static int __init hello_init(void) { printk(KERN_ALERT "hello!n"); return 0; } 30/09/07
  25. 25. Kernel Linux hello.c Onde esta o main() ? :) static void __exit hello_exit(void) { printk(KERN_ALERT "Goodbyen"); } MODULE_LICENSE("GPL"); MODULE_AUTHOR("Douglas Landgaf <dougslan@tchelinux.org>"); MODULE_DESCRIPTION("Um modulo hello world!"); module_init(hello_init); module_exit(hello_exit); 30/09/07
  26. 26. Kernel Linux hello.c E para adicionar parâmetros ? module_param(io, int, 0); MODULE_PARM_DESC(io, "Informa o io do modulo! "); $ insmod ./hello io=0x300 30/09/07
  27. 27. Kernel Linux hello.c Exportando Símbolos O kernel tem centenas de funções e estruturas globais Responsável: /boot/System.map-versao-kernel /proc/kallsyms Module.symvers – informa os símbolos visiveis shell> cat /lib/modules/`uname -r`/build/Module.symvers | wc -l EXPORT_SYMBOL(funcao); EXPORT_SYMBOL_GPL(funcao); 30/09/07
  28. 28. Kernel Linux hello.c Como adicionar uma entrada no /proc ? create_proc_read_entry() remove_proc_entry() 30/09/07
  29. 29. Kernel Linux hello.c Como adicionar uma entrada no /dev e /sys ? KERNEL =”hello” executa o resto das regras quando aparecer hello /sys SYMLINK += (append) adicionar hello_world na lista de símbolos que devem ser criados MODE = 0444 – permite (dono, group e outros lerem) 30/09/07
  30. 30. Kernel Linux Interfaces com o Kernel Externas: - System Calls - Interface entre (userspace) e o Kernel - Solicitações de acesso via system calls - /proc e /sys Internas: - Símbolos exportados pelos módulos (EXPORT_SYMBOL) - Ex.: printk – chamadas pública 30/09/07
  31. 31. Kernel Linux System Calls (trace) - Faz o trace das chamadas de sistemas (system calls) - ptrace() $ strace ls $ strace -o saida.txt kradio (programa) -> (open) GLIBC /lib/libc.so.6 -> (sys_open) 30/09/07
  32. 32. Kernel Linux Sistema de log - Timestamps Kernel hacking [*] Show timing information on printks Magic SysRq Keys Tecla SysRq pode atribuir funções durante a execução ou travamento. 1. Alt + SysRq + R – takes the keyboard out of raw mode. 2. Alt + SysRq + E – terminates all processes (except init). 3. Alt + SysRq + I – kills all processes (except init). 4. Alt + SysRq + S – synchronizes the disk. 5. Alt + SysRq + U – remounts all filesystems read-only. 6. Alt + SysRq + B – reboots the machine. 30/09/07
  33. 33. Kernel Linux Sistema de log - printk(): Sistema de log via /proc/kmsg Klog -> /proc/kmsg -> syslogd printk() ~= printf() 30/09/07
  34. 34. Kernel Linux Sistema de log - printk(): printk(KERN_WARNING “mensagem de warning!n”); printk(KERN_DEBUG “mensagem de debug!n”); printk(<1> “mensagem de alerta!!n”); <linux/kernel.h> valores das MACROS {0,1,2,3, ... 7} Prioridade: 0 -> 7 30/09/07
  35. 35. Kernel Linux Ferramentas: diff Ferramenta para comparar arquivos patch Ferramenta para aplicar patchs quilt Scripts para manutenção de patchs vimdiff Feramenta para comparar arquivos qemu Emulador git Controle de fontes/versões hg Mercurial ctags Tags no código fonte cscope Navega no código fonte ketchup Ferramenta para atualização do kernel 30/09/07
  36. 36. Kernel Linux Autor: Linus Torvalds. git / gitk: Mantenedor: Junio Hamano Clonando árvore do Linus: $ git clone Manter árvore atualizada: $ git pull Fazer um Commit: $ git commit Log: $ git log $ git init-db / $git add . / git commit / git remove / git diff $ git branch teste / $git checkout teste 30/09/07
  37. 37. Kernel Linux Ctags: $ make tags $ vi .vimrc set tags=/usr/src/linux/tags :ta printk $ vim -t printk CTRL + ] CTRL + t http://ctags.sourceforge.net. 30/09/07
  38. 38. Kernel Linux Ferramentas Diff e Patch: $ diff -ruN linux-x.y.z/ linux/ > meu-patch.diff -r Recursivo -u Formato compreensivo -N Incluir arquivos novos $ patch -p1 < ../meu-patch.diff (diretório abaixo) -p1 Indica qual ponto da árvore ele vai aplicar o patch linux/drivers/net/arquivo.c 30/09/07
  39. 39. Kernel Linux Ferramentas Diff e Patch (exemplo): --- linux-2.6.20.3.orig/drivers/net/ni65.c +++ linux-2.6.20.3/drivers/net/ni65.c @@ -295,7 +295,7 @@ static void ni65_set_performance(struct */ static int ni65_open(struct net_device *dev) { - struct priv *p = (struct priv *) dev->priv; + struct priv *p = dev->priv; 30/09/07
  40. 40. Kernel Linux Ferramenta Quilt: $ mkdir patches $ quilt new nome-do-patch.diff $ quilt add nome_do_arquivo $ quilt refresh $ quilt top $ quilt diff $ quilt pop [-f] [-a] $ quilt push [-f] [-a] $ quilt remove http://savannah.nongnu.org/projects/quilt/ 30/09/07
  41. 41. Kernel Linux Assinaturas em patches: Signed-off-by: Assinatura Signed-off-by: Douglas Landgraf <dougsland@gmail.com> Acked-by: OK, sem problemas Acked-by: Douglas Landgraf <dougsland@gmail.com> Reviewed-by: Análise / Teste Reviewed-by: Douglas Landgraf <dougsland@gmail.com> 30/09/07
  42. 42. Kernel Linux Enviando um patch: SEM anexos, patchs INLINE Mensagem em TEXTO PURO ( SEM HTML ) Você testou ? Escolheu a lista certa? O patch esta conforme o CodingStyle? Mensagem: O que o patch faz com detalhes Assunto: [PATCH] arquivo.c O que ele faz Assinatura: Signed-off-by: Autor <email> No máximo um patch por email ( Depende de outro patch?) 30/09/07
  43. 43. Kernel Linux Enviando um patch (exemplo): To: kerneljanitors@.... Subject: [PATCH] ni65.c: cleanup not needed casts Mensagem: Removed all unnecessary casts. Signed-off-by: Douglas Schilling Landgraf <dougsland@gmail.com> --- linux-2.6.20.3.orig/drivers/net/ni65.c +++ linux-2.6.20.3/drivers/net/ni65.c @@ -295,7 +295,7 @@ static void ni65_set_performance(struct */ static int ni65_open(struct net_device *dev) 30/09/07
  44. 44. Kernel Linux Instalando o código fonte: Diretório padrão: /usr/src/linux (Devemos usar esse path ?) Descompactando: $ tar xvjf linux-x-y-z.tar.bz2 linux-x.y.z/Documentation/device-mapper/linear.txt linux-x.y.z/Documentation/device-mapper/snapshot.txt .config - O que é ? $ /proc/config.gz $ /boot/config-2-6-x-y-z 30/09/07
  45. 45. Kernel Linux Compilando: $ make help ajuda $ make mrproper Remover todos os arquivos + .config + backup $ make config modo texto $ make menuconfig modo texto (ncurses) $ make xconfig modo gráfico (Xwindows) $ make gconfig modo gráfico (GTK+) 30/09/07
  46. 46. Kernel Linux Compilando (opções): [ * ] - Habilitado (built-in) [ ] - Não esta habilitado [ M ] - Habilitado (Módulo) $ make Compilando o Kernel $ make modules_install Instalando os módulos ou $ make modules_install INSTALL_MOD_PATH=/tmp $ depmod -a 2.6.x.y Disponibilizar módulos para modprobe 30/09/07
  47. 47. Kernel Linux Compilando (Cross-Compilation): Exemplo 1: $> export CROSS_COMPILE=”powerpc-cross-compile-aqui” $> ARCH=powerpc make menuconfig $> ARCH=powerpc make Exemplo 2: $> make ARCH=x86_64 defconfig $> make ARCH=arm CROSS_COMPILE=/usr/local/bin/arm-linux- 30/09/07
  48. 48. Kernel Linux Compilando: # cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.6.X vmlinuz = Kernel Linux Compactado # cp /usr/src/linux/.config /boot/config-2.6.X Copiar o .config para /boot (backup) 30/09/07
  49. 49. Kernel Linux Compilando: # cp /usr/src/linux/System.map /boot/System.map-2.6.X System.map contém: * Tabela de símbolos exportados (usados na depuração) * A ferramenta top utiliza essa tabela 30/09/07
  50. 50. Kernel Linux Compilando: Será necessário criar uma imagem inicial para que o kernel carregue alguns módulos básicos (IDE, SCSI, RAID) antes de acessar o filesystem. # mkinitrd -k /boot/vmlinuz-2.6.X -i /boot/initrd-2.6.X ou # mkinitrd /boot/initrd-2.6.X.img 2.6.X 30/09/07
  51. 51. Kernel Linux Compilando (Grub boot loader): $ vi /boot/grub/menu.list title Kernel-2.6.X-default root (hd0,5) kernel /boot/vmlinuz-2.6.X-default root=/dev/hda6 vga=0x314 resume=/dev/hda5 splash=silent showopts initrd /boot/initrd-2.6.X-default 30/09/07
  52. 52. Kernel Linux Compilando (LILO boot loader): $ vi /etc/lilo/lilo.conf image=/boot/vmlinuz-2.6.X-default label=2.6.X root=/dev/hda3 read-only $ /sbin/lilo Grava as configurações $ reboot Reiniciando o sistema $ uname -a Exibe o kernel atual 30/09/07
  53. 53. Kernel Linux Documentação: linux-2.6.X/Documentation Linux Kernel Development 2rd Edition (Robert Love) ISBN: 0-672327201 Linux Device Drivers 3rd Edition (Cobert, Rubini, Kroah-Hartman) ISBN: 0-596-00590-3 Versão Online (free): http://kroah.com/lkn/ Linux Weekly News http://www.lwn.net Google http://www.google.com 30/09/07
  54. 54. Dúvidas ? Sugestões? http://tchelinux.org http://dougsland.livejournal.com Douglas Schilling Landgraf Email: dougsland@tchelinux.org 30/09/07

×