Bootloader
目录
Bootloader 的三大核心使命(底层逻辑)
“交互式”和“直接加载”是什么?
嵌入式 Linux 跟 PC 不同,PC 有 BIOS/EFI 固件,但嵌入式没有 BIOS。芯片内部的固化 ROM(只读存储器)中只有一段极小的代码(几十 KB),它的唯一作用就是把外部的 Bootloader(Uboot)加载到内存里运行。然后 Uboot 再去引导内核
最终的启动链条是:芯片固化ROM(一级引导)->Bootloader(Uboot,二级引导)->Linux Kernel->根文件系统
Bootloader 的三大核心使命(底层逻辑)
使命一:极早期硬件初始化
芯片刚上电时,CPU 主频可能只有几十兆赫兹,内存(DDR RAM)还没初始化,根本没法运行巨大的 Linux 内核(动辄几 MB)。Bootloader 最先执行,它负责:配置 CPU 主频(PLL)、初始化内存控制器(让板子上的 DDR 内存能用)。
初始化串口(UART),让你能看到打印信息。
初始化存储设备(NAND Flash、SD 卡、eMMC),为读取内核做准备。
关键点:它把“毛坯房”变成“精装房”,让内核进驻时可以直接使用内存和串口。
使命二:加载内核镜像
Linux 内核原本是一堆压缩文件(zImage/Image),躺在 Flash 或 SD 卡里(相当于“仓库”)。CPU 无法直接在 Flash 上运行代码(太慢且受限)。Bootloader 必须:读取存储设备中的内核镜像和设备树(DTB)文件。
将其搬运(拷贝)到内存(DDR)的指定物理地址上。
如果是压缩格式,部分 Bootloader 还会解压它。
使命三:传递启动参数并跳转
内核启动时需要知道一些关键信息,比如“根文件系统在哪”(是 mmcblk0p2 还是 NFS 网络挂载)、“控制台是哪个串口”。Bootloader 会在内存中准备好这些参数(ATAGS 或设备树),然后跳转到内核所在的地址,把 CPU 的 PC 指针指向内核入口。从此之后,Bootloader 就“死掉了”,系统完全归内核管。
“交互式”和“直接加载”是什么?
这两个确实是 Bootloader(特别是 Uboot)的两个工作状态,但它们不是核心使命,而是为了方便开发调试提供的人机交互界面:
直接加载(自动模式 /
bootcmd):
这是“生产上线状态”。上电后,Bootloader 倒计时几秒,如果没人按键盘,它就会自动执行预设的指令(比如bootcmd),自动完成上面的“使命二”和“使命三”,直接启动 Linux。这是产品最终卖给用户时的状态,通电即进系统。交互式(命令行模式 / CLI):
这是“研发调试状态”。在倒计时期间按下任意键,系统会停在 Shell 命令行(类似一个小型操作系统)。它的用途极其强大:救砖:如果把内核烧坏了,系统起不来,通过交互式命令行可以在线重烧(比如用
tftp网络下载新的内核到内存,然后直接启动),不用拆机。修改参数:不用重新编译,直接改启动参数(
setenv bootargs),比如切换成网络文件系统(NFS)方便驱动调试。裸机测试:直接在内存中跑一段裸机小程序(比如
go 0x80000000),测试硬件好坏。
