-Boot工作过程
U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下:
(1)第一阶段的功能
Ø硬件设备初始化
Ø加载U-Boot第二阶段代码到RAM空间
Ø设置好栈
Ø跳转到第二阶段代码入口
(2)第二阶段的功能
Ø初始化本阶段使用的硬件设备
Ø检测系统内存映射
Ø将内核从Flash读取到RAM中
Ø为内核设置启动参数
Ø调用内核
-Boot启动第一阶段代码分析
第一阶段对应的文件是cpu/arm920t/。
U-Boot启动第一阶段流程如下:
-Boot启动第一阶段流程
根据cpu/arm920t/u-:
ENTRY(_start)
SECTIONS
{
.=0x00000000;
.=ALIGN(4);
.text:
{
cpu/arm920t/ (.text)
board/samsung/mini2440/(.text)
board/samsung/mini2440/(.text)
*(.text)
}
……
}
第一个链接的是cpu/arm920t/,因此u-,其源代码在cpu/arm920t/。下面我们来分析cpu/arm920t/。
(1)设置异常向量
cpu/arm920t/:
.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: .wordundefined_instruction
_software_interrupt: .wordsoftware_interrupt
_prefetch_abort: .wordprefetch_abort
_data_abort: .worddata_abort
_not_used: .wordnot_used
_irq: .wordirq
_fiq: .wordfiq
.balignl16,0xdeadbeef
以上代码设置了ARM异常向量表,各个异常向量介绍如下:
地址
异常
进入模式
描述
0x00000000
复位
管理模式
复位电平有效时,产生复位异常,程序跳转到复位处理程序处执行
0x00000004
未定义指令
未定义模式
遇到不能处理的指令时,产生未定义指令异常
0x00000008
软件中断
管理模式
执行SWI指令产生,用于用户模式下的程序调用特权操作指令
0x0000000c
预存指令
中止模式
处理器预取指令的地址不存在,或该地址不允许当前指令访问,产生指令预取中止异常
0x00000010
数据操作
中止模式
处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常
0x00000014
未使用
未使用
未使用
0x00000018
IRQ
IRQ
外部中断请求有效,且CPSR中的I位为0时,产生IRQ异常
0x0000001c
FIQ
FIQ
快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常
在cpu/arm920t/。当一个异常产生时,CPU根据异常号在异常向量表中找到对应的异常向量,然后执行异常向量处的跳转指令,CPU就跳转到对应的异常处理程序执行。
其中复位异常向量的指令“b start_code”决定了U-Boot启动后将自动跳转到标号“start_code”处执行。
(2)CP
U-boot启动流程 来自淘豆网m.daumloan.com转载请标明出处.