【DeepSeek】U-Boot 引导加载流程详细分析

张开发
2026/4/20 20:57:31 15 分钟阅读

分享文章

【DeepSeek】U-Boot 引导加载流程详细分析
U-Boot 引导加载流程详细分析本文档详细分析了 U-Boot 的引导加载流程包括从系统加电到将控制权转移给操作系统内核的完整过程。1. 系统启动概述U-Boot 的引导加载流程可以分为以下几个主要阶段硬件初始化阶段初始化 CPU、内存、时钟等基本硬件设备初始化阶段初始化各种外设如串口、存储设备、网络设备等引导准备阶段加载环境变量、解析配置信息内核加载阶段从存储设备或网络加载操作系统内核启动参数准备阶段准备内核启动参数和设备树控制权转移阶段将控制权转移给操作系统内核2. 详细引导流程2.1 硬件初始化阶段当系统加电或复位时CPU 会从预定义的地址开始执行代码。对于 U-Boot这个过程通常从架构特定的start.S文件开始复位向量CPU 从复位向量开始执行通常位于闪存的起始地址基本硬件初始化禁用中断设置 CPU 模式如 ARM 架构的 SVC 模式配置时钟和内存控制器初始化堆栈内存初始化配置 DRAM 控制器测试和初始化内存将 U-Boot 从闪存复制到内存中运行如果需要2.2 设备初始化阶段在硬件基本初始化完成后U-Boot 会初始化各种外设串口初始化配置串口波特率用于输出调试信息存储设备初始化初始化 MMC/SD 卡控制器初始化 NOR/NAND 闪存控制器初始化 SATA/SCSI 控制器如果有网络设备初始化初始化以太网控制器配置网络参数IP 地址、网关等其他设备初始化根据板级配置初始化其他必要的设备2.3 引导准备阶段设备初始化完成后U-Boot 会进行引导前的准备工作加载环境变量从非易失性存储如闪存、EEPROM加载环境变量如果环境变量损坏或不存在使用默认环境变量解析配置信息读取板级配置信息解析引导命令和参数显示启动信息显示 U-Boot 版本信息显示板级信息和硬件配置显示内存配置信息2.4 内核加载阶段引导准备完成后U-Boot 会根据配置加载操作系统内核确定引导设备根据环境变量bootcmd或用户输入确定引导设备可能的引导设备包括MMC/SD 卡、NAND 闪存、网络TFTP、USB 等加载内核镜像从引导设备读取内核镜像到内存指定位置支持多种镜像格式如 zImage、uImage、FIT 镜像等加载设备树从引导设备读取设备树文件.dtb到内存或者使用内置的设备树验证镜像检查镜像的完整性如校验和对于安全启动验证镜像的数字签名2.5 启动参数准备阶段内核镜像加载完成后U-Boot 会准备内核启动参数设置内核命令行参数根据环境变量bootargs设置内核命令行命令行参数包括根文件系统位置、控制台设备、调试选项等准备设备树调整设备树内容如修改内存大小、添加节点等将设备树地址传递给内核设置启动参数结构按照内核要求的格式准备启动参数对于 ARM 架构使用 ATAGs 或设备树2.6 控制权转移阶段一切准备就绪后U-Boot 会将控制权转移给操作系统内核设置内核启动环境禁用中断刷新缓存设置 CPU 模式和状态跳转到内核入口对于 ARM 架构调用bootm或bootz命令传递内核地址、设备树地址和启动参数地址内核接管内核开始执行初始化代码U-Boot 的使命完成3. 引导设备类型U-Boot 支持从多种设备加载内核3.1 存储设备MMC/SD 卡命令mmc read、fatload、ext2load等示例fatload mmc 0:1 0x80000000 uImageNAND 闪存命令nand read示例nand read 0x80000000 0x200000 0x400000NOR 闪存命令cp.b示例cp.b 0x1000000 0x80000000 0x400000SATA 设备命令sata read、ext2load等示例ext2load sata 0:1 0x80000000 /boot/uImage3.2 网络设备TFTP命令tftpboot示例tftpboot 0x80000000 uImageNFS命令nfs示例nfs 0x80000000 192.168.1.100:/nfsroot/uImage3.3 其他设备USB 设备命令usb start、fatload等示例usb start; fatload usb 0:1 0x80000000 uImage串口命令loady示例loady 0x800000004. 引导命令分析U-Boot 提供了丰富的引导命令用于加载和启动内核4.1 bootm 命令用于启动 uImage 格式的内核bootm[addr[arg...]]addr内核镜像在内存中的地址arg可选参数如设备树地址4.2 bootz 命令用于启动 zImage 格式的内核bootz[addr[initrd[:size]][fdt]]addr内核镜像在内存中的地址initrd initramfs 地址可选fdt设备树地址可选4.3 bootefi 命令用于启动 EFI 格式的内核bootefi image_addr[fdt_addr]image_addrEFI 镜像在内存中的地址fdt_addr设备树地址可选4.4 run 命令用于执行环境变量中定义的命令序列run var[...]var环境变量名称如bootcmd5. 环境变量与引导配置U-Boot 使用环境变量来配置引导行为5.1 关键环境变量环境变量描述示例值bootcmd自动引导命令mmc dev 0; fatload mmc 0:1 0x80000000 uImage; bootm 0x80000000bootargs内核命令行参数consolettyS0,115200 root/dev/mmcblk0p2 rw rootwaitbootdelay自动引导延迟时间秒3serveripTFTP 服务器 IP 地址192.168.1.100ipaddr设备 IP 地址192.168.1.10netmask网络掩码255.255.255.0gatewayip网关 IP 地址192.168.1.15.2 配置示例# 设置引导命令setenv bootcmdmmc dev 0; fatload mmc 0:1 0x80000000 uImage; fatload mmc 0:1 0x81000000 dtb; bootm 0x80000000 - 0x81000000# 设置内核命令行setenv bootargsconsolettyS0,115200 root/dev/mmcblk0p2 rw rootwait# 保存环境变量saveenv6. 设备树处理设备树Device Tree是 U-Boot 和 Linux 内核之间传递硬件配置信息的重要方式6.1 设备树加载从存储设备加载fatload mmc0:1 0x81000000 board.dtb内置设备树U-Boot 可以将设备树编译到镜像中使用bootm命令时自动使用内置设备树6.2 设备树修改U-Boot 提供了fdt命令来修改设备树# 查看设备树节点fdt list /# 修改设备树属性fdtset/memory reg0x80000000 0x20000000# 添加设备树节点fdt mknode / new_node7. 安全启动U-Boot 支持安全启动功能确保引导过程的安全性数字签名验证使用密钥对引导镜像进行签名启动时验证镜像的签名安全启动配置启用 CONFIG_SECURE_BOOT 选项配置密钥存储位置安全启动流程验证 U-Boot 自身的签名验证内核镜像的签名验证设备树的签名8. 常见问题与解决方案8.1 内核加载失败症状U-Boot 无法从存储设备加载内核解决方案检查存储设备是否正确初始化检查内核镜像路径是否正确检查存储设备分区是否正确8.2 内核启动失败症状内核加载成功但无法正常启动解决方案检查内核命令行参数是否正确检查设备树是否与硬件匹配检查内核镜像是否与硬件架构匹配8.3 网络引导失败症状无法通过网络加载内核解决方案检查网络连接是否正常检查 TFTP 服务器是否运行检查 IP 地址配置是否正确9. 代码分析9.1 启动流程代码U-Boot 的启动流程主要在以下文件中实现架构特定启动代码arch/arch/cpu/cpu/start.SCPU 启动代码arch/arch/lib/board.c板级初始化代码通用启动代码common/board_f.c第一阶段初始化common/board_r.c第二阶段初始化common/main.c主函数引导命令代码cmd/bootm.cbootm 命令实现cmd/bootz.cbootz 命令实现9.2 关键函数board_init_f()第一阶段初始化函数初始化硬件board_init_r()第二阶段初始化函数初始化设备和环境do_bootm()bootm 命令处理函数do_bootz()bootz 命令处理函数boot_jump_linux()跳转到 Linux 内核10. 总结U-Boot 的引导加载流程是一个复杂但有序的过程从硬件初始化到内核启动每个阶段都有其特定的功能和职责。理解这个流程对于嵌入式系统开发和调试非常重要。通过本文档的分析我们可以看到 U-Boot 提供了灵活、强大的引导加载能力支持多种设备和启动方式能够满足不同嵌入式系统的需求。同时U-Boot 的模块化设计也使得它易于定制和扩展可以适应各种硬件平台。掌握 U-Boot 的引导加载流程对于嵌入式系统开发者来说是一项基本技能有助于快速定位和解决引导相关的问题提高系统开发效率。

更多文章