U-Boot启动流程

下图为U-Boot启动流程框图。
1. U-Boot启动流程1

以下为上图中每个过程的描述。

  • _start:每个相同架构的开发板都有相同的start.s文件,文件位于arch目录下。_start是系统在核心通电时将使用的第一个指令。
  • CPU init:CPU初始化步骤,可设置所有CPU相关和指定的寄存器。如上图所示,该步骤还可设置RISC-V核心指定的寄存器。
注: U-Boot的启动仅占用一个核心,其他核心均被设置为空闲模式。多数情况下,U-boot在Linux启动之前不会使用辅助核心。
  • board_init_f_alloc_reserve:保留早期的malloc arena和全球数据struct arena.
  • harts_early_init: 配置harts的专有设置和自定义CSR。
  • board_init_f_init_reserve: 初始化保留空间。
  • board_init_f:在重新定位符号之前,先初始化基本的硬件和运行环境,如CPU、计时器、控制台和设备树等。
  • jump_to_copy:将全局数据struct复制到高地址空间,并重新定位监视器代码。
重新定位符号和监视器代码之后,系统将开始以下启动过程。
2. U-Boot启动流程2

以下为上图中每个过程的描述。

  • board_init_r:开发板初始化文件。上图所示的所有与开发板相关的初始化过程都将逐一执行。
  • init_dm:扫描设备节点,并与正确的驱动程序保持关联。
  • initr_net:以太网初始化文件。该文件将初始化您希望包含在开发板上的所有以太网接口。
  • main_loop:屏幕上弹出U-Boot之前的最后一个初始化步骤。

结果:所有过程完成后,U-boot完成启动并准备使用。

initr_net进程中,位于drivers/net/phy/phy.c文件夹下的phy_init函数将用于初始化以太网PHY。参见PHY设备初始化获取更多信息。