Qual é a sequência de inicialização?

35

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:

  1. Qual é o vetor de redefinição para a CPU do ARM e como / onde isso é definido?
  2. 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?
  3. Esse é o código ARM32 ou Thumb (ou talvez Jazelle)? Isso depende do bit de ordem baixa do vetor de redefinição?
  4. 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.
  5. Em que ordem os periféricos são inicializados e por qual parte do código?
  6. 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.

fgrieu
fonte
4
Tudo o que posso dizer é que a maioria dessas informações é de código fechado, como o código-fonte, os gerenciadores de inicialização e o firmware SoC. Por enquanto, allot é desconhecido. Você deveria saber uma coisa. O BCM é uma GPU ... não uma CPU. O gerenciador de inicialização inicia na seção GPU, inicializa a RAM lá e passa para a CPU, onde é o primeiro lugar em que temos acesso ao código fonte ... aka Raspbian. Boa sorte. Esta questão é muito ampla e difícil de responder.
Piotr Kula
Relacionado: O que acontece durante o processo de inicialização? . Duplicado?
Peter Mortensen

Respostas:

38

A sequência de inicialização do Raspberry Pi é basicamente esta:

  1. A inicialização do estágio 1 está na ROM do chip. Carrega o estágio 2 no cache L2
  2. O estágio 2 é bootcode.bin. Ativa a SDRAM e carrega o estágio 3
  3. O estágio 3 é loader.bin. Ele conhece o .elfformato e carregastart.elf
  4. start.elfcargas kernel.img. Ele também lê e config.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.txtbcm2835.dtb0×1000×8000disable_commandline_tags0×00×80000×100
  5. kernel.img é então executado no ARM.

Tudo é executado na GPU até kernel.imgser carregado no ARM.

Achei este diagrama bastante útil:

Sequencia de inicialização

SG60
fonte
2
Útil. Poderia ser esclarecido se o carregador de inicialização do segundo estágio 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ª etapa loader.bin(se isso não acontecer, como parece ser).
precisa saber é
3
Editei a resposta para incluir esclarecimentos. Tudo é executado na GPU até o kernel.imgqual é executado no ARM.
SG60
11
De acordo com isso loader.bin não é mais usado. bootcode.bindiretamente cargas start.elfde acordo com este git commit
HeatfanJohn
@ SG60: Você pode atualizar sua resposta com as informações do HeatfanJohn?
Peter Marcel
Alguém sabe sobre a inicialização do NOOBS? aparentemente, o processo é um pouco diferente, envolvendo a recuperação de si mesmo e algumas palhaçadas de inicialização suave. Estou curioso para fazer o uboot funcionar em um nível um pouco mais baixo.
Sam