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:
- ¿Cuál es el vector de reinicio para la CPU ARM y cómo / dónde se define eso?
- ¿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?
- ¿Es ese el código ARM32 o Thumb (o quizás Jazelle)? ¿Depende eso del bit de orden inferior del vector de reinicio?
- ¿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.
- ¿En qué orden se inicializan los periféricos y por qué código?
- 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.
Respuestas:
La secuencia de arranque de la Raspberry Pi es básicamente esta:
bootcode.bin
. Habilita SDRAM y carga la Etapa 3loader.bin
. Conoce el.elf
formato y las cargas.start.elf
start.elf
cargaskernel.img
. Luego también leeconfig.txt
,cmdline.txt
ybcm2835.dtb
si el archivo dtb existe, se carga en0×100
& kernel @0×8000
Sidisable_commandline_tags
está configurado, carga kernel @0×0
De lo contrario, carga kernel @0×8000
y coloca ATAGS en0×100
kernel.img
luego se ejecuta en el BRAZO.Todo se ejecuta en la GPU hasta que
kernel.img
se carga en el ARM.Encontré este diagrama bastante útil:
fuente
bootcode.bin
es 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 etapaloader.bin
(si eso no se ha ido, como parece ser).kernel.img
que se ejecuta en el ARM.loader.bin
ya no se utiliza.bootcode.bin
se carga directamente destart.elf
acuerdo con este compromiso de Git