Sistemas Embarcados kernel linux Introdução O kernel do linux é bastante modular Mais de 20000 arquivos Porque gerar/instalar um novo kernel? Customizar para uma determinada necessidade/aplicação Incluir novas características Corrigir erros ou falhas de segurança Etapas: Recuperar os fontes do kernel Selecionar características desejáveis (configuração) Compilar o Kernel Instalação do Kernel e de seus módulos Aula 03 e 04 2 Repositórios do kernel kernel.org Repositório oficial para o código fonte é www.kernel.org Cópia completa da versão atual e das antecessoras Patches Recuperar e aplicar os patches na ordem Possui ± 25 arquiteturas diferentes, mas há site específicos para processadores embarcados Exemplos ARM: http://www.arm.linux.org.uk/developer Na verdade apenas patches MIPS: http://www.linux-mips.org PowerPC: http://penguinppc.org Ainda não integrados devido a maturidade ou especificidade Baixe os fontes do Núcleo a partir de: http://kernel.org 3 4
Que versão usar? Versionamento do kernel Linux A versão atual do kernel é a 2.6 (2.6.0 lançada em 12/2003) Desde então, características e novos drivers foram introduzidos. Difícil obter drivers de novos dispositivos para a versão anterior (2.4). Não há mais suporte da comunidade. Evitar todo e qualquer desenvolvimento com 2.4 Até 2004 : série.major.releases.updates série: 0 (nascimento) 1 (capacidade rede) 2 (SMP e não Intel) major: par (versão estável), impar (versão desenvolvimento) release: adições e correções maiores a uma versão Release candidate (rc): release para teste updates: correções críticas na última release estável Após lançamento da 2.6.11(2004): Primeiros dois números são estáveis (2.6) Terceiro número é a versão atual do núcleo (2.6.32) Quarto número marca atualizações para correções de defeitos e segurança (2.6.32.16) Ainda vale as release candidates 5 6 Estrutura de arquivos dos fontes linux (parcial 1/2) Estrutura de arquivos dos fontes linux (parcial 2/2) arch/<arch> arch/<arch>/mach-<mach> block/ COPYING CREDITS crypto/ Documentation/ drivers/ fs/ include/ include/asm-<arch> include/linux init/ Architecture specific code Machine / board specific code Block layer core Linux copying conditions (GNU GPL) Linux main contributors Cryptographic libraries Kernel documentation. Don't miss it! All device drivers except sound ones (usb, pci...) Filesystems (fs/ext3/, etc.) Kernel headers Architecture and machine dependent headers Linux kernel core headers Linux initialization (including main.c) ipc/ Kbuild kernel/ lib/ MAINTAINERS Makefile mm/ net/ README REPORTING-BUGS scripts/ security/ sound/ usr/ Code used for process communication Part of the kernel build system Linux kernel core (very small!) Misc library routines (zlib, crc32...) Maintainers of each kernel part. Very useful! Top Linux makefile (sets arch and version) Memory management code (small too!) Network support code (not drivers) Overview and building instructions Bug report instructions Scripts for internal or external use Security model implementations (SELinux...) Sound support code and drivers Code to generate an initramfs cpio archive. 7 8
Arquivos.config, System.map e vmlinux.config.config Arquivo texto com constantes definidas Parâmetros para configuração do kernel System.map Lista dos símbolos usados pelo kernel e seus endereços Útil para depuração do kernel Gerado na compilação no diretório top-level vmlinux Imagem do kernel (resultado ligação de biblioteca e objetos) Executável em formato ELF (Executable and Linking Format) Arquitetura dependente Gerado na compilação no diretório top-level Primeiro passo para compilar o kernel é configurar Geração do arquivo.config Resposta a mais de 700 questões (Yes, No, Module) Várias formas: config, menuconfig, xconfig, gconfig, oldconfig, randconfig, defconfig, allmodconfig, allyesconfig e allnoconfig Arquivo.config é removido por alguns scripts Interessante preservar cópia dele para evitar (+700 questões!!) 9 10 make xconfig screenshot Trecho exemplo de um.config CD-ROM/DVD Filesystems CONFIG_ISO9660_FS=m CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_UDF_FS=y CONFIG_UDF_NLS=y Section name (helps to locate settings in the interface) All parameters are prefixed with CONFIG_ DOS/FAT/NT Filesystems CONFIG_MSDOS_FS is not set CONFIG_VFAT_FS is not set CONFIG_NTFS_FS=m CONFIG_NTFS_DEBUG is not set CONFIG_NTFS_RW=y 11 12
Alguns detalhes quanto ao config Makefile principal O kernel é uma estrutura monolítica Compilado e ligado estaticamente para gerar um executável único Problema de tamanho Capacidade de adicionar on-the-fly características ao kernel Loadable modules Formas de responder as perguntas Y : ligado estaticamente N : não faz parte do kernel M : usado como módulo Inclui uma forma de versionamento Manter várias gerações de um sistema de forma organizada Constantes: VERSION, PATCHLEVEL, SUBLEVEL, EXTRAVERSION e.g. 2.6.20-asc (2, 6, 20 e asc, respectivamente) Se tudo está devidamente instalado Compila o kernel gerando o System.map e vmlinux Gerado uma versão compactada do kernel (vmlinux) Nomes para: x86 zimage (<512 MB), bzimage (>512 MB) Núcleo em si é bastante pequeno, o que engorda a imagem são os drivers de dispositivos, suporte a vários protocolos de rede e a sistemas de arquivos etc 13 14 Loadable kernel modules Dependências de Módulos Módulos servem para adicionar uma funcionalidade ao kernel Drivers de dispositivos, sistemas de arquivos etc Podem ser carregados e removidos a qualquer momento Possível manter em memória apenas quando necessário Uma vez em memória tem acesso total a estruturas do kernel Útil para manter o tamanho do kernel o menor possível Essencial em sistemas GNU/Linux para PCs Podem ser ligados estaticamente ao kernel Permite liberar apenas binário de um determinado driver Atenção: lembrar da contaminação da GPL Forma prática para desenvolver e testar drivers sem gerar um novo kernel Lista de dependências de um modulo Armazenado em /lib/modules/<version>/modules.dep Gerado automaticamente a partir dos símbolos que são exportados or um módulo e.g.: módulo B depende de um módulo A se ele empregar um simbolo exportado pelo módulo B Caso real: usb_storage depende do usbcore Possível, como root, atualizar o arquivo de dependências depmod -a [<version>] Na compilação do kernel se deve gerar os módulos e realizar a sua instalação 15 16
Plataforma PC: para o(a) apressadinho(a)... Do bootloader para userspace Após baixar os fontes em um diretório qualquer ($DIR) make mrproper make defconfig ou make oldconfig (reaproveitar um.config) Aproveita um.config existente e são apenas as questões que não foram respondidas (existiam) no.config anterior Ex.: cp /boot/config-2.6.26 26 /usr/src/linux/.configconfig make clean make make install make modules_install update-initramfs c k [versão kernel] Existem outras formas de gerar o initrd.img, essa é a mais fácil Versão, por exemplo, 2.6.30 Editar o arquivo /boot/grub/menu.lst Bootloader Low level hardware initialization Fetch and copy Linux kernel to RAM Kernel initialization init process System initialization from userspace 17 18 Kernel bootstrap Kernel bootstrap A inicialização do kernel faz parte da geração da imagem objcopy gzip as as objcopy... LD vmlinux SYSMAP System.map SYSMAP.tmp_System.map MODPOST vmlinux Kernel: arch/arm/boot/image is ready AS arch/arm/boot/compressed/head.o GZIP arch/arm/boot/compressed/piggy.gz AS arch/arm/boot/compressed/piggy.o CC arch/arm/boot/compressed/misc.o AS arch/arm/boot/compressed/head-xscale.o AS arch/arm/boot/compressed/head-sharpsl.o LD arch/arm/boot/compressed/vmlinux OBJCOPY arch/arm/boot/zimage Kernel: arch/arm/boot/zimage is ready... Exemplo parcial de uma geração para processador xscale vmlinux Kernel proper : Raw kernel executable (ELF object) Image Stripped kernel binary (binary object) piggy.gz piggy.s Compressed kernel binary piggy.o head.o misc.o head-cpu.o head-board.o asm wrapper around piggy.gz + bootstrap code vmlinux (in arch/<arch> boot/compressed) Composite kernel image (ELF object) zimage Kernel image for bootloader (binary object) 19 20
Bootstrap code Tarefas do código de bootstrap head.o: Código dependente da arquitetura Executado pelo bootloader head-cpu.o (no exemplo é head-xscale.o): Código específico da CPU A principal tarefa é feita pelo head.o Verificação da arquitetura e do processador Configuração da MMU, criação da tabela de páginas e habilitação da memória virtual Realiza chamada a função start_kernel no arquivo /init/main.c Programação interrupções, MMU, modo de operação etc head-board.o (aqui head-sharpsl.o): Código específico para inicialização da placa (BSP) misc.o: Rotinas de descompactação Procedimentos são praticamente os mesmos para todas arquiteturas 21 22 Código de init_post Grafo de inicialização do kernel Kernel Linux 2.6.22 Arquivo init/main.c 23 24
Principais passos da inicialização Visão genérica do procedimento de boot linux* Bootloader executa o código de bootstrap Bootstrap inicializa a placa, processador e descomprime o código do kernel na RAM Chama start kernel Inicializa console Inicializa serviços do kernel (alocação de memória, cache, esclonamento,...) Cria um novo fluxo Chama start_kernel Será o processo initit e faz laço de idle Inicializa e executa as init calldispositivos Startup do sistema Estágio 1 -bootloader Estágio 2 -bootloader init BIOS ou Boot monitor (flash ou ROM) Master Boot Record (MBR) Lilo, grub etc. Linux Espaço de usuário * Considerando arquiteturas do tipo IA32/AMD 25 26 Startup do sistema Startup do sistema Estágio 1 -bootloader Estágio 2 -bootloader (IA32/AMD) Estágio 1 -bootloader Estágio 2 -bootloader init init Imagem do núcleo é um arquivo comprimido Compressão é feita com um formato apropriado (zlib) Código do núcleo comprimido Cabeçalho composto por um programa de descompactação Código do núcleo é posto na memória Passa o controle para uma função específica (startup_32) Exemplos: IA32/AMD: zimage ( <512 KB) ou bzimage (>512 KB) ARM-Cirrus: zimage (1.6 MB) Seqüência de inicialização do núcleo Bastante similar entre distintas plataformas start()./arch/i386/boot/head.s decompress_kernel./arch/i386/boot/compress/misc.c startup_32./arch/i386/compress/head.s startup_32./arch/i386/kernel/head.s start_kernel()./init/main.c cpu_idle()./init/main.c 27 28