文章目录
简单了解启动流程
大致流程:
1. 上电与复位
2. 第一阶段引导加载程序 (BOOT0/SPL)
3. 第二阶段引导加载程序 (U-Boot)
4. Linux 内核启动
5. 用户空间初始化
6. 系统就绪
1. 上电与复位
当电源接通时,CPU 处于复位状态,执行位于 ROM 或者专用启动区域中的初始引导代码。
2. 第一阶段引导加载程序 (BOOT0/SPL)
- 描述: BOOT0或者SPL通常存储在内部 Flash 或外部 SPI Flash 中的小型引导加载程序。
- 主要用于:
- 加载第二阶段引导加载程序(U-Boot)到 RAM 并跳转执行。
- 初始化必要的外设(如 UART 用于调试输出)。
- 配置 SDRAM 控制器并初始化内存。
3. 第二阶段引导加载程序 (U-Boot)
U-Boot
- 描述:功能更强大的引导加载程序,负责进一步初始化硬件并准备操作系统内核的加载。
- 主要用于:
-
初始化硬件:配置所有关键硬件组件,如 I2C、SPI、USB、网络接口等。
-
设置时钟频率:调整 CPU 和其他总线的速度以达到最佳性能。
-
初始化显示子系统:如果支持图形界面,则初始化显示器和相关驱动。
-
初始化 DRAM:确保外部内存可以正常工作,并可能进行简单的测试。
-
加载环境变量:从非易失性存储器中读取 U-Boot 的环境变量,这些变量控制着后续的操作,例如要加载的内核镜像位置。
-
加载内核和 DTB:从存储介质(如 SD 卡、eMMC、NAND Flash)中读取 Linux 内核和 DTB 文件到内存。
-
传递控制权给内核:将控制权交给 Linux 内核,并提供必要的准备启动参数(如启动地址,)、(如 root= 指定根文件系统的路径)、内核镜像在内存中的地址、Device Tree Blob (DTB) 的地址等。
-
简单来说,U-Boot 负责从 eMMC 等存储介质搬各种东西(如内核、DTB 等)到 DDR(动态随机存取存储器) 中,(也就是从存储内存搬到运行内存中),并且告诉内核这些东西搬过去放到DDR的哪个地址。此外,U-Boot 还承担了初始化关键的硬件和准备启动参数(从哪个地址开始启动内核镜像,从哪地址解析DTB,以及指定的跟文件系统的路径)的重要任务,以确保内核能够在正确环境中启动,交代完这些,就将控制权交给了内核。
一句话概括:就是初始化关键硬件,将eMMC内存里的部分东西搬到DDR里面,并交代搬过去的东西所放的地址,以及后面需要的各种启动参数(),解析DTB地址参数,等各种参数,交代完毕了,再将控制权给内核。
小细节
这里注意,理解内核镜像加载地址、内核启动地址、入口点地址之间的区别:
最好了解一下(有点多且绕):
1. 内核镜像加载地址
- 定义:这是 U-Boot 将内核镜像从存储介质(如 eMMC、SD 卡等)读取并加载到 DDR 中的地址。
- 作用:U-Boot