2013-03-21 2 views
14

Я работаю с ядром ELinux на ARM cortex-A8.Зачем нам нужен загрузчик во встроенном устройстве?

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

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

+12

«Почему мы не можем напрямую загружать ядро ​​в оперативную память из флэш-памяти» - это точно, что делает загрузчик. –

+1

Бартек прав. DIY, и я уверен, что это то, что мы называем загрузчиком. – Yang

+1

Даже если код запускается непосредственно со встроенной вспышки, как вы собираетесь загружать флеш-память? Вам, вероятно, понадобится прошивка для загрузки флэш-памяти ... –

ответ

11

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

^ От Wikipedia Article

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

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

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

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

+3

В то время как статья * Wikipedia * полезна, она ориентирована на ПК (в большем смысле) загрузчики. Есть встроенные/ARM/Linux платформы.Встроенные процессоры ARM имеют функции для уменьшения количества компонентов; в частности, устранение вспышки ROM/NOR, которая, как правило, содержит PC BIOS, снижает стоимость. Эта часть наиболее важна: http://en.wikipedia.org/wiki/Bootloader#Other_kinds_of_boot_sequences –

3

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

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

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

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

11

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

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

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

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

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

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

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

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

+0

Файлы в [* arch/arm/boot/compression *] (https://git.kernel.org/cgit/linux/ kernel/git/torvalds/linux.git/tree/arch/arm/boot/compression) - это способ загрузки без загрузчика. Однако они предназначены для машин, которые были в ранней истории ARM Linux, и это больше не поддерживается; но теоретически можно было бы сделать аналогичную вещь; напишите свой собственный * head-machine.S *, который устанавливает DDR и запускается из «вектора сброса». На самом деле, это может быть проще с современным ARM Linux и ** приложенным DTB **. –

0

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

1

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

Bartek, Artless и Felipe все дают части изображения.

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

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

Это ограничение означает, что что-то является

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

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

Так ....

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

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

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

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

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

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

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

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

Смежные вопросы