Яка послідовність завантаження?


35

Мені цікаво, яка послідовність завантаження Raspberry Pi знаходиться в типовому режимі (скажімо, NOOBS), від додатку живлення (або теплового скидання, якщо це відрізняється) до, скажімо, появи логотипу; або де це описано.

Окрім найбільш потрібної загальної картини цієї послідовності, мене найбільше цікавлять ранні етапи:

  1. Що таке вектор скидання для процесора ARM, і як / де це визначено?
  2. З якої пам'яті витягнуті перші інструкції процесора ARM? Де це, і яка технологія використовується для зберігання цього коду?
  3. Це код ARM32 або Thumb (чи, можливо, Jazelle)? Це залежить від біта низького порядку вектора скидання?
  4. Чи доступне джерело (або розбирання, або скидання) цього раннього завантажувального коду? Якщо ні, чи щось технічне заважає використанню порту JTAG для визначення цього? Щодо юридичного, я готовий взяти на себе ризик довіритися моєму розумінню законодавства, яке застосовується там, де я живу (Франція). Це полягає в тому, що мені дозволяється повністю аналізувати власний комп’ютер, принаймні за відсутності явного договору вимога не робити цього.
  5. У якому порядку ініціалізуються периферійні пристрої та яким фрагментом коду?
  6. Окрім процесора ARM, чи є деякі процесори / автомати, що працюють у BCM2835, і як стверджувально, як його послідовність завантаження стосується процесора ARM?

Я готовий пірнути в процесорі ARM в Технічному довідковому керівництві і BCM2835 ARM периферійних пристроїв , або будь-який інший документ.

Оновлення: Після публікації я виявив це і це , заявивши, що GPU BCM2835 виступає майстром ARM і активно бере участь у завантажувальній послідовності.


4
Все, що я можу сказати, що більшість цієї інформації є закритим вихідним кодом, як вихідний код, завантажувачі та вбудовані програми SoC. На даний момент все невідомо. Ви повинні знати одне. BCM - це графічний процесор, а не процесор. Запуск завантажувача запускається в розділі GPU, там ініціалізує оперативну пам’ять і передає процесор, де ми в першу чергу маємо доступ до вихідного коду ... aka Raspbian. Щасти. Це питання дуже широке і важко відповісти.
Петро Кула

Відповіді:


38

Послідовність завантаження Raspberry Pi в основному така:

  1. Запуск завантаження першого етапу знаходиться в мікросхемі ROM. Завантажує Етап 2 у кеш L2
  2. Етап 2 є bootcode.bin. Вмикає SDRAM і завантажує етап 3
  3. 3 етап є loader.bin. Він знає про .elfформат і навантаженняstart.elf
  4. start.elfвантажі kernel.img. Потім він також читає config.txt, cmdline.txtі bcm2835.dtb якщо dtb файл існує, він завантажується в 0×100& kernel @ 0×8000 Якщо disable_commandline_tagsвстановлено, він завантажує ядро ​​@ 0×0 Інакше він завантажує ядро ​​@ 0×8000і ставить ATAGS на0×100
  5. kernel.img потім запускається на ARM.

Все працює на графічному процесорі, поки kernel.imgне завантажується на ARM.

Цю діаграму я вважаю досить корисною:

Послідовність завантаження


2
Корисно. Чи можна уточнити, якщо завантажувач 2-го ступеня bootcode.bin- це код, який управляє графічним процесором, ARM (а потім який тип коду) або їх суміш? Те саме для 3-го етапу loader.bin(якщо цього не пройшло, як здається).
fgrieu

3
@fgrieu Я відредагував відповідь, щоб включити пояснення. Все працює на графічному процесорі, доки він kernel.imgне працює на ARM.
SG60

1
Відповідно до цього loader.bin більше не використовується. bootcode.binбезпосередньо завантажує start.elfвідповідно до цього Git-
комітету

@ SG60: Чи можете ви оновити свою відповідь інформацією HeatfanJohn?
Пітер Мортенсен

Хтось знає про завантаження NOOBS? Мабуть, там процес дещо інший, включаючи recovery.elf та деякі м'які вимикачі завантаження. Мені цікаво змусити uboot працювати на дещо нижчому рівні.
Сем
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.