Подтвердить что ты не робот

Зачем нам нужен загрузчик во встроенном устройстве?

Я работаю с ядром ELinux на ARM cortex-A8.

Я знаю, как работает загрузчик и какую работу он выполняет. Но у меня вопрос: зачем нужен загрузчик, почему родившийся загрузчик?

Почему мы не можем напрямую загружать ядро ​​в ОЗУ из флэш-памяти без загрузчика? Если мы загрузим его, что произойдет? На самом деле процессор не поддерживает его, но почему мы следуем процедуре?

4b9b3361

Ответ 1

Загрузочный загрузчик - это компьютерная программа, которая загружает основную операционную систему или среду выполнения для компьютера после завершения самотестирования.

^ Из Статья в Википедии

Таким образом, в основном загрузчик выполняет именно то, что вам нужно - копирование данных из флеш-памяти в операционную память. Это действительно так просто.

Если вы хотите узнать больше об обновлении ОС, я настоятельно рекомендую вам прочитать связанную статью. Фаза загрузки состоит, помимо тестов, также проверки периферийных устройств и некоторых других вещей. Пропуск их имеет смысл только на очень простых встроенных устройствах, и поэтому их загрузчики еще проще:

Некоторые встроенные системы не требуют заметной последовательности загрузки, чтобы начать работу, и при включении могут просто запускаться операционные программы, которые хранятся в ПЗУ.

Тот же источник

Ответ 2

В контексте Linux загрузчик отвечает за некоторые предопределенные задачи. Поскольку этот вопрос с тегами, я думаю что Загрузка ARM может быть полезным ресурсом. В частности, загрузчик был/отвечает за настройку списка ATAG, который описывает объем ОЗУ, командную строку ядра и другие параметры. Одним из наиболее важных параметров является тип машины. С деревьями устройств передается полное описание платы. Это делает невозможным загрузку запаса ARM Linux с помощью некоторого кода для настройки параметров, как описано.

Параметры позволяют одному универсальному Linux поддерживать несколько устройств. Например, ядро ​​ARM Debian может поддерживать сотни различных типов плат. Uboot или другой загрузчик может динамически определять эту информацию или может быть жестко закодирован для платы.

Вам также может понравиться страница bootloader info здесь при переполнении стека.

Базовая система может установить ATAGS и скопировать NOR flash в SRAM. Однако, как правило, это немного сложнее, чем это. Linux нуждается в настройке RAM, поэтому вам, возможно, придется инициализировать контроллер SDRAM. Если вы используете флеш-память NAND, вам придется обрабатывать плохие блоки, и копия может быть немного сложнее, чем memcpy().

Linux часто имеет некоторые скрытые ошибки драйвера, когда драйвер будет считать, что часы инициализированы. Например, если Uboot всегда инициализирует часы Ethernet для конкретной машины, драйвер Ethernet для Linux может пренебречь настройкой этих часов. Это может быть особенно актуально с часами.

В некоторых системах требуются форматы загрузочных образов, которые не поддерживаются Linux; например, специальный заголовок, который может немедленно инициализировать оборудование; например, конфигурирование devices для чтения исходного кода. Кроме того, часто есть оборудование, которое должно быть настроено немедленно; загрузчик может сделать это быстро, тогда как нормальная структура Linux может задержать это значительно, что приведет к конфликтам ввода-вывода и т.д.

С прагматичной точки зрения проще использовать загрузчик. Однако нет ничего, что помешало бы вам изменить исходный код Linux для загрузки непосредственно из него; хотя, возможно, это похоже на вставку кода загрузчика непосредственно в начало Linux.

См. также: Coreboot, Uboot, Сравнение Википедии. Barebox - это менее известный, но хорошо структурированный и современный загрузчик для ARM. RedBoot также используется в некоторых системах ARM; В дереве ядра поддерживаются разделы RedBoot.

Ответ 3

Основной загрузчик обычно встроен в кремний и выполняет загрузку первого кода USER, который будет запущен в системе.

Загрузочный загрузчик существует, потому что нет стандартизованного протокола для загрузки первого кода, поскольку он зависит от микросхемы. Иногда код можно загружать через последовательный порт, флэш-память или даже жесткий диск. Это функция загрузчика, чтобы найти ее.

Как только пользовательский код загружен и запущен, загрузчик больше не используется, и правильность выполнения системы зависит от пользователя.

Во встроенной цепочке Linux основной загрузчик будет устанавливать и запускать Uboot. Затем Uboot найдет ядро ​​Linux и загрузит его.

Ответ 4

Почему мы не можем напрямую загружать ядро ​​в ОЗУ из флэш-памяти без загрузчика? Если мы загрузим его, что произойдет? На самом деле процессор не поддерживает его, но почему мы следуем процедуре?

Bartek, Artless и Felipe дают части картины.

Каждый тип встроенного процессора (E.G. 386EX, Coretex-A53, EM5200) автоматически выполняет что-то, когда он reset или включен. Иногда что-то отличается в зависимости от того, включено ли питание или устройство reset. Некоторые встроенные процессоры позволяют вам изменить это что-то на основе напряжений, применяемых к различным контактам при питании устройства или reset.

Несмотря на это, существует ограниченное количество , которое может сделать процессор, из-за физического пространства на процессоре, необходимого для определения того, что что-то, включено ли оно -chip FLASH, командный микрокод или какой-либо другой механизм.

Этот предел означает, что что-то

  • фиксированное назначение, делает одно как можно быстрее.
  • ограничено по объему и возможностям, обычно загружая небольшой блок кода (часто несколько килобайт или менее) в фиксированную ячейку памяти и выполняя с начала загруженного кода.
  • неизменяемым.

Так что процессор в ответ на reset или силовой цикл не может быть изменен и не может сделать очень много, и мы не хотим, чтобы он автоматически копировал сотни мегабайт или гигабайт в память, которые могут не существовать или не может быть инициализирован и может занять время ожидания.

Так....

Мы настраиваем небольшую программу, которая меньше минимального размера, разрешенного для всех устройств, которые мы будем использовать. Эта программа хранится везде, где требуется что-то.

Иногда небольшая программа - U-Boot. Иногда даже U-Boot слишком большой для начальной загрузки, поэтому небольшая программа затем загружает U-Boot.

Дело в том, что все, что загружается чем-то, является модифицируемым, если необходимо для конкретной системы. Если это U-Boot, отлично, если нет, то он знает, где загрузить основную операционную систему или где загружать U-Boot (или какой-либо другой загрузчик).

U-Boot (говоря о загрузчиках в целом) затем настраивает минимальный набор устройств, память, настройки чипов и т.д., чтобы включить загрузку и запуск основной ОС. Основной ОС init заботится о любой дополнительной конфигурации или инициализации.

Итак, последовательность:

  • Включение питания процессора или reset
  • Что-то загружает начальный загрузочный код (или встроенный загрузчик в стиле U-Boot)
  • Начальный загрузочный код (может не понадобиться)
  • U-Boot (или другой общий встроенный загрузчик)
  • Linux init

Ответ 5

Ядро требует оборудования, на котором вы работаете, чтобы находиться в определенном состоянии. Все оборудование, которое вы использовали, должно быть проверено для его состояния и инициализировано для его дальнейшей работы. Это одна из основных причин использования загрузчика во встроенной (или любой другой среде), помимо использования для загрузки образа ядра в ОЗУ.
Когда вы включаете систему, ОЗУ также не находится в полезном состоянии (полностью инициализированном для использования), чтобы мы могли загружать в него ядро. Поэтому мы не можем напрямую загрузить ядро ​​(чтобы ответить на ваш вопрос) и, следовательно, возникла необходимость в инициализации конструкции.

Ответ 6

Помимо того, что указано во всех других ответах - что правильно, в некоторых случаях система должна проходить различные режимы выполнения, например, в качестве TrustZone для защищенных чипов ARM. Можно по-прежнему рассматривать его как своего рода инициализацию HW, но то, что делает его особенным, заключается в том, что существуют дополнительные ограничения (например: доступная память), которые делают невозможным, если не невозможным, все в одном бинарном режиме, таким образом доступны несколько этапов загрузчика.

Кроме того, по соображениям безопасности каждый из них подписан и может выполнять свою работу только в том случае, если он отвечает требованиям безопасности.