1.1
U-Boot工作过程
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启动第一阶段流程如下:
图 2.1 U-Boot启动第一阶段流程
根据cpu/arm920t/u-boot.lds中指定的连接方式:
ENTRY(_start)
SECTIONS
{
.= 0x00000000;
.= ALIGN(4);
.text:
{
cpu/arm920t/start.o
(.text)
board/samsung/mini2440/lowlevel_init.o(.text)
board/samsung/mini2440/nand_read.o(.text)
*(.text)
}
……
}
第一个链接的是cpu/arm920t/start.o,因此u-boot.bin的入口代码在cpu/arm920t/start.o中,其源代码在cpu/arm920t/start.S中。下面我们来分析cpu/arm920t/start.S的执行。
1.
硬件设备初始化
(1)设置异常向量
cpu/arm920t/start.S开头有如下的代码:
.globl _start
_start:
b
start_code
/*复位
*/
ldr
pc, _undefined_instruction
/* 未定义指令向量 */
ldr
pc, _software_interrupt
/* 软件中断向量 */
ldr
pc, _prefetch_abort
/*
预取指令异常向量 */
ldr
pc, _data_abort
/* 数据操作异常向量 */
ldr
pc, _not_used
/*
未使用
*/
ldr
pc, _irq
/*
irq中断向量
*/
ldr
pc, _fiq
/*
fiq中断向量
*/
/*
中断向量表入口地址 */
_undefined_instruction:
.word undefined_instruction
_software_interrupt:
.word software_interrupt
_prefetch_abort:
.word prefetch_abort
_data_abort:
.word data_abort
_not_used:
.wordnot_used
_irq:
.wordirq
_fiq:
.wordfiq
.balignl16,0xdeadbeef
以上代码设置了ARM异常向量表,各个异常向量介绍如下:
表 2.1 ARM异常向量表
地址
| 异常
| 进入模式
| 描述
| 0x00000000
| 复位
| 管理模式
| 复位电平有效时,产生复位异常,程序跳转到复位处理程序处执行
| 0x00000004
| 未定义指令
| 未定义模式
| 遇到不能处理的指令时,产生未定义指令异常
| 0x00000008
| 软件中断
| 管理模式
| 执行SWI指令产生,用于用户模式下的程序调用特权操作指令
| 0x0000000c
| 预存指令
| 中止模式
| 处理器预取指令的地址不存在,或该地址不允许当前指令访问,产生指令预取中止异常
| 0x00000010
| 数据操作
| 中止模式
| 处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常
| 0x00000014
| 未使用
| 未使用
| 未使用
| 0x00000018
| IRQ
| IRQ
| 外部中断请求有效,且CPSR中的I位为0时,产生IRQ异常
| 0x0000001c
| FIQ
| FIQ
| 快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常
|
在cpu/arm920t/start.S中还有这些异常对应的异常处理程序。当一个异常产生时,CPU根据异常号在异常向量表中找到对应的异常向量,然后执行异常向量处的跳转指令,CPU就跳转到对应的异常处理程序执行。
其中复位异常向量的指令“b
start_code”决定了U-Boot启动后将自动跳转到标号“start_code”处执行。 |