Estou imaginando qual é a sequência de inicialização do Raspberry Pi em uma configuração típica (digamos NOOBS), desde o aplicativo de energia (ou reinicialização a quente, se for diferente) até a aparição do logotipo; ou onde isso é descrito.
Ao lado de uma imagem geral mais necessária dessa sequência, estou mais interessado nos estágios iniciais:
- Qual é o vetor de redefinição para a CPU do ARM e como / onde isso é definido?
- De que memória são obtidas as primeiras instruções da CPU do ARM? Onde está isso e qual tecnologia é usada para armazenar esse código?
- Esse é o código ARM32 ou Thumb (ou talvez Jazelle)? Isso depende do bit de ordem baixa do vetor de redefinição?
- A fonte (ou desmontagem ou despejo) desse código de inicialização inicial está disponível? Caso contrário, há algo técnico impedindo o uso da porta JTAG para determinar isso? Quanto ao legal, estou pronto para assumir o risco de confiar no meu entendimento da lei aplicável onde moro (França), que é o fato de que tenho plena permissão para analisar meu próprio computador, pelo menos na ausência de um contrato explícito explícito. requisito para não fazê-lo.
- Em que ordem os periféricos são inicializados e por qual parte do código?
- Ao lado da CPU ARM, há algum processador / autômato em execução no BCM2835 e afirmativamente como sua sequência de inicialização se relaciona com a CPU ARM?
Estou pronto para mergulhar no Manual de Referência Técnica da CPU do ARM e nos Periféricos do BRAÇO BCM2835 ou em qualquer outro documento.
Update: Depois de postar, eu encontrei este e este , afirmando GPU da BCM2835 está agindo como um mestre para o ARM, e está fortemente envolvido na seqüência de inicialização.
Respostas:
A sequência de inicialização do Raspberry Pi é basicamente esta:
bootcode.bin
. Ativa a SDRAM e carrega o estágio 3loader.bin
. Ele conhece o.elf
formato e carregastart.elf
start.elf
cargaskernel.img
. Ele também lê econfig.txt
, se o arquivo dtb existir, ele será carregado em & kernel @ Se estiver definido, ele carregará o kernel @ Caso contrário, ele carregará o kernel @ e colocará ATAGS emcmdline.txt
bcm2835.dtb
0×100
0×8000
disable_commandline_tags
0×0
0×8000
0×100
kernel.img
é então executado no ARM.Tudo é executado na GPU até
kernel.img
ser carregado no ARM.Achei este diagrama bastante útil:
fonte
bootcode.bin
é executado pela GPU, pelo ARM (e depois por qual tipo de código) ou por uma combinação desses? O mesmo para a 3ª etapaloader.bin
(se isso não acontecer, como parece ser).kernel.img
qual é executado no ARM.loader.bin
não é mais usado.bootcode.bin
diretamente cargasstart.elf
de acordo com este git commit