路由器启动探秘:BL2、FIP 与 U-Boot 各个mtdblock bootloader Config Bdata factory crash ubi kernel 等块
概述
在嵌入式 Linux 系统(尤其是基于 ARM 架构的设备,如路由器、开发板)中,启动流程和固件分区结构是理解设备工作原理和进行刷机、开发的基础。下面我将为你详细介绍这些概念。
启动流程与核心组件
整个启动流程是一个层层递进、环环相扣的过程,可以想象成接力赛,每一棒都将系统初始化推向更高级的阶段。
-
上电与 ROM 代码 (BL0)
设备通电后,CPU 首先执行固化在芯片内部只读存储器(ROM)中的代码,这通常被称为 BL0(Boot Loader Stage 0)。它的主要任务是进行最基础的硬件初始化,并确定从哪个外部介质(如 eMMC、SD 卡、NAND/NOR Flash)加载下一级引导程序。 -
初级引导加载程序 (BL1 / Preloader / BL2)
这是启动链中的第一个可编程阶段,名称因平台而异,常被称为BL1、Preloader或BL2。- 运行位置: 由于此时外部大容量内存(DDR)尚未初始化,这段代码通常非常小,会加载到 CPU 内部的高速缓存(SRAM)中执行。
- 核心任务: 它的主要职责是初始化最关键的硬件,特别是 DDR 内存控制器。只有 DDR 初始化成功后,后续更复杂的程序才有足够的空间运行。此外,它还会初始化串口(用于打印调试信息)、时钟等。
-
ARM Trusted Firmware (ATF) 与 FIP
在初始化 DDR 后,系统会进入 ARM Trusted Firmware (ATF) 阶段,这是 ARM 架构安全启动的核心。- FIP (Firmware Image Package): 这是一个“固件镜像包”,可以理解为一个压缩包,里面包含了后续启动所需的所有关键组件。
- FIP 的内容:
- BL31: ATF 的运行时固件,负责管理安全世界(Secure World)和非安全世界(Normal World)之间的切换,处理电源管理等安全请求。
- BL32 (可选): 可信执行环境(TEE)操作系统,如 OP-TEE。
- BL33: 非安全世界的入口,通常就是我们的 U-Boot。
- 执行流程:
BL2会解析并加载 FIP 中的各个组件,然后跳转到BL31。BL31完成安全环境的设置后,最终将控制权交给BL33,即 U-Boot。
-
U-Boot (Universal Boot Loader)
U-Boot 是功能最丰富的引导加载程序,也是开发者最常打交道的部分。- 运行位置: 此时 DDR 已完全可用,U-Boot 在内存中运行,可以执行复杂的操作。
- 核心任务: 初始化更多外设(如网络、存储、显示),提供命令行界面,加载并引导操作系统内核。
-
操作系统内核 (Kernel)
U-Boot 从其指定的存储位置(如 Flash 的kernel分区)将 Linux 内核加载到内存中,并传递必要的启动参数,然后启动内核。至此,引导加载程序的任务完成,操作系统接管整个系统。
启动流程全景图
为了让你一眼看懂,我们先看这张核心流程图。这是一个从通电到系统启动的完整链路:
Flash 分区详解
分区对应查询
为了管理上述启动组件和操作系统,存储设备(如 NAND/NOR Flash, eMMC)会被划分为多个逻辑区域,即 MTD (Memory Technology Device) 分区。
| 分区/组件名称 | 对应文件/内容 | 主要用途 |
|---|---|---|
| bootloader | Preloader / BL2 |
存放初级引导加载程序,负责初始化 DDR。 |
| fip | u-boot.fip / bl31-uboot.fip |
存放 FIP 包,内含 BL31 (ATF) 和 BL33 (U-Boot)。 |
| factory | factory 分区 |
存放设备的唯一信息,如 MAC 地址、校准数据、序列号等。 |
| Config / Bdata | Config / Bdata 分区 |
存放用户或厂商的配置信息,如默认密码、区域设置等。 |
| crash | crash 分区 |
用于记录系统崩溃时的日志(如 pstore/ramoops),便于调试。 |
| kernel | kernel 分区 |
存放 Linux 内核镜像(如 zImage 或 Image)。 |
| ubi | ubi 或 rootfs 分区 |
一个集成了文件系统的分区,通常包含 U-Boot 环境变量、内核和设备树,用于系统升级和恢复。 |
| mtdblock | - | 这是 Linux 内核为 MTD 设备创建的字符设备接口,用户空间程序通过它来读写 Flash 分区。 |
路由中查看块/分区信息
cat /proc/mtd
输出参考
root@XIAOMI-3G:~# cat /proc/mtd
dev: size erasesize name
mtd0: 00080000 00020000 "Bootloader"
mtd1: 00040000 00020000 "Config"
mtd2: 00040000 00020000 "Bdata"
mtd3: 00040000 00020000 "factory"
mtd4: 00040000 00020000 "crash"
mtd5: 00040000 00020000 "crash_syslog"
mtd6: 00040000 00020000 "reserved0"
mtd7: 00400000 00020000 "kernel_stock"
mtd8: 00400000 00020000 "kernel"
mtd9: 07580000 00020000 "ubi"
查看块大小
需安装 lsblk插件
lsblk
输出内容参考
root@XIAOMI-3G:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
mtdblock0 31:0 0 512K 1 disk
mtdblock1 31:1 0 256K 0 disk
mtdblock2 31:2 0 256K 1 disk
mtdblock3 31:3 0 256K 1 disk
mtdblock4 31:4 0 256K 0 disk
mtdblock5 31:5 0 256K 0 disk
mtdblock6 31:6 0 256K 1 disk
mtdblock7 31:7 0 4M 0 disk
mtdblock8 31:8 0 4M 0 disk
mtdblock9 31:9 0 117.5M 0 disk
ubiblock0_0 254:0 0 18.6M 0 disk /rom
MTD 分区管理核心操作命令
方案一:mtd 命令管理
适用场景:OpenWrt 系统、 Breed 等高级 Bootloader。
特点:这是 OpenWrt 的原生工具,最安全。它会自动处理 Flash 的擦除、写入和坏块跳过,且支持直接通过分区名称(如 FIP、kernel)操作,无需记忆设备号。
方案二:dd 命令管理 (底层通用)
适用场景:标准 Linux 系统、精简版 Rescue 模式、或 mtd工具缺失的环境。
特点:这是 Linux 底层的“数据复制”工具,功能强大但风险较高。它直接对设备节点(如 /dev/mtdblock1)进行操作,不会自动擦除 Flash,且需要用户准确知道分区对应的设备号。
管理方案对比总结
| 特性 | 方案一 (mtd 工具) |
方案二 (dd 命令) |
|---|---|---|
| 操作对象 | 分区名称 (如 FIP, kernel) |
设备号 (如 /dev/mtdblock1) |
| 安全性 | 高 (自动擦除,处理坏块) | 中 (需手动擦除,容易出错) |
| 校验方式 | 内置 verify 命令,一键完成 |
需配合 md5sum 手动计算对比 |
| 推荐指数 | ⭐⭐⭐⭐⭐ (首选) | ⭐⭐⭐ (备选/救砖用) |
刷机原理与方式
刷机的本质就是用新的文件替换掉 Flash 中旧分区的内容。根据系统状态的不同,主要有以下几种方式:
-
在 U-Boot 下刷机
这是最常用的刷机方式之一。当设备启动到 U-Boot 阶段时,可以通过 U-Boot 命令行或特定的菜单选项进行刷机。- 原理: U-Boot 初始化了网络和存储驱动,因此可以通过 TFTP 协议从电脑下载新的固件文件(如
fip、kernel等),然后使用mtd write等命令将文件写入到对应的 Flash 分区中。 - 适用场景: 系统无法正常启动,但 U-Boot 未损坏。
- 原理: U-Boot 初始化了网络和存储驱动,因此可以通过 TFTP 协议从电脑下载新的固件文件(如
-
在系统内刷机 (Sysupgrade)
当设备已经成功进入 OpenWrt 或其他 Linux 系统后,可以使用系统自带的工具进行升级。- 原理: 使用
sysupgrade命令,它会自动处理内核和文件系统的更新,并保留用户配置。这种方式通常会刷写kernel和ubi/rootfs分区。 - 适用场景: 常规的系统版本升级。
- 原理: 使用
-
救砖模式 (如 NOR Flash 启动)
一些设备设计了双重启动机制,例如同时拥有 NAND 和 NOR Flash。当 NAND Flash 中的系统被刷坏(变砖)后,可以通过物理开关切换到 NOR Flash 启动一个精简的救援系统。- 原理: 在救援系统中,可以访问并修复 NAND Flash 的各个分区,重新写入正确的
bootloader、fip和系统镜像,从而恢复设备。
- 原理: 在救援系统中,可以访问并修复 NAND Flash 的各个分区,重新写入正确的
总而言之,理解从
BL2 到 FIP 再到 U-Boot 的启动链条,以及各个 Flash 分区的功能,是进行嵌入式开发和故障排除的关键。刷机操作就是针对这些分区的精确替换和修复。
版权所有 © 【代码谷】 欢迎非商用转载,转载请按下面格式注明出处,商业转载请联系授权,违者必究。(提示:点击下方内容复制出处)
源文: 路由器启动探秘:BL2、FIP 与 U-Boot 各个mtdblock bootloader Config Bdata factory crash ubi kernel 等块 ,链接:https://www.daimagu.com/article/2604221047594234.html,来源:代码谷
评论