¿Cuál es la secuencia de arranque?

35

Me pregunto cuál es la secuencia de arranque de la Raspberry Pi en una configuración típica (por ejemplo, NOOBS), desde la aplicación de energía (o reinicio en caliente si es diferente) hasta, por ejemplo, la aparición del logotipo; o donde se describe eso.

Además de una imagen general más necesaria de esa secuencia, estoy más interesado en las primeras etapas:

  1. ¿Cuál es el vector de reinicio para la CPU ARM y cómo / dónde se define eso?
  2. ¿Desde qué memoria se obtienen las primeras instrucciones de CPU ARM? ¿Dónde está eso y qué tecnología se utiliza para almacenar este código?
  3. ¿Es ese el código ARM32 o Thumb (o quizás Jazelle)? ¿Depende eso del bit de orden inferior del vector de reinicio?
  4. ¿Está disponible la fuente (o desensamblaje, o volcado) de ese código de arranque temprano? Si no, ¿hay algo técnico que impida el uso del puerto JTAG para determinar eso? En cuanto a lo legal, estoy dispuesto a asumir el riesgo de confiar en mi comprensión de la ley aplicable en mi lugar de residencia (Francia), que es que estoy totalmente autorizado a analizar mi propia computadora, al menos en ausencia de un contrato explícito requisito de no hacerlo.
  5. ¿En qué orden se inicializan los periféricos y por qué código?
  6. Además de la CPU ARM, ¿hay algún procesador / autómata ejecutándose en el BCM2835, y afirmativamente cómo se relaciona su secuencia de arranque con la CPU ARM?

Estoy listo para sumergirme en el Manual de referencia técnica de la CPU ARM y los periféricos ARM BCM2835 , o cualquier otro documento.

Actualización: después de publicar, encontré esto y esto , indicando que la GPU del BCM2835 está actuando como un maestro para el ARM, y está muy involucrado en la secuencia de arranque.

fgrieu
fuente
44
Todo lo que puedo decir es que la mayor parte de esa información es de código cerrado, como el código fuente, los cargadores de arranque y el firmware de SoC. Por ahora, todo se desconoce. Deberías saber una cosa. El BCM es una GPU ... no una CPU. El gestor de arranque comienza en la sección de la GPU, inicializa la RAM allí y lo entrega a la CPU, donde es el primer lugar donde tenemos acceso al código fuente ... también conocido como Raspbian. Buena suerte. Esta pregunta es muy amplia y difícil de responder.
Piotr Kula
Relacionado: ¿Qué sucede durante el proceso de arranque? . ¿Duplicar?
Peter Mortensen

Respuestas:

38

La secuencia de arranque de la Raspberry Pi es básicamente esta:

  1. La etapa 1 de arranque está en la ROM del chip. Carga la etapa 2 en el caché L2
  2. La etapa 2 es bootcode.bin. Habilita SDRAM y carga la Etapa 3
  3. La etapa 3 es loader.bin. Conoce el .elfformato y las cargas.start.elf
  4. start.elfcargas kernel.img. Luego también lee config.txt, cmdline.txty bcm2835.dtb si el archivo dtb existe, se carga en 0×100& kernel @ 0×8000 Si disable_commandline_tagsestá configurado, carga kernel @ 0×0 De lo contrario, carga kernel @ 0×8000y coloca ATAGS en0×100
  5. kernel.img luego se ejecuta en el BRAZO.

Todo se ejecuta en la GPU hasta que kernel.imgse carga en el ARM.

Encontré este diagrama bastante útil:

Secuencia de inicio

SG60
fuente
2
Útil. ¿Podría aclararse si el cargador de arranque de la segunda etapa bootcode.bines código ejecutado por la GPU, el ARM (y luego qué tipo de código), o una combinación de estos? Lo mismo para la tercera etapa loader.bin(si eso no se ha ido, como parece ser).
fgrieu
3
@fgrieu He editado la respuesta para incluir aclaraciones. Todo se ejecuta en la GPU hasta kernel.imgque se ejecuta en el ARM.
SG60
1
De acuerdo con esto loader.bin ya no se utiliza. bootcode.binse carga directamente de start.elfacuerdo con este compromiso de Git
HeatfanJohn
@ SG60: ¿Puedes actualizar tu respuesta con la información de HeatfanJohn?
Peter Mortensen
¿Alguien sabe sobre el arranque NOOBS? Aparentemente, el proceso es ligeramente diferente e involucra a recovery.elf y algunas travesuras de arranque suave. Tengo curiosidad por hacer que uboot funcione a un nivel ligeramente inferior.
Sam