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