O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

TDC2016SP - Trilha Linux Embarcado

181 visualizações

Publicada em

Uma conversa entre o bootloader e o kernel

Publicada em: Educação
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

TDC2016SP - Trilha Linux Embarcado

  1. 1. Globalcode – Open4education Linux Embarcado Uma conversa entre o Bootloader e o Kernel Bruno Eduardo de Oliveira Meneguele Engenheiro de Computação
  2. 2. Globalcode – Open4education Agenda Introdução Plataformas Embarcadas Bootloaders Linux Kernel Transferência de dados ATAGs Device Tree Blobs DTB vs FEX
  3. 3. Globalcode – Open4education Introdução Para esta nossa conversa: Qual é a motivação para realizar ou assistir? Qual é o objetivo? Para quem se destina ou interessa?
  4. 4. Globalcode – Open4education Diferenças entre plataformas embarcadas e PCs (desktops e notebooks) atuais.
  5. 5. Globalcode – Open4education Desktops/Notebooks Arquitetura mais autocontida e estática. Descoberta dinâmica de componentes de HW. Protocolos com mecanismos de descoberta: USB, PCI, LPC, entre outros. Uma única fonte e interface de alimentação. Arquitetura de processadores “única”: x86(_64).
  6. 6. Globalcode – Open4education Plataformas Embarcadas Arquitetura totalmente dinâmica e sem um determinado padrão. Múltiplos domínios e fontes de alimentação: Componentes que necessitam de 12V, 5V, 3V3, 2V8, ... Baterias recarregáveis. USB ou alimentação externa direta (12V, 5V, ...). Múltiplas interfaces de comunicação “primitivas”: I²C, SPI, UART, entre outras. GPIOs
  7. 7. Globalcode – Open4education Plataformas Embarcadas Múltiplos clocks independentes para periféricos ou subsistemas da plataforma. Toda esta imprevisibilidade nos leva a concluir: É necessário saber como o sistema inicializa e como descrever o hardware presente na plataforma (SoC e Board).
  8. 8. Globalcode – Open4education Como funciona a inicialização de uma plataforma embarcada?
  9. 9. Globalcode – Open4education Inicialização Antes de mais nada é necessário criar o contexto de execução: Configurações internas à CPU. Executar sobre memória DRAM. Iniciar pilha para execução de códigos de alto nível, como os escritos em linguagem C. Necessidade de drivers: Controlador para DRAM. Controlador para memória não-volátil flash NAND. Bootloaders
  10. 10. Globalcode – Open4education Bootloaders Os bootloaders são pedaços de códigos responsáveis por: Inicialização básica do hardware. Carregar aplicação binária, como um sistema operacional. Execução desta aplicação binária. Além destas, possibilidade de: Inspeção de memória. Diagnóstico de hardware. Interface com o usuário.
  11. 11. Globalcode – Open4education Bootloaders Inicialização a partir da ROM interna. Endereço preestabelecido pelo fabricando. Execução em dois estágios.
  12. 12. Globalcode – Open4education Bootloaders Bootloader de 1º estágio Executado a partir da SRAM interna. Inicializa controlador DRAM e NAND. Cria o contexto de execução para executar códigos de mais alto nível. Carrega o bootloader de segundo estágio, presente na memória não-volátil, na DRAM. Exemplos: X-Loader, AT91Bootstrap, U-Boot SPL
  13. 13. Globalcode – Open4education Bootloaders Bootloader de 2º estágio Executado a partir da DRAM. Carrega módulos para outros subsistemas, como USB, Rede, entre outros. Carrega a aplicação binária na memória, podendo ser a imagem do Linux Kernel. Possibilidade de carregar configurações/dados específicos para esta aplicação, como ATAGs ou DTBs em caso de Linux Kernel. Exemplos: Barebox, RedBoot, U-Boot (2º estágio apenas ou SPL).
  14. 14. Globalcode – Open4education Bootloaders
  15. 15. Globalcode – Open4education Linux Kernel Camada de abstração do hardware empregado: Gerência de todos recursos de hardware Controle de acesso concorrente Sistema de arquivos API estável para espaço do usuário Entre outros ...
  16. 16. Globalcode – Open4education Linux Kernel Imagem carregada na DRAM pelo bootloader. Processo de descompressão do vmlinux. Ponto de entrada do Kernel é encontrado em head.o. Tabela de páginas começa a ser preenchida. Estruturas internas do Kernel são inicializadas. MMU é habilitada. Endereços físicos passam a ser traduzidos. Início da execução do vmlinux.
  17. 17. Globalcode – Open4education Linux Kernel Informações (parâmetros) passados pelo bootloader são tratados. Fonte: arch/arm/kernel/setup.c void __init setup_arch(char **cmdline_p) { const struct machine_desc *mdesc; setup_processor(); mdesc = setup_machine_fdt(__atags_pointer); if (!mdesc) mdesc = setup_machine_tags(__atags_pointer, __machine_arch_type); machine_desc = mdesc; machine_name = mdesc->name; ... }
  18. 18. Globalcode – Open4education Linux Kernel Inicialização de especificidades do processador e também da plataforma. Processo segue até o processo pai “init” for iniciado. Uma vez que o Kernel é totalmente inicializado, o bootloader deixa de existir em memória.
  19. 19. Globalcode – Open4education
  20. 20. Globalcode – Open4education Como informações são passadas do bootloader para o Kernel do Linux?
  21. 21. Globalcode – Open4education Transferência de dados Formas convencionais (PowerPC, ARM, ...): Passado: ATAGs. Atual: Device Tree Blobs (DTBs). Modelos específicos de fabricantes: Arquivos FEX especificado pela Allwinner. Entre outros.
  22. 22. Globalcode – Open4education Transferência de dados Modelo utilizando ATAGs: Parâmetros carregados em uma posição predeterminada da memória. Machine type. Linha de comandos do Kernel. Ponteiro para estruturas. Tamanho e posição da memória. Entre outros. Todas informações do HW são mantidas estaticamente no Kernel. Modificações no HW gera a necessidade de modificar tanto Bootloader como Kernel.
  23. 23. Globalcode – Open4education Transferência de dados Modelo utilizando DTBs: Baseado no padrão OpenFirmware IBM. Arquivo binário carregados em uma posição predeterminada da memória. Descreve o HW presente na plataforma. CPU, memória, interfaces de comunicação. Independente de Sistema Operacional. Parâmetros para o Kernel são passados internamente a este arquivo. Linguagem de descrição própria, lembrando JSON e trabalhando sobre o modelo de árvore (nós).
  24. 24. Globalcode – Open4education Device Tree Source Fonte: /arch/arm/boot/dts/omap3-beagle.dts /dts-v1/; #include "omap34xx.dtsi" / { model = "TI OMAP3 BeagleBoard"; compatible = "ti,omap3-beagle", "ti,omap3"; cpus { cpu@0 { cpu0-supply = <&vcc>; }; }; memory { device_type = "memory"; reg = <0x80000000 0x10000000>; /* 256 MB */ }; ... };
  25. 25. Globalcode – Open4education DTS vs FEX Device Tree Source FEX (Allwinner) uart4: serial@49042000 { compatible = "ti,omap3-uart"; reg = <0x49042000 0x400>; interrupts = <80>; dmas = <&sdma 81 &sdma 82>; dma-names = "tx", "rx"; ti,hwmods = "uart4"; clock-frequency = <48000000>; }; [uart_para4] uart_used = 0 uart_port = 4 uart_type = 2 uart_tx = port:PH04<4><1><default><default> uart_rx = port:PH05<4><1><default><default>
  26. 26. Globalcode – Open4education Device Tree Bindings Documentação a respeitos das tags existentes para uma determinada plataforma. Repositório: Documentation/devicetree/bindings/
  27. 27. Globalcode – Open4education Referências Livros: Embedded Linux Primer: A Practical, Real-World Approach, Christopher Hallinan, 2010. Linux Kernel Development, Robert Love, 2010. Material da Free Electrons (free-electrons.com): Cursos. Palestras. Artigos.
  28. 28. Globalcode – Open4education MUITO OBRIGADO! Bruno Eduardo de Oliveira Meneguele bmeneg.com @bmeneguele bmeneguele@gmail.com

×