linuxuboot如何启动
linuxuboot如何启动详细介绍
U-Boot(Universal Boot Loader)是嵌入式系统中常用的引导加载程序,负责初始化硬件、加载 Linux 内核并传递启动参数。以下是 U-Boot 启动 Linux 的典型流程,分为多个阶段,结合原理和操作步骤详细说明:
一、U-Boot 启动的前提条件
- 硬件初始化
U-Boot 需提前烧录到存储设备(如 Flash、SD 卡、eMMC),CPU 复位后从固定地址(如 0x0、0x80000000)加载并执行 U-Boot 的第一阶段代码。
二、U-Boot 启动的核心阶段
1. 第一阶段:汇编代码初始化(低级别硬件)
- 目标:建立最小执行环境,为 C 语言运行做准备。
- 关键操作:
- 初始化 CPU 寄存器(如 PC、SP、CPSR)。
- 关闭 MMU(内存管理单元)和 CPU 缓存。
- 初始化内存控制器(DDR/PDRAM),建立 SDRAM 运行环境。
- 定位 U-Boot 第二阶段代码(通常为
u-boot.bin),将其从存储设备(如 NAND/NOR Flash、SD 卡)加载到 SDRAM。 - 跳转到第二阶段的 C 语言入口(如
start_armboot函数)。
2. 第二阶段:C 语言初始化(高级硬件和功能)
- 目标:初始化更多硬件设备,加载配置,准备内核启动。
- 关键操作:
- 硬件初始化:
- 初始化串口(用于打印日志,如
printf)。 - 初始化存储设备(如 SPI/NAND/EMMC、USB、网络控制器)。
- 初始化时钟、GPIO、中断控制器等。
- 初始化串口(用于打印日志,如
- 环境变量加载:
- 从存储设备(如 Flash、EEPROM)或默认配置读取 U-Boot 环境变量(如
bootcmd、bootargs)。 - 常用变量:
bootcmd:默认启动命令(如从 SD 卡加载内核)。bootargs:传递给 Linux 内核的参数(如根文件系统路径、IP 地址)。
- 从存储设备(如 Flash、EEPROM)或默认配置读取 U-Boot 环境变量(如
- 交互接口:
- 等待用户输入(如按下任意键进入 U-Boot 命令行),否则执行
bootcmd。
- 等待用户输入(如按下任意键进入 U-Boot 命令行),否则执行
- 硬件初始化:
3. 加载 Linux 内核和设备树(DTS)
- 目标:将内核和设备树从存储设备读取到内存。
- 操作步骤:
- 指定存储介质和路径:
通过 U-Boot 命令(如mmc、nand、tftp)指定源设备(如 SD 卡第 1 分区)和目标内存地址(如0x80008000)。bashmmc 0x80008000 0x1000 0x4000mmc 0x83000000 0x5000 0x100
- 校验文件完整性(可选):
使用crc32或md5sum校验内核和设备树是否损坏。bashcrc32 0x80008000
- 指定存储介质和路径:
4. 传递启动参数给内核
- 目标:通过
bootargs变量设置内核启动参数。 - 典型参数:bash
setenv bootargsconsole=ttyS0,115200:指定串口终端设备和波特率。root=/dev/mmcblk0p2:根文件系统所在设备和分区。rootfstype=ext4:文件系统类型。rootwait:等待存储设备初始化。
5. 启动 Linux 内核
- 目标:将控制权移交内核,触发内核启动。
- 关键命令:bash
bootz kernel_addr ramdisk_addr dtb_addrkernel_addr:内核在内存中的加载地址(如0x80008000)。ramdisk_addr:内存磁盘地址(无则填-)。dtb_addr:设备树在内存中的地址(如0x83000000,ARM 架构常用)。
示例:
bash
bootz 0x80008000 - 0x83000000
三、U-Boot 启动的配置与定制
- 环境变量管理
- 保存配置:
saveenv(将变量写入存储设备)。 - `(将变量写入存储设备)。
- 临时修改:
setenv bootcmd "mmc read ... && bootz ..."(立即生效,断电丢失)。
- 保存配置:
- 设备树(DTS)
- U-Boot 需支持解析设备树,通过
fdt命令操作(如fdt addr 0x83000000指定设备树地址)。
- U-Boot 需支持解析设备树,通过
- 网络启动(TFTP/NFS)
- 配置网络参数(IP、服务器 IP):bash
setenv ipaddr .1.100setenv serverip .1.200
tftp 0x80008000 zImage
- 配置网络参数(IP、服务器 IP):bash
四、常见问题与调试
- 启动失败排查
- 检查 U-Boot 日志(串口输出),确认是否在加载内核或设备树时出错。
- 验证内存地址是否正确,存储设备是否可读(如
mmc list、fatls mmc 0:1)。
- 内核参数错误
- 确保
bootargs中的设备节点(如/dev/mmcblk0p2)与实际硬件分区一致。
- 确保
- 设备树不匹配
- 确认设备树(.dtb)与硬件平台匹配,U-Boot 需正确加载并传递给内核。
总结
U-Boot 启动 Linux 的核心是:初始化硬件→加载内核和设备树→传递参数→触发内核执行。通过配置环境变量和命令,可灵活适配不同存储介质(本地存储、网络)和硬件平台。实际开发中需结合具体硬件修改 U-Boot 源码(如board.cfg、设备驱动),或通过命令行动态调整启动流程。