28
Globalcode – Open4education Linux Embarcado Uma conversa entre o Bootloader e o Kernel Bruno Eduardo de Oliveira Meneguele Engenheiro de Computação

TDC2016SP - Trilha Linux Embarcado

Embed Size (px)

Citation preview

Page 1: TDC2016SP - Trilha Linux Embarcado

Globalcode – Open4education

Linux EmbarcadoUma conversa entre o Bootloader e o Kernel

Bruno Eduardo de Oliveira MenegueleEngenheiro de Computação

Page 2: TDC2016SP - Trilha Linux Embarcado

Globalcode – Open4education

Agenda

Introdução

Plataformas Embarcadas

Bootloaders

Linux Kernel

Transferência de dadosATAGs

Device Tree Blobs

DTB vs FEX

Page 3: TDC2016SP - Trilha Linux Embarcado

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?

Page 4: TDC2016SP - Trilha Linux Embarcado

Globalcode – Open4education

Diferenças entre plataformas embarcadas e

PCs (desktops e notebooks) atuais.

Page 5: TDC2016SP - Trilha Linux Embarcado

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).

Page 6: TDC2016SP - Trilha Linux Embarcado

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

Page 7: TDC2016SP - Trilha Linux Embarcado

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).

Page 8: TDC2016SP - Trilha Linux Embarcado

Globalcode – Open4education

Como funciona a inicialização de uma plataforma embarcada?

Page 9: TDC2016SP - Trilha Linux Embarcado

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

Page 10: TDC2016SP - Trilha Linux Embarcado

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.

Page 11: TDC2016SP - Trilha Linux Embarcado

Globalcode – Open4education

Bootloaders

Inicialização a partir da ROM interna.Endereço preestabelecido pelo fabricando.

Execução em dois estágios.

Page 12: TDC2016SP - Trilha Linux Embarcado

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

Page 13: TDC2016SP - Trilha Linux Embarcado

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).

Page 14: TDC2016SP - Trilha Linux Embarcado

Globalcode – Open4education

Bootloaders

Page 15: TDC2016SP - Trilha Linux Embarcado

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 ...

Page 16: TDC2016SP - Trilha Linux Embarcado

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.

Page 17: TDC2016SP - Trilha Linux Embarcado

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;

...}

Page 18: TDC2016SP - Trilha Linux Embarcado

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.

Page 19: TDC2016SP - Trilha Linux Embarcado

Globalcode – Open4education

Page 20: TDC2016SP - Trilha Linux Embarcado

Globalcode – Open4education

Como informações são passadas do bootloader para o Kernel do Linux?

Page 21: TDC2016SP - Trilha Linux Embarcado

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.

Page 22: TDC2016SP - Trilha Linux Embarcado

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.

Page 23: TDC2016SP - Trilha Linux Embarcado

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).

Page 24: TDC2016SP - Trilha Linux Embarcado

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 */ }; ...};

Page 25: TDC2016SP - Trilha Linux Embarcado

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>

Page 26: TDC2016SP - Trilha Linux Embarcado

Globalcode – Open4education

Device Tree Bindings

Documentação a respeitos das tags existentes para uma determinada plataforma.

Repositório: Documentation/devicetree/bindings/

Page 27: TDC2016SP - Trilha Linux Embarcado

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.

Page 28: TDC2016SP - Trilha Linux Embarcado

Globalcode – Open4education

MUITO OBRIGADO!

Bruno Eduardo de Oliveira Meneguele

bmeneg.com @bmeneguele

[email protected]