Некоторые подробности о загрузке ARM Linux

Я пытаюсь понять детали загрузки Linux на архитектуре Arm. Я много искал в Интернете и до сих пор понял некоторые детали, хотя я чувствую, что каждый раз, когда я читаю статью, она приносит много других новых терминов, и это усложняет ситуацию. У меня есть 2 платы под управлением Linux, olimex 9261 и черный beaglebone. Мой опыт работы со встроенными системами, особенно arm, довольно хорош, но я не слишком много играл с Linux (за исключением некоторых программ пользовательского пространства и драйверов char в ядре).

Вот мои вопросы:

На одной плате у меня следующий вывод uboot (linux 2.6.30):

 bootargs=mem=64M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=jffs2
 bootcmd= cp.b 0xC0042000 0x22000000 0x00199954; bootm 0x22000000

Плата имеет 64 МБ ОЗУ (сопоставлено с 0x20000000), 512 МБ флэш-памяти nand (пока сопоставление не обнаружено) и 2 МБ флэш-памяти данных (сопоставлено с 0xc0000000).

Чего я здесь не понимаю:

  • почему в bootargs стоит mem = 64? Разве это не должно быть указано как ATAG или DTB?
  • почему при передаче управления ядру в качестве аргумента используется консоль? Ядро, использующее tty, уже настроено с помощью uboot?
  • initrd против rootfs. Мне это все еще непонятно. Я знаю, что initrd может быть включен в ядро ​​как блочное устройство или как отдельный образ, для которого uboot должен передавать адресные данные в ядро ​​(правда?). Можем ли мы иметь ядро ​​без включенного initrd + другую файловую систему, например, jffs2, из которой ядро ​​будет запускать остальные драйверы? На самом деле я не могу понять всех деталей файловой системы, используемой ядром при загрузке. В этой установке у меня есть 4 файла: uImage, bootstrap, env.bin и файловая система jffs2. Значит, нет initrd. Как это работает? И как процесс рутирования файловой системы указан в вышеупомянутых загрузочных файлах? Насколько я понимаю, ядро ​​должно сначала получить доступ к файловой системе jffs2, затем захватить образ, найденный в / dev / mtdblock1, и смонтировать его. Возможно, я ошибаюсь. На самом деле я, кажется, не понимаю этого взаимодействия между ядром и файловой системой. В приведенном выше bootcmd ядро ​​копируется из nand в sdram, а затем bootm переходит к нему. Но как ядро ​​находит файлы jff во время загрузки? Я вижу эту строку вывода во время загрузки: VFS: подключенный корень (файловая система jffs2) на устройстве 31: 1.

В руководстве пользователя платы я нашел это:

ВНИМАНИЕ: из-за ошибок в микросхеме AT91SAM9261 загрузка с флэш-памяти NAND не поддерживается.

...

Флэш-память NAND 512 МБ (в Linux рассматривается как силиконовый накопитель).

  • После компиляции ядра я заметил, что System.map содержит не все символы. Я проверил vmlinux, и он тоже. Кто-нибудь знает почему? Может быть, компилятор неправильно настроили?

Большое спасибо, Даниэль.


person mdaniel    schedule 22.12.2014    source источник
comment
На ваш вопрос сложно ответить, потому что у него десяток подвопросов. Может быть, попробуйте разделить на несколько вопросов или переставить этот, чтобы можно было задавать отдельные вопросы.   -  person domen    schedule 23.12.2014


Ответы (2)


  • mem = 64 - я предполагаю, что это может потребоваться перед загрузкой дерева устройств. Может быть нет.
  • tty - но как ядро ​​могло узнать, какой tty был настроен загрузчиком? Должна быть какая-то конфигурация, либо переданная, скомпилированная, либо просто настройка по умолчанию.
  • initrd (или initramfs) против ничего - initrd - это просто очень маленькое пользовательское пространство, которое может т.е. запросить пароль для дешифрования, дождаться подключения USB-устройства с rootfs или чего-то еще. Все могло бы работать и без, просто не забудьте затем скомпилировать все необходимые модули для загрузки из rootfs. Если я правильно помню, несколько лет назад initramfs был представлен как замена initrd. Это архив CPIO, упакованный внутри ядра, и это может быть то, что вы видите, когда "нет initrd"
person domen    schedule 22.12.2014
comment
Я читал про CPIO, включенный во все ядра 2.6.30. В документе linux говорится, что нет необходимости монтировать его как блочное устройство, просто создайте папку и извлеките образ туда. Значит, мы уже запускаем файловую систему до того, как смонтировали initrd? Я действительно не понимаю этот порядок файловых систем, видимых и монтируемых ядром, и тот факт, что одна монтируется как ramdisk. Как насчет другого, например моего jffs2? Как это смонтировано? Я думаю, что вся эта теория файловых систем, связанных с ядром, расплывчата. И я уже много читал, но что-то не соответствует моему пониманию :( - person mdaniel; 24.12.2014

На большинство ваших вопросов можно ответить, прочитав Документация, поставляемая с исходным кодом Linux. Некоторые ключевые файлы:

  • ядро-параметры.txt
  • arm / boot.txt

Пожалуйста, просмотрите их, так как в них будет информация, актуальная для вашей версии Linux.


На одной плате у меня следующий вывод uboot (linux 2.6.30):

Ядро 2.6.30 предшествует деревьям устройств для ARM.

почему в bootargs стоит mem = 64? Разве это не должно быть указано как ATAG или DTB?

Есть два механизма. ATAGS более гибок, поскольку он может указывать несколько несмежных банков памяти. Идея состоит в том, что загрузочный код может проверять память и предоставлять ее через ATAGS. Это теория. Часто это сложно сделать, поэтому разрешить пользователю указать mem = 64 гораздо проще реализовать. Если существует два типа плат, одна с 64 МБ и одна с 128 МБ, пользователь должен предоставить командную строку для использования дополнительной памяти.

почему при передаче управления ядру в качестве аргумента используется консоль? Ядро, использующее tty, уже настроено с помощью uboot?

Некоторые устройства имеют несколько последовательных портов. Некоторые ядра могут захотеть использовать порт u-boot для чего-то другого. Модем HDSPA, принтер и т. Д. Ядро Linux и консоли u-boot могут отличаться. Это особенность. Я часто использую / dev / null в качестве консоли. Оборудование часто скупо на дополнительный последовательный порт. Может быть, вам повезло, и люди, занимающиеся аппаратным обеспечением, не думают, что программное обеспечение является бесплатным.

initrd против rootfs.

Вы можете загружаться непосредственно в файловую систему (rootfs), но весь код и механизмы поиска кода должны находиться внутри образа Linux. Даже если они (JFFS2 / NAND), вы можете получить поврежденный rootfs как NAND. Первые 128 МБ NAND обычно более высокого качества. Вы можете поместить сюда Linux с initrd, способный восстанавливать основную файловую систему. Для других загрузочных устройств загрузка устройства может быть непростой, и сложные решения могут быть приняты в образе initrd. Часто initrd требуется гораздо меньше времени для монтирования, и вы можете выполнять некоторые действия быстрее. Наконец, вы можете загружать разные модули, а затем заблокировать загрузку модулей в initrd.

Вы можете использовать rootfs напрямую. Реализовать проще. initrd гораздо более гибкий и мощный. Вы можете перейти с JFFS2 на Ubi / UbiFS. Если у вас нет initrd, это практически невозможно (по крайней мере, гораздо сложнее реализовать).

В этой установке у меня есть 4 файла: uImage, bootstrap, env.bin и файловая система jffs2. Значит, нет initrd.

uImage может иметь прикрепленный к нему initrd. Он монтируется как ramdisk и после него размонтируется switch_root в новый / последний rootfs) память свободна для использования. Однако в вашей командной строке нет информации initrd, поэтому, вероятно, у вас ее нет.

Насколько я понимаю, ядро ​​должно сначала получить доступ к файловой системе jffs2, затем захватить образ, найденный в / dev / mtdblock1, и смонтировать его. Возможно, я ошибаюсь. На самом деле я, кажется, не понимаю этого взаимодействия между ядром и файловой системой. В приведенном выше bootcmd ядро ​​копируется из nand в sdram, а затем bootm переходит к нему. Но как ядро ​​находит файлы jff во время загрузки? Я вижу эту строку вывода во время загрузки: VFS: подключенный корень (файловая система jffs2) на устройстве 31: 1.

У вас есть информация для поиска устройства; root=/dev/mtdblock1 и вы указали ему тип файловой системы; rootfstype=jffs2. Недостающий элемент - init=/sbin/init. Вы можете прочитать об этом в kernel-parameters.txt для вашего Linux. После монтирования JFFS2 код init ищет процесс для запуска. Это родительский процесс всего, и он начнет выполнять множество различных процессов. Обычно это init, но вы можете указать init=/bin/sh и будет просто оболочка для начала. Это может быть хорошим способом разработки образа initrd, поскольку вы можете тестировать сценарии с запущенным только одним процессом.

После компиляции ядра я заметил, что System.map содержит не все символы. Я проверил vmlinux, и он тоже. Кто-нибудь знает почему? Может быть, компилятор неправильно настроили?

System.map - это на самом деле только внешние функции и данные. Он не включает все функции. На самом деле некоторые функции могут не существовать из-за встраивания.

ВНИМАНИЕ: из-за ошибок в микросхеме AT91SAM9261 загрузка с флэш-памяти NAND не поддерживается.

Думаю, это работа u-boot.

person artless noise    schedule 23.12.2014
comment
Привет, спасибо за ответы. Что касается system.map, это странно. Если я хочу отладить его по символам, что мне тогда делать? Что касается initrd, по моему мнению, если ramdisk подключен к ядру во время компиляции, то нет необходимости передавать какой-либо адрес из загрузчика. Как я читал, INITRD_PHYS установлен на этот адрес. Правда? В моем ядре 2.6.30 это определено. Альтернативой является копирование отдельного образа initrd в память и присвоение адреса ядру с помощью ATAGS. - person mdaniel; 24.12.2014
comment
2-й комментарий, поскольку у меня нет места для всех моих вопросов: Для initrd / rootfs: какая файловая система 1-го уровня работает в ядре? Будет ли у нас все время рутфс? Если да, это должно указывать либо на initrd, либо на другую файловую систему, такую ​​как jffs2 в моем случае? root = / dev / mtdblock1 = ›это блочное устройство, как оно связано с моим jffs2? Как ядро ​​находит? / dev / something означает путь в файловой системе. Если файловая система не смонтирована, как этот путь имеет смысл для ядра? 2-й комментарий, так как у меня нет места для всех моих вопросов. - person mdaniel; 24.12.2014
comment
Ну в том-то и дело. Я уже прочитал много документов, что-то не соответствует моему пониманию, возможно, я начинаю с неправильных ожиданий, не знаю. По этой причине я разместил здесь свои вопросы. Учебники я нашел, но кажется, что они уже предполагают то, чего я не знаю, поэтому они бессмысленны для меня. Однако, когда кто-то уже имеет опыт в одной области, не до конца понимает (возможно) то, чего не понимает я новичок. В любом случае спасибо за ответы. - person mdaniel; 24.12.2014
comment
Linux очень гибок. Часто существует двадцать различных способов сделать что-то. Не думайте, что есть только один способ. Вы можете иметь прикрепленный или отсоединенный initrd или вообще не иметь initrd. Некоторые из ваших вопросов не имеют смысла; они могут иметь несколько значений, и я могу выбрать ответ на неправильный вопрос. - person artless noise; 24.12.2014