Каковы фактические шаги, предполагая, что у вас есть набор заголовочных файлов C, которые описывают отображаемые в памяти устройства в вашей системе, чтобы сделать начальное работающее ядро? Я знаю, что все просто загружаются с Live CD/USB-флешки и т. д., но как был сделан этот первый bootstrap?
EDIT: Я должен отметить, что на самом деле я говорю об устройствах ARM, я понимаю основы загрузки через BIOS на типичной машине, но предположим, что мы говорим о пользовательском устройстве?
решение1
как был создан этот первый бутстрап?
Создание (написание и кросс-компиляция) программы начальной загрузки не так уж и сложно, как вы полагаете.
Я должен отметить, что на самом деле я говорю об устройствах ARM, я понимаю основы загрузки через BIOS на типичной машине, но предположим, что мы говорим о пользовательском устройстве?
BIOS, на который вы ссылаетесь, по сути является конвенцией ПК. (CP/M также имел BIOS, но он не обязательно находился в энергонезависимой памяти.) Процессоры ARM обычно не имеют и не используют BIOS.
Типичный процессор ARM, используемый сегодня, интегрирован с периферийными устройствами на одной ИС, называемойSoC, система на кристалле. Основная память, например DRAM, и энергонезависимое хранилище, например NAND flash, обычно являются внешними по отношению к SoC для максимальной гибкости проектирования. Но обычно есть небольшое (возможно, 128 КБ) встроенное ПЗУ (постоянное запоминающее устройство) для инициализации минимальных системных компонентов для начала операций начальной загрузки. Сброс процессора всегда приводит к выполнению этого загрузочного ПЗУ. (Это ПЗУ действительно доступно только для чтения и не может быть изменено. Код маскируется в кремнии во время изготовления чипа.)
У каждого поставщика SoC есть свой метод загрузки для загрузки и выполнения ОС. Некоторые используют аппаратную обвязку, считываемую через контакты GPIO, чтобы определить источник следующего этапа последовательности загрузки. Другой поставщик может использовать упорядоченный список памяти и устройств для проверки программы загрузки. Другой метод — переход к прошивке во флэш-памяти NOR, которая может быть выполнена напрямую (т. е. XIP, выполнение на месте).
Одной из проблем начальной загрузки системы, использующей DRAM для основной памяти, является ее аппаратная инициализация. Контроллер памяти DRAM должен быть инициализирован до того, как код может быть загружен в DRAM и выполнен. Так где же находится этот код инициализации, если он не может быть в основной памяти? У
каждого поставщика есть свое собственное решение. Некоторые требуют, чтобы данные конфигурации памяти хранились в энергонезависимой памяти для доступа загрузочного ПЗУ. Некоторые SoC имеют встроенную SRAM (которая не требует инициализации, как DRAM) для выполнения небольшой программы начальной загрузки. Некоторые SoC используют флэш-память NOR для хранения программы начальной загрузки XIP.
После того, как программа начальной загрузки инициализировала DRAM, основная память может использоваться для загрузки следующего этапа загрузки. Это может быть сложная утилита загрузки, такая как U-Boot, или (если программа начальной загрузки способна) ядро Linux. Обратите внимание, что может быть несколько программ начальной загрузки или этапов, которые должны быть выполнены между сбросом процессора и выполнением ОС.
Требования к загрузке ядра Linux ARM изложены в следующем документе:http://www.simtec.co.uk/products/SWLINUX/files/booting_article.html
Более старые версии Linux ARM использовали список ATAGs для передачи базовой информации о конфигурации ядру. Современные версии предоставляют полную конфигурацию платы с использованием скомпилированного двоичного файла дерева устройств.
Очевидно, что на вопрос «как сделать бутстрап?» невозможно ответить без некоторых оговорок.
Как и BIOS ПК, загрузочное ПЗУ SoC является собственностью и не выпускается (если вы не подписываете NDA, если вообще вы это делаете). Но большая часть другого загрузочного кода выпускается под лицензией GPL или аналогичной и легко доступна.
ПРИЛОЖЕНИЕ
Поскольку вы упомянули, что используете Zynq 7000 (который использует Xilinx SoC), у Xilinx есть видеоруководство поКак создать загрузочный образ Linux.
Это видео подтверждает то, что я уже написал:
1. Xilinx SoC имеет встроенное загрузочное ПЗУ (технически это первый этап, но чаще игнорируется или описывается как нулевой этап).
2. Существуют «контакты режима» для указания источника программы начальной загрузки для следующего этапа.
3. Загрузочное ПЗУ загружает программу начальной загрузки (технически это второй этап, но часто описывается как «первый» этап), называемую FSBL, во встроенную SRAM. Эта программа инициализирует DRAM и загружает следующий этап, U-Boot.
4. U-Boot выполняется из DRAM и загружает ядро Linux.
Видео демонстрирует, что исходный код FSBL можно загрузить с сайта Xilinx и скомпилировать за несколько шагов. Нет"обманывать"как вы утверждаете. Сборка представляет собой простую настройку и кросс-компиляцию, что я нахожу проще/легче, чем типичный пакет приложения.
Возможно, ваша путаница основана на неоднозначности загрузочного носителя, т. е. источник(и) загрузочных образов не были указаны. В видео упоминаются NAND flash и SDcard как возможные загрузочные устройства.
Загрузочное ПЗУ направлено на чтение образа FSBL с исходного носителя, как настроено контактами режима.
FSBL (если он похож на другие bootstrap-ы, которые я использовал) создан для чтения U-Boot с настроенного исходного носителя. Альтернативы во время выполнения нет.
U-Boot пытается соответствовать своему названию («универсальный») и может быть настроен (с помощью переменных среды) для загрузки образов (и скриптов) с различных устройств. Также есть интерактивный вариант.
Также см. вики Xilinx наZynq Linux, в котором говорится, что «полную информацию о загрузке Zynq можно найти вТехническое справочное руководство".