uboot启动内核学习笔记

📅 2026/7/8 8:07:56 👁️ 阅读次数 📝 编程学习
uboot启动内核学习笔记

图:笔记内容结构概览,包含多个技术主题的层次化要点整理。

一、Flash 知识点补充

1. Flash 定义

是断电不会丢失数据的存储芯片,用来存放系统、程序、配置信息。

2. Flash 分类

  • NOR Flash:可在芯片上直接执行代码,容量偏小,一般用来存放 U-Boot 启动程序
  • NAND Flash:不能直接执行程序,必须把代码读取到内存后才能运行,用来存储 Linux 内核、系统文件、用户配置、运行日志等大容量数据

二、U-Boot 启动内核整体结构

  1. 通过s=getenv()获取启动环境变量
  2. 调用run_command(s,0)执行启动相关指令

三、分区概念

  1. 嵌入式 Linux 里 Flash 没有原生分区表,bootenv、kernel、文件系统只能在源码里写死,开发时需要重点关注各分区的地址划分。
  2. 分区宏定义示例:
#define MTDPARTS_DEFAULT "mtdparts=nandflash0:256k@0(bootloader),"\ "128k(params),"\ "2m(kernel),"\ "-(root)"
  1. 分区含义解释:这里定义了 MTD 分区,分区位于 nandflash 上:
  • 前 256KB:bootloader(U-Boot 引导程序)分区
  • 接下来 128KB:环境变量参数分区
  • 后续 2MB:kernel(内核)分区
  • 剩余全部空间:root 根文件系统分区

四、读出内核环节

示例命令:nand read.jffs2 0x3007fc0 kernel

含义:从 NAND Flash 上的 kernel 分区,把内核镜像读取到 SDRAM 内存的0x3007fc0地址;后续启动操作就会从内存这个地址读取内核数据。

五、uImage 格式说明

Flash 中保存的内核为 uImage 格式,结构分为头部 + 真正内核两部分:

  1. ih_load:加载地址,存放镜像文件的缓冲区地址,是临时存放完整内核文件、完成解压的运行地址
  2. ih_ep:入口地址,内核解压完成后,程序第一条指令的物理地址;U-Boot 执行bootm时,会自动跳转到该地址启动内核。

六、bootm 命令启动内核

1. bootm 全称

boot memory,从内存启动镜像,专门用来启动 Linux 内核镜像

2. 执行步骤

  1. 读取 uImage 的 64 字节头部信息
  2. 校验镜像文件的完整性
  3. 把压缩内核解压到头部记录的入口运行地址
  4. 关闭 U-Boot 自身的部分硬件、刷新缓存
  5. CPU 跳转到内核入口地址,正式启动 Linux 系统