Linux Boot na plataforma de braço

Linux Boot na plataforma de braço
Discutiremos nas plataformas de braço. Quais são os blocos de construção de tais plataformas. Quando ligamos o quadro e o Linux está instalado no sistema, como a energia do seqüenciamento é acionada. Quais são os outros componentes necessários para inicializar o Linux em qualquer plataforma de braço?

Descrição

A plataforma de braço é a placa baseada na arquitetura do ARM. Existem muitos fabricantes no mercado que projeta as plataformas com base nesta arquitetura. Geralmente, uma plataforma de braço tem os seguintes blocos de construção:

  1. CPU/SOC: Esta é a principal unidade de processamento na plataforma. Os componentes têm os componentes internos e também como cache, SCU etc.
  2. S-RAM interno: Este é o RAM que está presente no SoC. O tamanho dessa memória é limitado e será poucos KBs.
  3. DDR externo: Esta é a RAM externa, que é de tamanho significativo em comparação com a RAM interna. Esta memória atua como a memória de execução da CPU. Geralmente, isso é de poucos GBs, com base no design do sistema.
  4. Dispositivo de iniciaçâo: Este é o dispositivo de armazenamento permanente externo usado para armazenar as imagens de software necessárias pelo sistema para inicializar. Poucos exemplos dos componentes são carregadores de botas, imagem Linux, sistema de arquivos root. Esses 3 componentes são componentes básicos necessários para qualquer sistema para inicializar Linux. Exemplo de dispositivos de inicialização são EMMC, dispositivos de memória flash nv, cartão SD, stick de memória USB, etc. Esses dispositivos só podem ser usados ​​para inicializar se o sistema suportar a inicialização com essa mídia. Poucos sistemas têm várias opções de inicialização, que podem ser controladas por tiras ou interruptores de mergulho. Qualquer tipo de inicialização necessário pode ser selecionado e as imagens podem programar para a mídia de inicialização. A programação das imagens de inicialização pode ser feita com a ajuda de algum programador externo, como a ferramenta DDDIPROG.

Imagens para o sistema inicializar

O primeiro e mais importante item necessário para inicializar o Linux na plataforma de braço é que precisamos das imagens de construção de carregadores de inicialização, kernel Linux e sistemas de arquivos raiz. Essas imagens podem ser compiladas se a placa for projetada interna para a organização, mas se o dispositivo for comprado através de algum fornecedor, ele deve fornecer as instruções sobre a geração de imagens. Mesmo em alguns casos, se eles não fornecerem o código -fonte para compilar ou construir, eles fornecem as imagens pré -construídas.

Programação das imagens para o dispositivo de inicialização

Depois de termos imagens prontas para inicializar na plataforma, precisamos queimar/programar as imagens no dispositivo de inicialização. Deve haver instruções disponíveis no fornecedor ou em qualquer programador HW pode ser usado para programar as imagens no dispositivo de inicialização. Exemplo desse programador é Dediprog.

Dediprog é a ferramenta que pode ser usada para programar a imagem flash no flash nv. Este é o caso do modo de inicialização flash. Jumpers ou configuração são necessários para ativar a bota flash se vários dispositivos de inicialização estiverem presentes.

Instantâneo de Dediprog:

Afinal, as imagens são programadas na mídia de inicialização e toda a configuração de inicialização é feita para ativar o tipo de inicialização onde mantivemos as imagens para inicializar.

A inicialização do Linux pode ser considerada em vários estágios:

  1. Fase ROM de inicialização
  2. Inicialização do carregador de inicialização do primeiro estágio
  3. Inicialização do carregador de inicialização do segundo estágio, este é o U-Boot geralmente.
  4. Inicialização do Linux
  5. Montagem de rootfs e execução de scripts de init linux até o console de login chegar.

Vamos discutir todos esses estágios de inicialização em detalhes agora.

Fase ROM de inicialização

Nesta fase, não há acesso ao DDR externo, toda a execução precisa ser feita no S-RAM interno. Assim que o sistema é ligado, o código da ROM de inicialização inicializa a interface de inicialização e depois busca o carregador de inicialização do primeiro estágio. Depois que o carregador de inicialização estiver disponível na RAM interna e está pronto para executar, o controle é transferido para o carregador de inicialização do primeiro estágio.

Inicialização do carregador de inicialização do primeiro estágio

Imediatamente após a alimentação ser ligada, não há acesso à RAM externa disponível para a CPU. A execução começa no vetor de redefinição. Redefinir vetor é o local de onde a CPU começa a executar as primeiras instruções de programação. Nesta fase, apenas a RAM interna está disponível. Posteriormente, o DDR externo é inicializado e, em seguida, o carregador de inicialização do segundo estágio é buscado na mídia de inicialização e carregado para o DDR externo inicializado e o controlador é passado para o carregador de inicialização do segundo estágio I.e., U-Boot.

Inicialização do carregador de inicialização do segundo estágio ou U-boot

Este é um software mínimo necessário para a configuração do ambiente necessária para o kernel Linux antes de inicializar. Vários drivers e interfaces HW são ativados no ambiente U-Boot. Este carregador de inicialização fornece a linha de comando e, portanto, podemos modificar as várias configurações em tempo de execução. O principal objetivo deste estágio é preparar a configuração/placa para o kernel Linux. Nesta fase, a imagem Linux pode ser buscada a partir de várias opções disponíveis. A imagem Linux pode ser carregada em qualquer interface das diferentes interfaces. Este estágio busca a imagem do kernel Linux e passa o controle de execução para o carregador de inicialização.

Inicialização do Linux

Após a segunda etapa, o carregador de inicialização copiou a imagem Linux para o DDR externo. Ele passará o controle de execução para a imagem Linux. Depois que a imagem Linux começa a inicializar, inicia a inicialização de todos os dispositivos/periféricos no quadro. Ele inicializa todo o subsistema, incluindo todos os controladores e dispositivos. Depois que todos os motoristas e dispositivos são inicializados nesta fase e o kernel Linux está funcionando com capacidade máxima possível.

Depois que a inicialização ou a inicialização dos drivers é concluída, há uma pesquisa no dispositivo rootfs. A localização do dispositivo rootfs também pode ser configurada ou modificada a partir dos parâmetros da linha de comando do Linux. Os parâmetros da linha de comando para Linux são as variáveis ​​de ambiente no ambiente U-Boot, portanto, para atualizar a localização do dispositivo Rootsfs é apenas uma modificação da variável de ambiente no U-Boot. Há outras informações também disponíveis no ambiente U-Boot.

Poucos exemplos são localização do processo init, tamanho da memória, habilitando o devmem, aumentando os níveis de logles do kernel etc. Poucas outras opções de variáveis ​​de ambiente em U-Boot estão disponíveis para facilitar outros casos de usuário em U-Boot. Por exemplo, a atribuição de endereço IP no U-Boot é feita com a ajuda da variável de ambiente.

Montagem de rootfs e execução de scripts Linux Init:

O dispositivo rootfs é pesquisado e montado e, em seguida, o processo init é pesquisado no dispositivo rootfs. Depois que a imagem init está localizada, o controle é transmitido ao init depois de invocar o processo init. Este é o primeiro processo de terras do usuário que começa a executar. Depois que o init recebe o controle, ele inicializa os serviços do Usuários Space executando os scripts inits.

Todos os daemons são iniciados e os serviços de nível do sistema são iniciados executando os serviços iniciados presentes em / etc / ou se o sistema for sistema baseado no SystemCTL, todos os serviços serão iniciados de acordo com as diretrizes mencionadas para o sistema SystemCTL. Depois que todos os serviços são iniciados, o programa Shell é chamado, o que cria um prompt de sessão de login para o usuário.

O usuário pode usar este console de comando para solicitar vários serviços do kernel Linux.

Agora, vamos ver os logs de inicialização do sistema Linux, que demonstrará o estágio de inicialização que discutimos até agora. Observe que estes não são toras completas. Eu removi poucas linhas no meio, pois são toras enormes. Não é relevante para o tópico, portanto, acabei de fornecer os logs relevantes para nossa discussão.

NOTA: A fase da ROM de inicialização não pode ser observada em toras, pois o UART não está disponível nesta fase.
Inicialização do carregador de inicialização do primeiro estágio:
U-Boot SPL 2019.04 (17 de agosto de 2021 - 18:33:14 +0000)
Tentando inicializar de Ram
Inicialização do carregador de inicialização do segundo estágio ou U-boot:
U-Boot 2019.04 (17 de agosto de 2021 - 18:33:14 +0000)
SOC: AST2600-A1
RST: Power on
Modo LPC: SIO: Ativar: Superio-2E
ETH: MAC0: RMII/NCSI, MAC1: RMII/NCSI, MAC2: RMII/NCSI, MAC3: RMII/NCSI
Modelo: Fornecedor BMC
Dram: já inicializado, 1008 MIB (Capacidade: 1024 MIB, VGA: 16 MIB), ECC OFF
PCIE-0: Link para baixo
MMC: Emmc_slot0@100: 0
Ambiente de carregamento do SPI Flash… SF: detectado N25q256a com tamanho de página 256 bytes, apagar tamanho 4 kib, total 32 MIB
*** AVISO - CRC ruim, usando o ambiente padrão
In: Serial@1E784000
OUT: Serial@1E784000
ERR: serial@1e784000
Modelo: Fornecedor BMC
EEPROM ETH2ADDR: EA = AA: BB: CC: DD: DE: E0
Bmc eth2addr = aa: bb: cc: dd: de: e3
NET: FTGMAC100_PROBE - NCSI detectado
Eth2: ftgmac@1e670000ftgmac100_probe - NCSI detectado
Aviso: FTGMAC@1E690000 (ETH3) usando o endereço MAC aleatório - FA: 12: FB: CA: BC: FF
, eth3: ftgmac@1e690000
Aperte qualquer chave para parar o AutoBoot: 2 1 0
## Carregando kernel da Fit Image em 20100000…
Usando a configuração 'conf-1'
Tentando 'kernel-1' kernel subimagem
Descrição: kernel Linux
Tipo: Imagem do kernel
.
.
.
.
Compressão: não compactada
Dados Iniciar: 0x2067e1c4
Tamanho dos dados: 54387 bytes = 53.1 Kib
Arquitetura: braço
Verificando a integridade do hash… ok
Inicialização usando o FDT Blob em 0x2067e1c4
Carregando a imagem do kernel… ok
Carregando Ramdisk para 8FBE0000, final 8FFFFFBF0… OK
Carregando a árvore do dispositivo para 8fbcf000, final 8fbdf472… ok
Inicialização do Linux:
Kernel começando ..
[0.000000] inicialização do Linux na CPU física 0xf00
[0.000000] Linux versão 5.1.3.SDK-V00.05.07 (Cienauser@haxv-srathore-2) (GCC versão 8.3.0 (Buildroot 2019.05-rc2)) #3 SMP Sun 29 de agosto 14:19:01 UTC 2021
[0.000000] CPU: Processador ARMV7 [410FC075] Revisão 5 (ARMV7), CR = 10C5387D
[0.000000] CPU: DIV Instruções disponíveis: Código da divisão de patching
[0.000000] CPU: cache de dados de não aliasing de pipp / vipt, cache de instrução de alias VIP
[0.000000] de: FDT: Máquina Modelo: AST2600 A1 EVB
[0.000000] Política de memória: Data Cache WriteAlloc
[0.000000] Memória reservada: criado CMA Memory Pool em 0xbb000000, tamanho 64 MIB
[0.000000] de: MEM reservado: Vídeo do nó inicializado, ID compatível compartilhado-dma-pool
[0.000000] Memória reservada: CRIED CMA Memory Pool em 0xb7000000, tamanho 64 MIB
[0.000000] de: MEM reservado: RVAS do nó inicializado, ID compatível compartilhado-dma-pool
[0.000000] Memória reservada: Criado DMA Memory Pool em 0xb6e00000, tamanho 2 MIB
[0.000000] de: MEM reservado: nó inicializado ssp_memory, ID compatível compartilhado-dma-pool
[0.000000] Memória reservada: Criado DMA Memory Pool em 0xb6d00000, tamanho 1 MIB
.
.
.
.
[1.184367] 0x000000000000-0X0000000F0000: "U-Boot"
[1.191246] 0x0000000F0000-0X000000100000: "U-boot-env"
[1.198363] 0x000000100000-0x000002060000: "FIT"
[1.203661] MTD: Partição "Fit" se estende além do final do dispositivo "BMC" - Tamanho truncado a 0x1f00000
[1.215347] Vendor-SMC 1E620000.SPI: BUS_WIDTH 2, usando frequência SPI de 50 MHz
[1.223375] Vendor-SMC 1E620000.SPI: N25Q256A (32768 Kbytes)
[1.229723] Vendor-SMC 1E620000.SPI: Janela CE1 [0x22000000 - 0x24000000] 32MB
[1.2379996] Vendor-SMC 1E620000.SPI: Janela CE2 [0x24000000 - 0x30000000] 192MB
[1.246357] Vendor-SMC 1E620000.SPI: Leia o Registro de Controle: [203C0441]
[1.316884] Vendor-SMC 1E630000.SPI: BUS_WIDTH 2, usando frequência SPI de 50 MHz
[1.324821] Vendor-SMC 1E630000.SPI: ID JEDEC não reconhecido: 00 00 00 00 00
[1.333384] Vendor-SMC 1E630000.spi: chip 0 não existe.
.
.
.
[1.631342] uhci_hcd: USB Universal Host Controller Interface Driver
[1.638622] plataforma-uhci 1e6b0000.USB: detectado 2 portas da árvore de dispositivos
[1.646217] plataforma-uhci 1e6b0000.USB: Solução alternativa de implementação do fornecedor ativado
[1.664722] plataforma-uhci 1e6b0000.USB: Controlador Host UHCI genérico
[1.671844] plataforma-uhci 1e6b0000.USB: novo ônibus USB registrado, o ônibus atribuído número 2
[1.680671] plataforma-uhci 1e6b0000.USB: IRQ 42, io Mem 0x1e6b0000
[1.687977] USB USB2: Novo dispositivo USB encontrado, idVendor = 1d6b, idproduct = 0001, bcddevice = 5.01
[1.697237] USB USB2: Novas Strings de dispositivo USB: MFR = 3, Produto = 2, SerialNumber = 1
[1.705311] USB USB2: Produto: Controlador Host UHCI genérico
[1.711542] USB2: Fabricante: Linux 5.1.3.SDK-V00.05.07 UHCI_HCD
[1.718824] USB USB2: SerialNumber: 1E6B0000.USB
[1.724589] Hub 2-0: 1.0: hub USB encontrado
[1.728830] Hub 2-0: 1.0: 2 portas detectadas
[1.734689] USBCORE: NOVO DRITOR DE INTERFACE REGISTRADO
[1.753347] VENDOR_VHUB 1E6A0000.USB-VHUB: Hub virtual inicializado no modo USB2
[1.762327] Driver de entradas i2c /dev
[1.767491] i2c_new_vendor 1e78a080.I2C-Bus: New-I2C: I2C-Bus [0]: Modo Adaptador [100 KHz] [2]
.
.
.
[2.960181] Liberando a memória do kernel não utilizado: 1024K
[2.970760] MMCBLK0: MMC0: 0001 R1J57L 27.5 Gib
[2.976119] MMCBLK0BOOT0: MMC0: 0001 R1J57L Partição 1 16 16.0 mib
[2.983067] MMCBLK0BOOT1: MMC0: 0001 R1J57L Partição 2 16 16.0 mib
[2.989980] MMCBLK0RPMB: MMC0: 0001 R1J57L Partição 3 128 Kib, Chardev (246: 0)
[2.999275] MMCBLK0: P1
[3.012035] verificado w+x mapeamentos: passados, sem páginas w+x encontradas
Montagem de rootfs e execução de scripts Linux Init
[3.018367] RUN /SBIN /INIT AS PROCESSO INIT

Conclusão

Vimos o processo completo de inicialização do Linux em detalhes com logs de amostra. Também discutimos os vários blocos de construção da inicialização do Linux. Poucos outros pré-requisitos necessários para o Linux também foram discutidos. Existem vários estágios envolvidos na inicialização do Linux em qualquer placa de processador ARM, todos os estágios foram discutidos em detalhes e são mapeados com os logs de inicialização de amostra. Esta discussão é suficiente para fornecer o entendimento básico sobre a inicialização do Linux nos sistemas de braço.