Globalcode – Open4education
Linux Embarcado
Uma conversa entre o Bootloader e o Kernel
Bruno Eduardo de Oliveira Meneguele
Engenheiro de Computação
Globalcode – Open4education
Agenda
Introdução
Plataformas Embarcadas
Bootloaders
Linux Kernel
Transferência de dados
ATAGs
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á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
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).
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
bmeneguele@gmail.com

TDC2016SP - Trilha Linux Embarcado

  • 1.
    Globalcode – Open4education LinuxEmbarcado Uma conversa entre o Bootloader e o Kernel Bruno Eduardo de Oliveira Meneguele Engenheiro de Computação
  • 2.
    Globalcode – Open4education Agenda Introdução PlataformasEmbarcadas Bootloaders Linux Kernel Transferência de dados ATAGs Device Tree Blobs DTB vs FEX
  • 3.
    Globalcode – Open4education Introdução Paraesta nossa conversa: Qual é a motivação para realizar ou assistir? Qual é o objetivo? Para quem se destina ou interessa?
  • 4.
    Globalcode – Open4education Diferençasentre plataformas embarcadas e PCs (desktops e notebooks) atuais.
  • 5.
    Globalcode – Open4education Desktops/Notebooks Arquiteturamais 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 PlataformasEmbarcadas 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 PlataformasEmbarcadas 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.
    Globalcode – Open4education Comofunciona a inicialização de uma plataforma embarcada?
  • 9.
    Globalcode – Open4education Inicialização Antesde 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 Osbootloaders 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.
    Globalcode – Open4education Bootloaders Inicializaçãoa partir da ROM interna. Endereço preestabelecido pelo fabricando. Execução em dois estágios.
  • 12.
    Globalcode – Open4education Bootloaders Bootloaderde 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 Bootloaderde 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.
  • 15.
    Globalcode – Open4education LinuxKernel 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 LinuxKernel 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.
    Globalcode – Open4education LinuxKernel 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.
    Globalcode – Open4education LinuxKernel 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.
  • 20.
    Globalcode – Open4education Comoinformações são passadas do bootloader para o Kernel do Linux?
  • 21.
    Globalcode – Open4education Transferênciade 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ênciade 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ênciade 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.
    Globalcode – Open4education DeviceTree 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.
    Globalcode – Open4education DTSvs 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.
    Globalcode – Open4education DeviceTree Bindings Documentação a respeitos das tags existentes para uma determinada plataforma. Repositório: Documentation/devicetree/bindings/
  • 27.
    Globalcode – Open4education Referências Livros: EmbeddedLinux 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.
    Globalcode – Open4education MUITOOBRIGADO! Bruno Eduardo de Oliveira Meneguele bmeneg.com @bmeneguele bmeneguele@gmail.com