Я пытаюсь понять детали загрузки 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, и он тоже. Кто-нибудь знает почему? Может быть, компилятор неправильно настроили?
Большое спасибо, Даниэль.