u-boot 启动过程

时间:2022-10-17 16:35:50

u-boot 代码分为两个阶段第一阶段是汇编,入口是 arch/arm/cpu/armv7/start.S,第二阶段是 C 语言, 入
口是 board.c

第一阶段代码
1. 异常向量表定义
2. 设置 SVC32 模式(ARM 七种工作模式)
3. 调用 cpu_init_crit 进行 cpu 相关初始化
1) TLB(页面缓存)、关 MMU Cache
2) 转入低级初始化 lowlevel_init 函数
主要是对系统时钟、片外内存(DDR3)、串口、 nand(这里初始化 nand 主要是为第二阶段搬 uboot 到内存而准备的)等进行初始化。
4. 判断启动开关进行自搬移
5. 跳转到 C 入口 board_init_f( )

第二阶段代码
本 阶 段 主 要 有 两 个 核 心 函 数 , 分 别 是 board_init_f( ) board_init_r() , 这 两 个 函 数 都 是 在
arch\arm\Lib\Board.c 

  1. board_init_f( )
1) gd_t 数据结构空间分配
2) 回调一组初始化函数
3) gd_t 数据结构进行初始化

4) relocate_code(U-boot 重定义代码,即自搬移)relocate_code 是一个汇编函数,在 arch\arm\cpu\armv7\start.S 文件中实现。 具体工作是先把代码搬
运到 DDR 高端位置, 搬运 data 段, 清 0 BSS 段, 最后跳转重新定位后 u-boot 代码中的 board_init_r 函数
运行,到些完成整个 u-boot 的启动过程。

 

  2. board_init_r( )
这个函数是由上一步的 relocate_code 后,直接调用,这个函数也是重新定位代码后执行的第一个
C 语言函数。
1) 使能 Cache
2) 板子初始化
3) 串口初始化
4) 外存初始化
5) 环境变量初始化
6) 控制台初始哗
7) 中断使能
8) 以太网初始化
9) 进入 main_loop(),等待命令或自动加载内核或自动加载内核。