Как U-Boot находит ядро?Нужно ли знать точный адрес? - PullRequest
0 голосов
/ 12 декабря 2018

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

Более конкретно, я использую BeagleBone Black.У меня есть SD-карта, разделенная следующим образом (взято из онлайн-примера), раздел FAT32, содержащий MLO + U-Boot, раздел EXT4, содержащий дерево ядра + устройства, и другой раздел EXT4, содержащий rootfs.

Я понимаю, что первичный загрузчик ПЗУ загружается первым, находит файл MLO в разделе FAT, который затем передает управление U-Boot.

Как U-Boot, наконец, точно находит ядро?Это связано с файлом конфигурации загрузки uEnv.txt?Я понимаю, что с U-Boot есть кривая обучения, которая требует некоторого чтения, но только для того, чтобы получить некоторые знания заранее.

Что произойдет, если я изменю образ карты SD и добавлю больше разделов и попытаюсь загрузитьсяс него ядро ​​на другом разделе?Нужно ли конкретно указывать U-Boot, где искать ядро, или он будет продолжать искать, пока не найдет его?

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

u-boot ищет образ ядра по пути, указанному в файле среды u-boot (uEnv.txt) .Вот пример файла uEnv.txt:

console=ttyO0,115200n8
ipaddr=192.168.7.2
serverip=192.168.7.1
loadaddr=0x82000000
fdtaddr=0x88000000
loadfromsd=load mmc 0:2 ${loadaddr} /boot/uImage;load mmc 0:2 ${fdtaddr} /boot/am335x-boneblack.dtb
linuxbootargs=setenv bootargs console=${console} root=/dev/mmcblk0p2 rw 
uenvcmd=setenv autoload no; run loadfromsd; run linuxbootargs; bootm ${loadaddr} - ${fdtaddr}

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

U-boot будет читать загрузочные аргументы из этого файла.

0 голосов
/ 13 декабря 2018

Вы должны указать U-Boot, где находится ядро ​​и как U-Boot загружает ядро ​​в память.Это может быть сеть, USB-карта, NAND Flash, NOR Flash или другое место.

Существует разная конфигурация для разных устройств.Для вашей текущей загрузки вы можете посмотреть этот файл.Это должен быть файл am335x_evm.h .

https://github.com/antmicro/u-boot/blob/master/include/configs/am335x_evm.h

В этом файле есть две разные конфигурации для NAND Flash и MMC-карты.Он сообщает u-boot, где находится ядро, каково имя файла ядра, как ядро ​​должно загружать память.

Вот конфигурация для NAND Flash.

"mtdids=" MTDIDS_DEFAULT "\0" \
"mtdparts=" MTDPARTS_DEFAULT "\0" \
"nandargs=setenv bootargs console=${console} " \
    "${optargs} " \
    "root=${nandroot} " \
    "rootfstype=${nandrootfstype}\0" \
"nandroot=ubi0:rootfs rw ubi.mtd=NAND.file-system,2048\0" \
"nandrootfstype=ubifs rootwait=1\0" \
"nandboot=echo Booting from nand ...; " \
    "run nandargs; " \
    "nand read ${fdtaddr} NAND.u-boot-spl-os; " \
    "nand read ${loadaddr} NAND.kernel; " \
    "bootz ${loadaddr} - ${fdtaddr}\0 

Если вы измените здесь,Он сообщает U-Boot, что он должен прочитать файл "NAND.Kernel" из "$ {loadaddr}" с помощью команды "nand read" .

...