首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

U-Boot启动过程完全分析

U-Boot启动过程完全分析

1.1
U-Boot工作过程



U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下:


1)第一阶段的功能

Ø
硬件设备初始化

Ø
加载U-Boot第二阶段代码到RAM空间

Ø
设置好栈

Ø
跳转到第二阶段代码入口


2)第二阶段的功能

Ø
初始化本阶段使用的硬件设备

Ø
检测系统内存映射

Ø
将内核从Flash读取到RAM

Ø
为内核设置启动参数

Ø
调用内核

1.1.1
U-Boot启动第一阶段代码分析

第一阶段对应的文件是cpu/arm920t/start.Sboard/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”处执行。
继承事业,薪火相传
返回列表