O documento discute o processo de inicialização de plataformas embarcadas com Linux, incluindo o papel dos bootloaders e como eles transferem informações sobre o hardware para o kernel. Primeiro, explica as diferenças entre PCs e plataformas embarcadas. Em seguida, descreve como os bootloaders inicializam o sistema e carregam o kernel, bem como os tipos de informações que podem ser passadas, como ATAGs ou Device Tree Blobs. Por fim, discute as vantagens do modelo baseado em Device Tree sobre outros métodos.
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. 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. 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).
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. 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.
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. 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).
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. 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.
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.
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. 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. 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).
26. Globalcode – Open4education
Device Tree Bindings
Documentação a respeitos das tags existentes
para uma determinada plataforma.
Repositório: Documentation/devicetree/bindings/
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.