Этапы загрузки SoC BCM2837 (Raspberry Pi 3)

SoC BCM2837, лежащий в основе Raspberry Pi 3, использует уникальную четырёхэтапную загрузочную последовательность. Главная особенность инициализация начинается с GPU, а не CPU. Это важно понимать для разработки на низком уровне.

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

  1. ROM-код в GPU Записанный на чипе ROM запускается сразу после подачи питания. Он ищет загрузочный файл bootcode.bin на первом разделе microSD (FAT32).

  2. bootcode.bin Загружается в GPU. Его задача инициализировать SDRAM и подготовить систему к дальнейшей загрузке. После этого загружается и исполняется start.elf.

  3. start.elf Это проприетарная прошивка GPU. Она выполняет инициализацию графики, камеры, HDMI, USB и других подсистем. Именно start.elf выбирает ядро Linux (например, kernel.img) и передаёт ему управление. Он также применяет конфигурацию из config.txt и cmdline.txt.

  4. 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 можно встроить вручную, если требуется больше гибкости.