Какова последовательность загрузки?

35

Мне интересно, какова последовательность загрузки Raspberry Pi в типичной настройке (скажем, NOOBS), от приложения питания (или горячего сброса, если это не так) до, скажем, появления логотипа; или где это описано.

Помимо самой необходимой общей картины этой последовательности, меня больше всего интересуют ранние стадии:

  1. Что такое вектор сброса для процессора ARM, и как / где это определяется?
  2. Из какой памяти извлекаются первые инструкции процессора ARM? Где это и какие технологии используются для хранения этого кода?
  3. Это код ARM32 или Thumb (или, возможно, Jazelle)? Это зависит от младшего бита вектора сброса?
  4. Доступен ли исходный код (или разборка, или дамп) этого раннего загрузочного кода? Если нет, то что-нибудь техническое препятствует использованию порта JTAG для определения этого? Что касается юридического, я готов взять на себя риск доверять моему пониманию законодательства, применимого в том месте, где я живу (Франция), а именно, что я полностью могу анализировать свой собственный компьютер, по крайней мере, в отсутствие явного договорного Требование не делать этого.
  5. В каком порядке инициализируются периферийные устройства и каким фрагментом кода?
  6. Помимо процессора ARM, есть ли в BCM2835 какие-либо процессоры / автоматы, и положительно, как их последовательность загрузки связана с процессором ARM?

Я готов нырнуть в процессоре ARM в Техническом справочном руководстве и BCM2835 ARM Периферийных устройств , или любой другой документ.

Обновление: после публикации я обнаружил, что это и это , утверждая, что графический процессор BCM2835 действует как мастер для ARM и активно участвует в последовательности загрузки.

fgrieu
источник
4
Все, что я могу сказать, что большая часть этой информации является закрытым исходным кодом, таким как исходный код, загрузчики и прошивка SoC. На данный момент выделение неизвестно. Вы должны знать одну вещь. BCM - это графический процессор ... а не процессор. Загрузчик запускается в разделе графического процессора, инициализирует там ОЗУ и передает ЦП, где мы имеем первый доступ к исходному коду ... он же Raspbian. Удачи. Этот вопрос очень широкий и трудно ответить.
Петр Кула
Связанный: Что происходит во время процесса загрузки? , Дублирование?
Питер Мортенсен

Ответы:

38

Последовательность загрузки Raspberry Pi в основном такая:

  1. Этап 1 загрузки находится в ПЗУ. Загружает 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.

Все работает на GPU, пока не kernel.imgбудет загружен на ARM.

Я нашел эту диаграмму довольно полезной:

Последовательность загрузки

оборота SG60
источник
2
Полезно. Можно ли уточнить, является ли загрузчик 2-го этапа bootcode.binкодом, запускаемым графическим процессором, ARM (и затем каким типом кода), или их комбинацией? То же самое для 3-го этапа loader.bin(если это не так, как кажется).
августа
3
@fgrieu Я отредактировал ответ, чтобы включить пояснения. Все запускается на графическом процессоре, до kernel.imgкоторого запускается на ARM.
SG60
1
По этому loader.bin больше не используется. bootcode.binнепосредственно загружает в start.elfсоответствии с этим Git commit
HeatfanJohn
@ SG60: Можете ли вы обновить свой ответ информацией от HeatfanJohn?
Питер Мортенсен
Кто-нибудь знает про загрузку NOOBS? по-видимому, процесс немного отличается, он включает в себя recovery.elf и некоторые действия, связанные с мягкой загрузкой. Мне любопытно, чтобы Uboot работал на немного более низком уровне.
Сэм