图:笔记内容结构概览,包含多个技术主题的层次化要点整理。
一、Flash 知识点补充
1. Flash 定义
是断电不会丢失数据的存储芯片,用来存放系统、程序、配置信息。
2. Flash 分类
- NOR Flash:可在芯片上直接执行代码,容量偏小,一般用来存放 U-Boot 启动程序
- NAND Flash:不能直接执行程序,必须把代码读取到内存后才能运行,用来存储 Linux 内核、系统文件、用户配置、运行日志等大容量数据
二、U-Boot 启动内核整体结构
- 通过
s=getenv()获取启动环境变量 - 调用
run_command(s,0)执行启动相关指令
三、分区概念
- 嵌入式 Linux 里 Flash 没有原生分区表,bootenv、kernel、文件系统只能在源码里写死,开发时需要重点关注各分区的地址划分。
- 分区宏定义示例:
#define MTDPARTS_DEFAULT "mtdparts=nandflash0:256k@0(bootloader),"\ "128k(params),"\ "2m(kernel),"\ "-(root)"- 分区含义解释:这里定义了 MTD 分区,分区位于 nandflash 上:
- 前 256KB:bootloader(U-Boot 引导程序)分区
- 接下来 128KB:环境变量参数分区
- 后续 2MB:kernel(内核)分区
- 剩余全部空间:root 根文件系统分区
四、读出内核环节
示例命令:nand read.jffs2 0x3007fc0 kernel
含义:从 NAND Flash 上的 kernel 分区,把内核镜像读取到 SDRAM 内存的0x3007fc0地址;后续启动操作就会从内存这个地址读取内核数据。
五、uImage 格式说明
Flash 中保存的内核为 uImage 格式,结构分为头部 + 真正内核两部分:
ih_load:加载地址,存放镜像文件的缓冲区地址,是临时存放完整内核文件、完成解压的运行地址ih_ep:入口地址,内核解压完成后,程序第一条指令的物理地址;U-Boot 执行bootm时,会自动跳转到该地址启动内核。
六、bootm 命令启动内核
1. bootm 全称
boot memory,从内存启动镜像,专门用来启动 Linux 内核镜像
2. 执行步骤
- 读取 uImage 的 64 字节头部信息
- 校验镜像文件的完整性
- 把压缩内核解压到头部记录的入口运行地址
- 关闭 U-Boot 自身的部分硬件、刷新缓存
- CPU 跳转到内核入口地址,正式启动 Linux 系统