Je me demande quelle est la séquence de démarrage du Raspberry Pi dans une configuration typique (disons NOOBS), depuis l’application d’alimentation (ou la réinitialisation à chaud si cela est différent) jusqu’à l’apparition du logo; ou où cela est décrit.
Outre une image générale très utile de cette séquence, je m'intéresse surtout aux premières étapes:
- Quel est le vecteur de réinitialisation de la CPU ARM et comment / où est-il défini?
- Dans quelle mémoire les premières instructions du processeur ARM sont-elles extraites? Où est-ce, et quelle technologie est utilisée pour stocker ce code?
- S'agit-il du code ARM32 ou du pouce (ou peut-être de Jazelle)? Cela dépend-il du bit de poids faible du vecteur de réinitialisation?
- La source (ou le désassemblage ou le dump) de ce code de démarrage initial est-elle disponible? Si non, est-ce que quelque chose de technique empêche l'utilisation du port JTAG pour le déterminer? En ce qui concerne les aspects juridiques, je suis prêt à assumer le risque de faire confiance à ma compréhension du droit applicable dans mon pays (France), ce qui signifie que je suis pleinement autorisé à analyser mon propre ordinateur, du moins en l'absence d'un contrat explicite obligation de ne pas le faire.
- Dans quel ordre les périphériques sont-ils initialisés et par quel morceau de code?
- Outre le processeur ARM, y a-t-il des processeurs / automates fonctionnant dans le BCM2835 et, dans l’affirmative, quel est le lien entre sa séquence de démarrage et le processeur ARM?
Je suis prêt à plonger dans le manuel de référence technique de la CPU ARM et les périphériques ARM BCM2835 , ou dans tout autre document.
Mise à jour: Après avoir posté, j'ai trouvé ceci et cela , indiquant que le GPU du BCM2835 agit en tant que maître pour ARM et est fortement impliqué dans la séquence de démarrage.
Réponses:
La séquence de démarrage du Raspberry Pi est fondamentalement la suivante:
bootcode.bin
. Active la SDRAM et charge l'étape 3loader.bin
. Il connaît le.elf
format et chargestart.elf
start.elf
des chargeskernel.img
. Il lit ensuite égalementconfig.txt
,cmdline.txt
etbcm2835.dtb
si le fichier dtb existe, il est chargé à0×100
& kernel @0×8000
Sidisable_commandline_tags
est défini, il charge le noyau @0×0
Sinon, il charge le noyau @0×8000
et met ATAGS à0×100
kernel.img
est ensuite exécuté sur le bras.Tout est exécuté sur le GPU jusqu'à ce qu'il
kernel.img
soit chargé sur l'ARM.J'ai trouvé ce diagramme assez utile:
la source
bootcode.bin
est un code géré par le GPU, l'ARM (et ensuite quel type de code) ou une combinaison de ceux-ci? Même chose pour la 3ème étapeloader.bin
(si cela n’est pas parti, comme cela semble être).kernel.img
ce qui est exécuté sur l’ARM.loader.bin
n'est plus utilisé.bootcode.bin
charge directement enstart.elf
fonction de cet engagement Git