Этапы загрузки SoC BCM2837 (Raspberry Pi 3)
SoC BCM2837, лежащий в основе Raspberry Pi 3, использует уникальную четырёхэтапную загрузочную последовательность. Главная особенность инициализация начинается с GPU, а не CPU. Это важно понимать для разработки на низком уровне.
Последовательность загрузки:
ROM-код в GPU Записанный на чипе ROM запускается сразу после подачи питания. Он ищет загрузочный файл bootcode.bin на первом разделе microSD (FAT32).
bootcode.bin Загружается в GPU. Его задача инициализировать SDRAM и подготовить систему к дальнейшей загрузке. После этого загружается и исполняется start.elf.
start.elf Это проприетарная прошивка GPU. Она выполняет инициализацию графики, камеры, HDMI, USB и других подсистем. Именно start.elf выбирает ядро Linux (например, kernel.img) и передаёт ему управление. Он также применяет конфигурацию из config.txt и cmdline.txt.
kernel.img Это собственно ядро Linux. Оно получает управление от GPU уже после всех инициализаций. К ядру может прилагаться *.dtb (Device Tree Blob), передаваемый start.elf.
Схема визуально:
[ROM в GPU] bootcode.bin start.elf kernel.img + cmdline.txt + *.dtb
Особенности загрузки BCM2837:
Первым активен GPU, а не CPU
Загрузка основана на FAT32 и файловой системе
start.elf чёрный ящик, его нельзя заменить
Отладка возможна через UART (enable_uart=1 в config.txt)
Конфигурация определяется до запуска ядра через простые текстовые файлы
Отличие от U-Boot:
На Raspberry Pi используется собственная загрузочная цепочка, в отличие от стандартного U-Boot. Тем не менее, U-Boot можно встроить вручную, если требуется больше гибкости.