embedded-linux - 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 在哪里可以找到内核,或者它会一直搜索直到找到它?
解决方案
您应该告诉 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”文件。
推荐阅读
- ruby-on-rails-6 - Rails 6.0.3.4 中的 Bootstrap-slider-rails gem 有什么替代品吗
- visual-studio - 你如何测试一个nuget包?
- php - 未定义的偏移量:laravel 中的 1
- reactjs - 在子目录中反应路由器 apache 配置
- python - matplotlib 在图形/图像顶部绘制值
- coldfusion - 如何在 ColdFusion 中通过 URL 传递引号?
- typescript - 缩小非联合值的索引类型对象
- azure - PABX API Live Feed 到 Azure SQL
- wordpress - 如何使用 Laravel 中的 Woocommerce Api 将图像存储在 Wordpress 中
- python - 如何根据python中的另一个字典迭代字典?