Zastanawiam się, jaka jest sekwencja rozruchowa Raspberry Pi w typowej konfiguracji (powiedzmy NOOBS), od aplikacji mocy (lub ciepłego resetu, jeśli jest inaczej) aż do, powiedzmy, pojawienia się logo; lub gdzie to jest opisane.
Oprócz najbardziej potrzebnego ogólnego obrazu tej sekwencji, najbardziej interesują mnie wczesne etapy:
- Jaki jest wektor resetowania procesora ARM i jak / gdzie to jest zdefiniowane?
- Z jakiej pamięci pobierane są pierwsze instrukcje procesora ARM? Gdzie to jest i jaką technologię stosuje się do przechowywania tego kodu?
- Czy to kod ARM32 lub kod Thumb (a może Jazelle)? Czy to zależy od bitu niskiego rzędu wektora resetowania?
- Czy dostępne jest źródło (lub dezasemblacja lub zrzut) tego wczesnego kodu rozruchowego? Jeśli nie, to czy jest coś technicznego, co uniemożliwia użycie portu JTAG do ustalenia tego? Jeśli chodzi o kwestie prawne, jestem gotów przyjąć ryzyko, że ufam mojemu zrozumieniu prawa obowiązującego w moim miejscu zamieszkania (Francja), co oznacza, że mam pełną analizę własnego komputera, przynajmniej w przypadku braku wyraźnej umowy wymóg, aby tego nie robić.
- W jakiej kolejności są inicjowane urządzenia peryferyjne i według jakiego kodu?
- Czy oprócz procesora ARM w BCM2835 działają jakieś procesory / automaty, a twierdząco, w jaki sposób jego sekwencja rozruchowa odnosi się do procesora ARM?
Jestem gotowy do zapoznania się z Instrukcją techniczną procesora ARM i urządzeniami peryferyjnymi ARM BCM2835 lub innymi dokumentami.
Aktualizacja: Po opublikowaniu znalazłem to i to , stwierdzając, że GPU BCM2835 działa jako master dla ARM i jest mocno zaangażowany w sekwencję rozruchową.
Odpowiedzi:
Sekwencja uruchamiania Raspberry Pi jest w zasadzie taka:
bootcode.bin
. Włącza SDRAM i ładuje etap 3loader.bin
. Wie o.elf
formacie i obciążeniachstart.elf
start.elf
ładunkikernel.img
. Następnie odczytuje równieżconfig.txt
,cmdline.txt
abcm2835.dtb
jeśli plik dtb istnieje, jest ładowany do0×100
& kernel @0×8000
Jeślidisable_commandline_tags
jest ustawiony, ładuje jądro @0×0
W przeciwnym razie ładuje jądro @0×8000
i ustawia ATAGS na0×100
kernel.img
jest następnie uruchamiany na ARM.Wszystko działa na GPU, dopóki nie
kernel.img
zostanie załadowane na ARM.Uważam ten schemat za bardzo przydatny:
źródło
bootcode.bin
to kod uruchamiany przez GPU, ARM (a następnie jaki rodzaj kodu), czy też ich kombinacja? To samo dla 3. etapuloader.bin
(jeśli go nie ma, jak się wydaje).kernel.img
zostanie uruchomione na ARM.loader.bin
nie jest już używany.bootcode.bin
ładuje bezpośredniostart.elf
zgodnie z tym Git commit