U-Boot引导内核详解:nandread与bootm操作

需积分: 10 1 下载量 88 浏览量 更新于2024-09-10 收藏 6KB TXT 举报
在深入理解U-Boot启动内核的过程时,首先要明白的是,U-Boot是一个开放源码的嵌入式Linux启动加载器,它负责引导操作系统内核,并管理硬件设备。本文将聚焦于分析当bootcmd设置为`nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0`时,U-Boot如何启动内核的具体步骤。 1. **设置bootcmd参数**: U-Boot首先通过环境变量`bootcmd`获取启动命令。在这个例子中,`bootcmd`被设置为`nand read.jffs2 0x30007FC0 kernel`,表示从NAND闪存的JFFS2分区中读取内核。`nand read.jffs2`是针对NAND闪存的操作,`0x30007FC0`是一个偏移地址,指示内核文件的位置。 2. **分区管理与文件系统**: 在Mini2440配置中,`MTDPARTS_DEFAULT`定义了NAND闪存的分区结构,包括bootloader、params、kernel和root分区。`nandread.jffs2 0x30007FC0 kernel`中的`kernel`指定了内核文件位于NAND闪存的kernel分区,从0x30007FC0处开始,占用的大小根据实际配置可能有所不同。JFFS2是一种压缩的文件系统,这表明内核文件可能已经被压缩存储。 3. **执行读取操作**: `nand read.jffs2`命令执行实际的读取操作,从NAND闪存的指定位置(这里是0x30007FC0)读取数据,直到找到`kernel`文件。读取完成后,数据会解压到内存中的某个位置,通常是0x00060000,这个地址在`bootm`命令中作为参数出现。 4. **加载与初始化内核**: 当数据读取并解压完毕后,U-Boot调用`bootm`命令,`bootm 0x30007FC0`指定了解压后内核映像的起始地址。`do_bootm()`函数负责执行实际的内核加载和初始化过程,它通常会从解压后的地址开始执行uImage(通常包含了Linux内核),并通过`ih_magic`、`ih_hcrc`和`ih_time`等字段来验证内核头信息的完整性。 5. **内核启动流程**: 内核加载完成后,会按照标准的启动流程继续执行。这包括执行`setup_arch()`函数来初始化处理器架构,然后是`early_platform_setup()`,接着是`start_kernel()`,最终到达用户空间,初始化文件系统和运行用户程序。 U-Boot启动内核的过程涉及环境变量设置、分区管理和文件系统操作,以及加载和验证内核映像。理解这些步骤有助于调试和定制自己的嵌入式设备启动流程。