Upload
tdc-globalcode
View
49
Download
2
Embed Size (px)
Citation preview
Globalcode – Open4education
Linux EmbarcadoUma conversa entre o Bootloader e o Kernel
Bruno Eduardo de Oliveira MenegueleEngenheiro de Computação
Globalcode – Open4education
Agenda
Introdução
Plataformas Embarcadas
Bootloaders
Linux Kernel
Transferência de dadosATAGs
Device Tree Blobs
DTB vs FEX
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?
Globalcode – Open4education
Diferenças entre plataformas embarcadas e
PCs (desktops e notebooks) atuais.
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).
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
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).
Globalcode – Open4education
Como funciona a inicialização de uma plataforma embarcada?
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
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.
Globalcode – Open4education
Bootloaders
Inicialização a partir da ROM interna.Endereço preestabelecido pelo fabricando.
Execução em dois estágios.
Globalcode – Open4education
Bootloaders
Bootloader de 1º estágioExecutado 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
Globalcode – Open4education
Bootloaders
Bootloader de 2º estágioExecutado 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).
Globalcode – Open4education
Bootloaders
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 ...
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.
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;
...}
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.
Globalcode – Open4education
Globalcode – Open4education
Como informações são passadas do bootloader para o Kernel do Linux?
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.
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.
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).
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 */ }; ...};
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>
Globalcode – Open4education
Device Tree Bindings
Documentação a respeitos das tags existentes para uma determinada plataforma.
Repositório: Documentation/devicetree/bindings/
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.
Globalcode – Open4education
MUITO OBRIGADO!
Bruno Eduardo de Oliveira Meneguele
bmeneg.com @bmeneguele