【精编推荐】bootloader代码分析报告
阐述对BootLoader的理解和分析

阐述对B o o t L o a d e r的理解和分析(总11页)-CAL-FENGHAI.-(YICAI)-Company One1-CAL-本页仅作为文档封面,使用请直接删除`物理与电子工程学院《嵌入式系统设计》设计性实验报告题目阐述对BootLoader的理解和分析系别年级专业班级学号学生姓名指导教师实验时间目录课题要求 ..................................................................... 错误!未定义书签。
1.本课题的目的................................................................... 错误!未定义书签。
2.运行环境 ........................................................................... 错误!未定义书签。
正文.............................................................................. 错误!未定义书签。
一.BootLoad简介 ............................................................. 错误!未定义书签。
二.系统设计 ...................................................................... 错误!未定义书签。
三.技术实现问题................................................................. 错误!未定义书签。
四.总结与体会 ..................................................................... 错误!未定义书签。
【精编推荐】bootloader代码分析报告

【精编推荐】bootloader代码分析报告【精编推荐】bootloader代码分析报告Bootloader代码分析报告徐凯2007-8-3Bootloader代码分析报告 (1)1.启动代码分析 (1)1.1.vector.s代码分析 (1)1.1.1.宏定义 (5)1.1.3.判断是否是thumb指令 (6)1.1.4.定义新程序、引⼊新符号 (6)1.1.5.定义新程序、引⼊新符号 (7)1.1.6.定义系统异常向量表 (7)1.1.7.程序跳转宏定义 (7)1.1.8.异常处理程序定义 (7)1.1.9.声明C主函数程序⼊⼝ (10)1.1.10.定义vector.s中需要⽤到的连接器变量 (10)1.1.11.定义从FLASH启动程序的函数 (11)1.2.sysinit.s代码分析 (11)1.2.1.引⼊S3C4510相关系统配置寄存器的地址 (18)1.2.2.定义⽤于配置ROM和RAM的宏 (18)1.2.3.定义⽤于配置SYSCFG的宏 (18)1.2.4.定义⽤于初始化内存的函数InitMemory (18)1.2.5.定义⽤于初始化内存的函数InitMemory (20)1.2.6.定义内存重设置函数ResetMemSet (21)1.2.7.初始化21种中断源响应函数InitInterrupt (21)1.2.8.初始化18个外部I/O端⼝函数InitPort (21)1.2.9.初始化2个计时器的函数InitTimer (22)1.2.10.初始化2个串⼝函数InitUart (22)1.2.11.初始化栈函数InitStack (23)1.2.12.系统初始化函数InitSystem (24)1.启动代码分析1.1.vector.s代码分析由于连接器参数中有-first vector.o,所以先从这个⽂件开始分析。
⾸先,列出源代码:1ModeMask EQU 0x1F2SVC32Mode EQU 0x133IRQ32Mode EQU 0x124FIQ32Mode EQU 0x115User32Mode EQU 0x106Abort32Mode EQU 0x177Undef32Mode EQU 0x1B8IRQ_BIT EQU 0x809FIQ_BIT EQU 0x4010;RomBaseAddr EQU 011RamBaseAddr EQU &10012;RamEndAddr EQU &20013GBLS MainEntry14MainEntry SETS "main"15IMPORT $MainEntry16;********************************************************** 17;??鯡tasm.exe???默?18GBLL THUMBCODE19[ {CONFIG} = 1620THUMBCODE SETL {TRUE}21CODE3222|23THUMBCODE SETL {FALSE}24]2526[ THUMBCODE27CODE32 ;for start-up code for Thumb mode 28]2930;****************************************************** 31AREA SelfBoot, CODE, READONL Y3233IMPORT UDF_INS_VECTOR34IMPORT SWI_SVC_VECTOR35IMPORT INS_ABT_VECTOR36IMPORT DAT_ABT_VECTOR37IMPORT IRQ_SVC_VECTOR38IMPORT FIQ_SVC_VECTOR3940ENTRY41IF :DEF: |ads$version|42ELSE43EXPORT __main44__main45ENDIF46ResetEntry47 b SYS_RST_HANDLER48 b UDF_INS_HANDLER49 b SWI_SVC_HANDLER50 b INS_ABT_HANDLER51 b DAT_ABT_HANDLER52 b .53 b IRQ_SVC_HANDLER54 b FIQ_SVC_HANDLER5556;****************************************************** 57MACRO 58$Label HANDLER $Vector59$Label60sub lr, lr, #461stmfd sp!, {r0-r3, lr}62ldr r0, =$Vector63ldr pc, [r0]64ldmfd sp!, {r0-r3, pc}^65MEND6667UDF_INS_HANDLER68stmfd sp!, {r0-r3, lr}69ldr r0, =UDF_INS_VECTOR70mov lr, pc71ldr pc, [r0]72ldmfd sp!, {r0-r3, pc}^73SWI_SVC_HANDLER74stmfd sp!, {r0-r3, lr}75ldr r0, =SWI_SVC_VECTOR 76mov lr, pc77ldr pc, [r0]78ldmfd sp!, {r0-r3, pc}^79INS_ABT_HANDLER80sub lr, lr, #481stmfd sp!, {r0-r3, lr}82ldr r0, =INS_ABT_VECTOR 83mov lr, pc84ldr pc, [r0]85ldmfd sp!, {r0-r3, pc}^86DA T_ABT_HANDLER87sub lr, lr, #488stmfd sp!, {r0-r3, lr}89ldr r0, =DAT_ABT_VECTOR 90mov lr, pc91ldr pc, [r0]92ldmfd sp!, {r0-r3, pc}^93IRQ_SVC_HANDLER94sub lr, lr, #495stmfd sp!, {r0-r12, lr}96mrs r0, spsr97stmfd sp!, {r0}98ldr r0, =IRQ_SVC_VECTOR 99ldr pc, [r0]100FIQ_SVC_HANDLER101sub lr, lr, #4102stmfd sp!, {r0-r12, lr}103mrs r0, spsr104stmfd sp!, {r0}105ldr r0, =IRQ_SVC_VECTOR 106ldr pc, [r0]107108;******************************************************* 109SYS_RST_HANDLER 110mrs r0, cpsr ;enter svc mode and disable irq,fiq 111bic r0, r0, #ModeMask 112orr r0, r0, #(SVC32Mode :OR: IRQ_BIT :OR: FIQ_BIT)113msr cpsr_c, r0114115IMPORT InitSystem116bl InitSystem117118adr r0, ResetEntry119mov r3, #(RamBaseAddr<<16)120ldr r1, BaseOfROM121ldr r2, TopOfROM122add r1, r1, r3123add r2, r2, r31240125ldmia r0!, {r4-r11}126stmia r1!, {r4-r11}127cmp r1, r2128bcc %B0129130sub r1, r1, r2131sub r0, r0, r1132ldr r1, BaseOfBSS133ldr r2, BaseOfZero134add r1, r1, r3135add r2, r2, r31361137cmp r1, r2138ldrccr4, [r0], #4139strcc r4, [r1], #4140bcc %B1141142mov r0, #0143ldr r2, EndOfBSS144add r2, r2, r31453146cmp r1, r2147strcc r0, [r1], #4148bcc %B3149150IMPORT RemapMemory151152adr r0, ResetEntry153ldr r1, =RemapMemory154ldr r2, BaseOfROM155sub r2, r1, r2156add r0, r0, r2157add r1, r2, r3158mov r2, #321590160ldr r3, [r0], #4161str r3, [r1], #4162subs r2, r2, #1163bne %B0164165ldr lr, GotoMain166b RemapMemory167168GotoMain DCD $MainEntry169170;***********************************************171IMPORT |Image$$RO$$Base| ; ROM code start172IMPORT |Image$$RO$$Limit| ; RAM data starts after ROM program 173IMPORT |Image$$RW$$Base| ; Pre-initialised variables174IMPORT |Image$$ZI$$Base| ; uninitialised variables175IMPORT |Image$$ZI$$Limit| ; End of variable RAM space176177BaseOfROM DCD |Image$$RO$$Base|178TopOfROM DCD |Image$$RO$$Limit|179BaseOfBSS DCD |Image$$RW$$Base|180BaseOfZero DCD |Image$$ZI$$Base|181EndOfBSS DCD |Image$$ZI$$Limit| 182183;*********************************************** 184TIP_SIZE EQU 256185186IMPORT ResetMemSet187EXPORT trans_to_boot188trans_to_boot189mov lr, r1 ; a2 = r1190ldr r1, =ResetMemSet191ldr r2, BaseOfROM192sub r2, r1, r2193add r0, r0, r2 ; a1 = r0194mov r2, #TIP_SIZE1950196ldr r3, [r1], #4197str r3, [r0], #4198subs r2, r2, #1199bne %B0200201sub r0, r0, #TIP_SIZE*4202mov pc, r0203204;*********************************************** 205206END1.1.1.宏定义1 ModeMask EQU 0x1F2 SVC32Mode EQU 0x133 IRQ32Mode EQU 0x124 FIQ32Mode EQU 0x115 User32Mode EQU 0x106 Abort32Mode EQU 0x177 Undef32Mode EQU 0x1B8 IRQ_BIT EQU 0x809 FIQ_BIT EQU 0x4010 ;RomBaseAddr EQU 011 RamBaseAddr EQU &10012 ;RamEndAddr EQU &200⾏1定义了CPSR中表⽰模式位的5位。
bootloader代码解析

GET ..\inc\option.s //相当于c语言中的#include "option.s"GET ..\inc\memcfg.s;Interrupt Control //中断控制器的特殊功能寄存器对应的地址INTPND EQU 0x01e00004INTMOD EQU 0x01e00008INTMSK EQU 0x01e0000cI_ISPR EQU 0x01e00020I_CMST EQU 0x01e0001c;Watchdog timer //看门狗定时器WTCON EQU 0x01d30000;Clock Controller //时钟控制器PLLCON EQU 0x01d80000CLKCON EQU 0x01d80004LOCKTIME EQU 0x01d8000c;Memory Controller //内存控制器REFRESH EQU 0x01c80024 ;Dram/sdram刷新控制寄存器;Pre-defined constants //预定义的常量;下面是对arm处理器模式寄存器对应值的常数定义,arm处理器中有一个CPSR程序状态寄存器它的后五位决定目前的处理器模式;0b10000用户模式;0b10001FIQ模式等USERMODE EQU 0x10FIQMODE EQU 0x11IRQMODE EQU 0x12SVCMODE EQU 0x13ABORTMODE EQU 0x17UNDEFMODE EQU 0x1bMODEMASK EQU 0x1fNOINT EQU 0xc0;arm处理器有两种工作状态 1.arm:32位这种工作状态下执行字对准的arm指令 2.Thumb:16位这种工作状态执行半字对准的Thumb指令;因为处理器分为16位 32位两种工作状态程序的编译器也是分16位和32两种编译方式所以下面的程序用于根据处理器工作状态确定编译器编译方式;code16伪指令指示汇编编译器后面的指令为16位的thumb指令;code32伪指令指示汇编编译器后面的指令为32位的arm指令;这段是为了统一目前的处理器工作状态和软件编译方式(16位编译环境使用tasm.exe编译);check if tasm.exe is used.GBLL THUMBCODE ;设置一个全局逻辑变量[ {CONFIG} = 16THUMBCODE SETL {TRUE}CODE32|THUMBCODE SETL {FALSE}];if config==16 这里表示你的目前处于领先地16位编译方式,设置THUMBCODE 为 true,否则就转入32位编译模式,设置THUMBCODE 为 false[ THUMBCODECODE32 ;for start-up code for Thumb mode]注意下面这段程序是个宏定义;这段程序用于把中断服务程序的首地址装载到pc中,有人称之为“加载程序”。
uboot代码剖析

Uboot 代码剖析黄雪莉代码重定位编译器在编译一段程序链接过程中,要对所有目标文件进行重定位,建立符号引用规则,同时为变量,函数等分配地址。
程序执行时,把代码加载到链接时指定的地址空间,以保证程序在执行过程中对变量,函数等符号的正确引用,是程序正常运行。
但是在操作系统中,一个进程通常从硬盘等二级存储设备拷贝到内存中去执行,这两者的地址是不同的,因此操作系统要对这个进程进行重定位,才能正确运行该进程。
位置不相关代码:在设计系统引导程序如bootloader时,一般为了提高速度,需要将bootloader 从ROM拷贝到RAM中去执行,这两者的地址也不同。
如果这些代码即使不在链接时指定的地址空间也能正确运行,这就是位置无关代码(position independent code)。
PIC的特点是,它被加载到任意地址空间都可以正确的执行。
其原理是PIC对常量和函数入口地址的操作都是基于PC+偏移量的寻址方式。
即使程序被移动,但是PC也变化了,而偏移量是不变的,所以程序仍然可以找到正确的入口地址或者常量。
位置代码无关在U-boot中的实现:U-Boot中用GOT表(Global Offset Table 全局偏移量表)实现PIC代码位置无关,总的来讲,U-Boot依靠维护GOT表来实现,在GOT表中存放一些全局label 的表项,这些表项记录重要的地址;运行在Flash时,GOT表中存放的是编译时全局label的值(地址);当U-Boot运行时检测RAM大小进行代码搬运之后,利用代码搬运前后产生的地址偏移对(相对偏移)GOT表中的各个表项值进行更新,使其记录RAM中的相应的地址。
这样代码运行时不会出现代码/变量地址出错的问题。
主要代码剖析1.关于GOT的主要宏定义(include/ppc_asm.tmpl)2. .got2段的声明3.上电复位,从flash的起始地址读取硬件复位配置字HRCW(Hard Reset Configuration Word),每次都8位,每四次组成一个32位配置字,分别组成低32位配置字和高32位配置字,分别存放在CFG_HRCW_LOW 和CFG_HRCW_HIGH寄存HRCW控制时钟及其他硬件的功能,如PCI host和Agent模式,启动位置和大小端。
BootLoader启动代码分析2

嵌入式linux启动信息完全注释(1)上面的这些输出信息,也可能包括你自己正在做的嵌入式linux开发板的输出信息,其中的每一行,每一个字的含义,你是否深究过,或者说大部分的含义你能确切地知道的?本人想在这里结合本人在实践中一些体会来和广大嵌入式linux的开发者一起读懂这些信息。
我们在这里将以一个真实的嵌入式linux系统的启动过程为例,来分析这些输出信息。
启动信息的原始内容将用标记标出,以区别与注释。
嵌入式linux的启动主要分为两个阶段:①第一部分bootloader启动阶段②第二部分linux内核初始化和启动阶段第一节:start_kernel第二节:用户模式(user_mode)开始,start_kernel结束第三节:加载linux内核完毕,转入cpu_idle进程place)XIP.写入和擦除速度很低。
NAND Flash,1989年,东芝公司发明.是以块和页为单位来读写的,不能随机访问某个指定的点.因而相对来说读取速度较慢,而擦除和写入的速度则比较快,每次可以传输16Bit,一般适用在大容量的多媒体应用中,容量大。
如:CF,SM.②串行Serial Flash是以字节进行传输的,每次可以传输1-2Bit.如:MMC,SD,MS卡.串行闪存器件体积小,引脚也少,成本相对也更低廉。
③不可擦除Mask Rom Flash的特点是一次性录入数据,具有不可更改性,经常运用于游戏和需版权保护文件等的录入。
其显著特点是成本低。
注意:任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。
NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。
从上面的信息,我们可以对flash类型特点有个比较明确的了解。
根据内存的工作原理可以划分出两种内存:DRAM和SRAM①DRAM表示动态随机存取存储器。
这是一种以电荷形式进行存储的半导体存储器。
bootloader启动代码分析

bootloader启动代码分析1,bootloader(第一部分)主要完成以下工作:1,设置CPU工作模式;2,关闭中断;3,关闭Cache和Write buffer;4,初始化SDRAM,配置存储设备;5,复制FLASH中的代码和数据到SDRAM中;6,内存重映射,配置存储设备;7,把RM和ZI从LOAD ADDR 复制到execute ADDR.8,设置栈空间指针,跳转到C语言函数入口(启动代码第二部分)。
2,具体代码分析1,设置CPU工作模式MRS r0, cpsr#读取CPSR状态寄存器的值CPSR状态寄存器结构:BIC r0, r0, #MASK_MODE&定义值为0x0000003F,把MODE清零;ORR r0, r0, #MODE_SVC32&宏定义值为0x00000013,把MODE设置为SVC模式;ORR r0, r0, #I_BIT&宏定义值为0x80,关IRQ;ORR r0, r0, #F_BIT&宏定义值为0x40,关FIQ;MSR cpsr_c, r0&回写cpsr状态寄存器设置完CPSR后,状态寄存器中的值:2,关闭中断LDR r2, =ARM7_INTMASK& ARM7_INTMASK宏定义值为ASIC_BASE+0x4008,读取interrupt controller寄存器MVN r1, #0&FFFFFFFFSTR r1, [r2]&回写interrupt controller寄存器,之后寄存器的值为全1,既关闭所有的中断源;LDR r2, =ARM7_INTPEND&ARM7_INTPEND宏定义值为ASIC_BASE+0x4004,取interrupt pend 寄存器.MVN r1, #0 &FFFFFFFFSTR r1, [r2]&回写ARM7_INTPEND寄存器,之后寄存器的值为全1,既关闭所有的中断标志位;3,关闭Cache和Write bufferASIC_BASE宏定义值为0x03ff0000LDR r0, =ARM7_SYSCFG &宏定义值为ASIC_BASE+0x0000LDR r1, =0x87ffffA00X87ffffA0的二进制为 1000 0111 1111 1111 1111 1111 1010 0000 SE Must be set to zero.CE When set to '1', cache operations are enabled. 设置为0,将CACHE禁用。
u-boot源码分析之start.s分析

一、bootloader启动过程1、Stage1start.S代码结构(1)定义入口。
(2)设置异常向量(Exception Vector)。
(3)设置CPU的速度、时钟频率及终端控制寄存器。
(4)初始化内存控制器。
(5)将ROM中的程序复制到RAM中。
(6)初始化堆栈。
(7)转到RAM中执行,该工作可使用指令ldr pc来完成。
2、Stage2C语言代码部分(1)调用一系列的初始化函数。
(2)初始化Flash设备。
(3)初始化系统内存分配函数。
(4)如果目标系统拥有NAND设备,则初始化NAND设备。
(5)如果目标系统有显示设备,则初始化该类设备。
(6)初始化相关网络设备,填写IP、MAC地址等。
(7)进去命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。
3、U-Boot的启动顺序二、具体代码分析1.Stage1start.S代码结构1.1定义入口(u-boot.lds)ENTRY(_start)1.2设置异常向量1.3设置全局向量表地址变量和字节对齐方式1.4定义重定位全局变量1.5设置全局搬移地址(falsh->dram)1.6设置中断向量地址1.7设置cpu模式设置cpu工作模式为SVC模式。
1.4中断向量表搬移,时钟设置1.5CPU设置(TBL,icache,MMU)1.6板级初始化1.7boot镜像搬移到SDRAM1.8清除bss段计算出偏移地址:__rel_dyn_start 、__rel_dyn_start 、__dynsym_start1.9跳转到Stage2C 语言部分1.10中断处理程序File :arch/arm/lib/Board.cvoid board_init_r (gd_t *id,ulong dest_addr)。
实验12 Bootloader分析

实验十二 Bootloader分析本次实验将介绍两种bootloader:u-boot和vivi的移植方法,并教大家如何编译vivi。
1. U-BOOT简介U-BOOT是由德国的工程师Wolfgang Denk从8XXROM代码发展而来的,它支持很多处理器,比如PowerPC、ARM、MIPS和x86。
目前,U-BOOT源代码在sourceforge网站的社区服务器中,Internet上有一群自由开发人员对其进行维护和开发,它的项目主页是/projects/U-BOOT。
1.1 U-BOOT源代码目录结构◆ board:和一些已有开发板有关的文件,比如Makefile和u-boot.lds等都和具体开发板的硬件和地址分配有关。
◆ common:与体系结构无关的文件,实现各种命令的C文件。
◆ cpu:CPU相关文件,其中的子目录都是以U-BOOT所支持的CPU为名,比如有子目录arm926ejs、mips、mpc8260和nios等,每个特定的子目录中都包括cpu.c和interrupt.c,start.S。
其中cpu.c初始化CPU、设置指令Cache和数据Cache等;interrupt.c设置系统的各种中断和异常,比如快速中断、开关中断、时钟中断、软件中断、预取中止和未定义指令等;start.S 是U-BOOT启动时执行的第一个文件,它主要是设置系统堆栈和工作方式,为进入C程序奠定基础。
◆ disk:disk驱动的分区处理代码。
◆:文档。
doc◆:通用设备驱动程序,比如各种网卡、支持CFI的Flash、串口和USB总线等。
drivers◆ fs:支持文件系统的文件,U-BOOT现在支持cramfs、fat、fdos、jffs2和registerfs。
◆:头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支 include持的文件。
◆:与网络有关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【精编推荐】bootloader代码分析报告Bootloader代码分析报告徐凯2007-8-3Bootloader代码分析报告 (1)1.启动代码分析 (1)1.1.vector.s代码分析 (1)1.1.1.宏定义 (5)1.1.3.判断是否是thumb指令 (6)1.1.4.定义新程序、引入新符号 (6)1.1.5.定义新程序、引入新符号 (7)1.1.6.定义系统异常向量表 (7)1.1.7.程序跳转宏定义 (7)1.1.8.异常处理程序定义 (7)1.1.9.声明C主函数程序入口 (10)1.1.10.定义vector.s中需要用到的连接器变量 (10)1.1.11.定义从FLASH启动程序的函数 (11)1.2.sysinit.s代码分析 (11)1.2.1.引入S3C4510相关系统配置寄存器的地址 (18)1.2.2.定义用于配置ROM和RAM的宏 (18)1.2.3.定义用于配置SYSCFG的宏 (18)1.2.4.定义用于初始化内存的函数InitMemory (18)1.2.5.定义用于初始化内存的函数InitMemory (20)1.2.6.定义内存重设置函数ResetMemSet (21)1.2.7.初始化21种中断源响应函数InitInterrupt (21)1.2.8.初始化18个外部I/O端口函数InitPort (21)1.2.9.初始化2个计时器的函数InitTimer (22)1.2.10.初始化2个串口函数InitUart (22)1.2.11.初始化栈函数InitStack (23)1.2.12.系统初始化函数InitSystem (24)1.启动代码分析1.1.vector.s代码分析由于连接器参数中有-first vector.o,所以先从这个文件开始分析。
首先,列出源代码:1ModeMask EQU 0x1F2SVC32Mode EQU 0x133IRQ32Mode EQU 0x124FIQ32Mode EQU 0x115User32Mode EQU 0x106Abort32Mode EQU 0x177Undef32Mode EQU 0x1B8IRQ_BIT EQU 0x809FIQ_BIT EQU 0x4010;RomBaseAddr EQU 011RamBaseAddr EQU &10012;RamEndAddr EQU &20013GBLS MainEntry14MainEntry SETS "main"15IMPORT $MainEntry16;**********************************************************17;シ・鯡ヌキケモテtasm.exeスミア默・18GBLL THUMBCODE19[ {CONFIG} = 1620THUMBCODE SETL {TRUE}21CODE3222|23THUMBCODE SETL {FALSE}24]2526[ THUMBCODE27CODE32 ;for start-up code for Thumb mode28]2930;******************************************************31AREA SelfBoot, CODE, READONL Y3233IMPORT UDF_INS_VECTOR34IMPORT SWI_SVC_VECTOR35IMPORT INS_ABT_VECTOR36IMPORT DAT_ABT_VECTOR37IMPORT IRQ_SVC_VECTOR38IMPORT FIQ_SVC_VECTOR3940ENTRY41IF :DEF: |ads$version|42ELSE43EXPORT __main44__main45ENDIF46ResetEntry47 b SYS_RST_HANDLER48 b UDF_INS_HANDLER49 b SWI_SVC_HANDLER50 b INS_ABT_HANDLER51 b DAT_ABT_HANDLER52 b .53 b IRQ_SVC_HANDLER54 b FIQ_SVC_HANDLER5556;****************************************************** 57MACRO58$Label HANDLER $Vector59$Label60sub lr, lr, #461stmfd sp!, {r0-r3, lr}62ldr r0, =$Vector63ldr pc, [r0]64ldmfd sp!, {r0-r3, pc}^65MEND6667UDF_INS_HANDLER68stmfd sp!, {r0-r3, lr}69ldr r0, =UDF_INS_VECTOR70mov lr, pc71ldr pc, [r0]72ldmfd sp!, {r0-r3, pc}^73SWI_SVC_HANDLER74stmfd sp!, {r0-r3, lr}75ldr r0, =SWI_SVC_VECTOR76mov lr, pc77ldr pc, [r0]78ldmfd sp!, {r0-r3, pc}^79INS_ABT_HANDLER80sub lr, lr, #481stmfd sp!, {r0-r3, lr}82ldr r0, =INS_ABT_VECTOR83mov lr, pc84ldr pc, [r0]85ldmfd sp!, {r0-r3, pc}^86DA T_ABT_HANDLER87sub lr, lr, #488stmfd sp!, {r0-r3, lr}89ldr r0, =DAT_ABT_VECTOR90mov lr, pc91ldr pc, [r0]92ldmfd sp!, {r0-r3, pc}^93IRQ_SVC_HANDLER94sub lr, lr, #495stmfd sp!, {r0-r12, lr}96mrs r0, spsr97stmfd sp!, {r0}98ldr r0, =IRQ_SVC_VECTOR99ldr pc, [r0]100FIQ_SVC_HANDLER101sub lr, lr, #4102stmfd sp!, {r0-r12, lr}103mrs r0, spsr104stmfd sp!, {r0}105ldr r0, =IRQ_SVC_VECTOR106ldr pc, [r0]107108;******************************************************* 109SYS_RST_HANDLER110mrs r0, cpsr ;enter svc mode and disable irq,fiq 111bic r0, r0, #ModeMask112orr r0, r0, #(SVC32Mode :OR: IRQ_BIT :OR: FIQ_BIT)113msr cpsr_c, r0114115IMPORT InitSystem116bl InitSystem117118adr r0, ResetEntry119mov r3, #(RamBaseAddr<<16)120ldr r1, BaseOfROM121ldr r2, TopOfROM122add r1, r1, r3123add r2, r2, r31240125ldmia r0!, {r4-r11}126stmia r1!, {r4-r11}127cmp r1, r2128bcc %B0129130sub r1, r1, r2131sub r0, r0, r1132ldr r1, BaseOfBSS133ldr r2, BaseOfZero134add r1, r1, r3135add r2, r2, r31361137cmp r1, r2138ldrccr4, [r0], #4139strcc r4, [r1], #4140bcc %B1141142mov r0, #0143ldr r2, EndOfBSS144add r2, r2, r31453146cmp r1, r2147strcc r0, [r1], #4148bcc %B3149150IMPORT RemapMemory151152adr r0, ResetEntry153ldr r1, =RemapMemory154ldr r2, BaseOfROM155sub r2, r1, r2156add r0, r0, r2157add r1, r2, r3158mov r2, #321590160ldr r3, [r0], #4161str r3, [r1], #4162subs r2, r2, #1163bne %B0164165ldr lr, GotoMain166b RemapMemory167168GotoMain DCD $MainEntry169170;***********************************************171IMPORT |Image$$RO$$Base| ; ROM code start172IMPORT |Image$$RO$$Limit| ; RAM data starts after ROM program 173IMPORT |Image$$RW$$Base| ; Pre-initialised variables174IMPORT |Image$$ZI$$Base| ; uninitialised variables175IMPORT |Image$$ZI$$Limit| ; End of variable RAM space176177BaseOfROM DCD |Image$$RO$$Base|178TopOfROM DCD |Image$$RO$$Limit|179BaseOfBSS DCD |Image$$RW$$Base|180BaseOfZero DCD |Image$$ZI$$Base|181EndOfBSS DCD |Image$$ZI$$Limit|182183;***********************************************184TIP_SIZE EQU 256185186IMPORT ResetMemSet187EXPORT trans_to_boot188trans_to_boot189mov lr, r1 ; a2 = r1190ldr r1, =ResetMemSet191ldr r2, BaseOfROM192sub r2, r1, r2193add r0, r0, r2 ; a1 = r0194mov r2, #TIP_SIZE1950196ldr r3, [r1], #4197str r3, [r0], #4198subs r2, r2, #1199bne %B0200201sub r0, r0, #TIP_SIZE*4202mov pc, r0203204;***********************************************205206END1.1.1.宏定义1 ModeMask EQU 0x1F2 SVC32Mode EQU 0x133 IRQ32Mode EQU 0x124 FIQ32Mode EQU 0x115 User32Mode EQU 0x106 Abort32Mode EQU 0x177 Undef32Mode EQU 0x1B8 IRQ_BIT EQU 0x809 FIQ_BIT EQU 0x4010 ;RomBaseAddr EQU 011 RamBaseAddr EQU &10012 ;RamEndAddr EQU &200行1定义了CPSR中表示模式位的5位。