在文件的开始先是定义了一个函数指针数组,通过这个数组,程序通过一个循环来按
顺序进行常规的初始化,并在其后通过一些宏定义来初始化一些特定的设备。
在最后程序进入一个循环,main_loop。这个循环接收用户输入的命令,以设
置参数或者进行启动引导。
本篇文章将分析重点放在了前面的 start.s 上,是因为这部分无论在移植还是在调试过程中
都是最容易出问题的地方,要解决问题就需要程序员对代码进行修改,所以在这里简单介
绍了一下 start.s 的基本流程,希望能对大家有所帮助
第二、代码分析
2.2 阶段 1 介绍
uboot 的 stage1 代码通常放在 start.s 文件中,它用汇编语言写成,其主要代码部分如下:
2.2.1 定义入口
由于一个可执行的 Image 必须有一个入口点,并且只能有一个全局入口,通常这个入口放在
ROM(Flash)的 0x0
地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。
1. board/crane2410/uboot.lds: ENTRY(_start) ==> cpu/arm920t/start.S: .globl _start
2. uboot 代码区(TEXT_BASE = 0x33F80000)定义在 board/crane2410/config.mk
U-Boot 启动内核的过程可以分为两个阶段,两个阶段的功能如下:
(1)第一阶段的功能
Ø 硬件设备初始化
Ø 加载 U-Boot 第二阶段代码到 RAM 空间
Ø 设置好栈
Ø 跳转到第二阶段代码入口
(2)第二阶段的功能
Ø 初始化本阶段使用的硬件设备
Ø 检测系统内存映射
Ø 将内核从 Flash 读取到 RAM 中
Ø 为内核设置启动参数
Ø 调用内核
1.1.1 U-Boot 启动第一阶段代码分析
第一阶段对应的文件是 cpu/arm920t/start.S
和 board/samsung/mini2440/lowlevel_init.S。
U-Boot 启动第一阶段流程如下: