uboot_freescale_imx51_start.s_详解

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*

*

*Purpose: the document is used to learn detailed information aboutimx51 cpu start.S, *referring to some documents on websites.

*file address: U-boot-2009.08/Cpu/Arm_cortexa8/start.S

*

* writer: xfhai 2011.7.22

*

*Instruction:

*1.@xxxx : indicates annotation

*2./*****

***

*****/ : stand for code in my files

*3.instructions refers to code not included in my file

*

*/

Section 1: uboot overview

大多数bootloader都分为stage1和stage2两部分,u-boot也不例外。依赖于CPU体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。

1、Stage1 start.S代码结构

u-boot的stage1代码通常放在start.S文件中,他用汇编语言写成,其主要代码部分如下:==> (1)定义入口。由于一个可执行的Image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。

==>(2)设置异常向量(Exception Vector)。

==>(3)设置CPU的速度、时钟频率及终端控制寄存器。

==>(4)初始化内存控制器。

==>(5)将ROM中的程序复制到RAM中。

==>(6)初始化堆栈。

==>(7)转到RAM中执行,该工作可使用指令ldr pc来完成。

2、Stage2 C语言代码部分

lib_arm/board.c中的start arm boot是C语言开始的函数也是整个启动代码中C语言的主函数,同时还是整个u-boot(armboot)的主函数,该函数只要完成如下操作:

==>(1)调用一系列的初始化函数。

==>(2)初始化Flash设备。

==>(3)初始化系统内存分配函数。

==>(4)如果目标系统拥有NAND设备,则初始化NAND设备。

==>(5)如果目标系统有显示设备,则初始化该类设备。

==>(6)初始化相关网络设备,填写IP、MAC地址等。

==>(7)进去命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。

Section 2: demos

3、U-Boot的启动顺序(示例,其他u-boot版本类似)

cpu/arm920t/start.S

(my file is U-boot-2009.08/Cpu/Arm_cortexa8/start.S )

@文件包含处理

#include

@由顶层的mkconfig生成,其中只包含了一个文件:configs/<顶层makefile中6个参数的第1个参数>.h

#include

#include

/*

*************************************************************************

*

* Jump vector table as in table 3.1 in [1]

*

*************************************************************************

*/

注:ARM微处理器支持字节(8位)、半字(16位)、字(32位)3种数据类型向量跳转表,每条占四个字节(一个字),地址范围为0x0000 0000~@0x0000 0020,ARM体系结构规定在上电复位后的起始位置,必须有8条连续的跳转指令,通过硬件实现。他们就是异常向量表。ARM在上电复位后,是从0x00000000开始启动的,其实如果bootloader存在,在执行下面第一条指令后,就无条件跳转到start_code,下面一部分并没执行。设置异常向量表的作用是识别bootloader。以后系统每当有异常出现,则CPU会根据异常号,从内存的0x00000000处开始查表做相应的处理

/******************************************************

;当一个异常出现以后,ARM会自动执行以下几个步骤:

;1.把下一条指令的地址放到连接寄存器LR(通常是R14).---保存位置

;2.将相应的CPSR(当前程序状态寄存器)复制到SPSR(备份的程序状态寄存器)中---保存CPSR

;3.根据异常类型,强制设置CPSR的运行模式位

;4.强制PC(程序计数器)从相关异常向量地址取出下一条指令执行,从而跳转到相应的异常处理程序中

*********************************************************/

.globl _start /*系统复位位置,整个程序入口*/

@_start是GNU汇编器的默认入口标签,.globl将_start声明为外部程序可访问的标签,.globl是GNU汇编的保留关键字,前面加点是GNU汇编的语法

_start: b start_code @0x00

//diff here: _start: b reset

@ARM上电后执行的第一条指令,也即复位向量,跳转到start_code

@reset用b,就是因为reset在MMU建立前后都有可能发生

@其他的异常只有在MMU建立之后才会发生

相关文档
最新文档