首页 > 解决方案 > U-Boot如何找到内核?是否需要知道确切的地址

问题描述

我是嵌入式系统上 Linux 编程的新手。我希望了解更多有关嵌入式引导加载程序和 U-boot 的信息。我的主要问题无疑是通用的,但我试图了解 U-boot 如何准确找到 Linux 内核。

更具体地说,我使用的是 BeagleBone Black。我有一个 SD 卡分区如下(取自在线示例),一个包含 MLO + U-Boot 的 FAT32 分区,一个包含内核 + 设备树的 EXT4 分区和另一个包含 rootfs 的 EXT4 分区。

我知道首先加载 ROM 主引导加载程序,在 FAT 分区中找到 MLO 文件,然后将控制权传递给 U-Boot。

那么 U-Boot 是如何最终准确定位内核的呢?这与 uEnv.txt 启动配置文件有关吗?我知道 U-Boot 有一个学习曲线,需要一些阅读,但只是为了提前获得一些知识。

如果我更改 SD 卡映像并放置更多分区并尝试从它启动,而内核位于不同的分区上,现在会发生什么?我是否需要具体告诉 U-Boot 在哪里可以找到内核,或者它会一直搜索直到找到它?

标签: embedded-linuxbeagleboneblackbootloaderpartitionu-boot

解决方案


您应该告诉 U-Boot 内核位于何处以及 U-Boot 应如何将内核加载到内存中。它可以在网络上、uSD 卡、NAND Flash、NOR Flash 或其他地方。

不同的设备有不同的配置。对于您当前的 u-boot,您可以查看此文件。它应该是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 read”命令从“${loadaddr}”中读取“NAND.Kernel”文件。


推荐阅读