【精编推荐】bootloader代码分析报告

合集下载

阐述对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代码分析报告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代码解析

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代码剖析

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

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启动代码分析

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分析

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分析

实验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文件系统的实现。

U-boot引导加载程序(Bootloader)源代码分析与移植

U-boot引导加载程序(Bootloader)源代码分析与移植

U-boot引导加载程序(Bootloader)源代码分析与移植目录第一章绪论 (3)1.1 U-boot 简介 (3)1.2 U-boot 源码树 (4)1.3 U-boot 支持的主要功能 (5)第二章U-boot源代码详细分析 (6)2.1 U-boot的启动流程 (6)2.1.1 第一阶段(Stage 1) (6)2.1.2 第二阶段(Stage 2) (9)2.2 U-boot 的初始化 (13)2.2.1 私有数据global_data (13)2.2.2 初始化序列init_sequence (14)2.2.3 NAND Flash 初始化 (20)2.2.4 DataFlash 初始化 (21)2.2.5 环境变量重定位 (23)2.2.6 初始化设备 (25)2.2.7 控制台初始化 (27)2.2.8 单板后期初始化 (30)2.3命令处理 (33)2.3.1 命令数据结构 (33)2.3.2 命令查找 (34)2.3.3 主循环 (35)2.4 Linux 的引导 (42)2.4.1 映象格式 (42)2.4.2 linux 引导 (42)2.4.3 linux 的内核参数传递 (52)第三章U-boot 在S3C2410 上的移植分析 (58)3. 1 对ARM-920T内核的支持 (58)3. 2 配置自己的开发板 (58)3. 3 实现网卡的驱动程序 (60)3.4 从NAND Flash启动 (61)3.4.1 修改cpu/arm920t/start.s 添加NAND Flash启动跳转代码 (61)3.4.2 添加从NAND Flash启动代码 (63)3.4.3 添加上述代码中引用的宏定义 (65)3. 5 修改Makefile 文件 (65)3.6 搭建编译环境 (66)3. 7 生成目标文件并进行测试 (67)3. 8 测试 (69)第一章绪论1.1 U-boot 简介U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。

第三讲 S3C2440上Bootloader代码分析

第三讲 S3C2440上Bootloader代码分析

Stage1
通常包括以下步骤(以执行的先后顺序):
硬件设备初始化。 为加载Boot Loader 的stage2 准备RAM 空间。 拷贝Boot Loader 的stage2 到RAM 空间中。 设置好堆栈。 跳转到stage2 的C 入口点。
硬件设备初始化
屏蔽所有的中断
为中断提供服务通常是 OS 设备驱动程序的责任,因此在 Boot Loader 的执行全过程中可以不必响应任何中断。中断屏蔽可以通 过写 CPU 的中断屏蔽寄存器或状态寄存器(比如 ARM 的 CPSR 寄存器)来完成。
无法通过main() 函数传递函数参数; 无法处理 main() 函数返回的情况
解决- Main()的入口
trampoline(弹簧床) : trampoline小程序 来作为 main() 函数的外部包裹(external wrapper) 用汇编语言写一段trampoline 小程序,并 将这段 trampoline 小程序来作为 stage2 可执行映象的执行入口点。 在 trampoline 汇编小程序中用 CPU 跳转 指令跳入 main() 函数中去执行; 当 main() 函数返回时,CPU 执行路径显 然再次回到我们的 trampoline 程序。
大多数Boot Loader 都分为stage1 和 stage2 两大部分。依赖于CPU 体系结构的 代码,比如设备初始化代码等,通常都放 在stage1 中,而且通常都用汇编语言来实 现,以达到短小精悍的目的。而stage2 则 通常用C语言来实现,这样可以实现给复杂 的功能,而且代码会具有更好的可读性和 可移植性。
拷贝 stage2 到 RAM 中
需要考虑:
stage2 的可执行映象在固态存储设备的存放起 始地址和终止地址; RAM 空间的起始地址。

ARM11第9课bootloader代码分析

ARM11第9课bootloader代码分析

ARM裸板编程——bootloader代码分析简介bootloader从字面上理解就是“引导装载”的含义,它是在系统通电后就开始运行,它的任务主要是对硬件进行初始化,并以启动操作系统内核为终极目标的一段程序。

将操作系统内核启动完后,系统控制权就交予内核,bootloader的工作就结束了。

bootloader种类很多,我们之后学的u-boot,全称universal bootloader,即通用的bootloader,它遵循GPL条款的开放源代码项目。

这里的“通用”表示一、可以引导多种操作系统二、支持多种架构的CPU通用概念bootloader的实现是非常依赖于硬件的,如果硬件不同,bootloader的设置就不同。

有些CPU在运行bootloader前需要运行一段固化的程序(也称为固件)它的作用基本上是用来引导bootloader的,例如x86结构的CPU,就是先运行BIOS中的固件,然后才运行硬盘第一个分区中的bootloader。

在大多数嵌入式系统中并没有这些固件,bootloader是通电后执行的第一个程序。

bootloader的终极目标是启动操作系统内核的,bootloader将需要传给内核的参数固定放在一个地方,在内核启动之后由内核从那里取出这些参数进行使用。

LCD,基本上开发板相关的函数再次之前我们可以把源码包中和mini6410无关的文件删除以减少我们的阅读量,一般删除无关u-boot启动内核的过程因为u-boot的终极目标是启动内核,在启动内核之前u-boot会去对需要使用到的①硬件进行初始化,比如:时钟、串口、DDR、Flash等等。

内核一般我们都是通过USB线烧写到Nand Flash 中,u-boot还需要将内核②从Flash中复制③到DDR中,然后④传递参数并⑤启动内核。

为了方便使用还可以在u-boot中加入用户想要的功能,比如说:写Flash(u-boot、内核等)、USB相关功能、u-boot命令行等就将u-boot当做是一个比较复杂的裸板程序。

Bootloader代码分析

Bootloader代码分析

Bootloader代码分析代码分析报告(一)Bootloader代码分析1.第一部分功能:关闭中断,进入ARM状态,切换到SVC模式(复位异常进入SVC 模式)。

MRS r0, cpsr把状态寄存器CPSR中数据读入r0 寄存器。

BIC r0, r0, #MASK_MODE(MASK_MODE = 0x0000003F)把 r0 寄存器的低6位清零。

(把Thumb状态为清零,回到ARM状态)ORR r0, r0, #MODE_SVC32(MODE_SVC32 = 0x00000013)把r0 寄存器的低5置为 10011(SVC模式)。

ORR r0, r0, #I_BIT(I_BIT = 0x80)把r0 寄存器的第8位置1(关闭中断状态位)。

ORR r0, r0, F_BIT(F_BIT = 0x40 )把r0 寄存器的第7位置1(关闭快速中断状态位)。

MSR cpsr_c, r0把r0 寄存器的低8位存储进CPSR寄存器的低8位。

自此进入ARM状态,切换到SVC模式,关闭中断和快速中断。

LDR r2, = ARM7_INTMASKASIC_BASE EQU 0x03ff0000ARM7_INTMASK EQU (ASIC_BASE+0x4008)ARM7_INTMASK = 0x03ff4008把0x03ff4008存入r2 寄存器。

ASIC_BASE 是SYSCFG寄存器的第16位到第25位,是指S3C4510b中特殊寄存器的启始地址。

SYSCFG寄存器复位时缺省值是0x37ff ff91。

SYSCFG寄存器的第16位到第25位的值是0x 3ff。

ARM7_INTMASK EQU (ASIC_BASE+0x4008)中断模式寄存器:控制中断源的掩码。

偏移地址0x4008。

ARM7_INTMASK 就是中断模式寄存器的寻址地址。

ARM7_INTMASK = 0x03ff4008第21位是全局模式位:置1时断开所有中断源。

uboot分析

uboot分析

uboot分析BootLoader指系统启动后,在操作系统内核运行之前运行的一段小程序。

通过BootLoader,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。

通常,BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式世界。

因此,在嵌入式世界里建立一个通用的BootLoader 几乎是不可能的。

尽管如此,我们仍然可以对BootLoader归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现。

BootLoader的操作模式一般分为自启动模式和交互模式。

自启动模式:BootLoaderd从目标机上的某个固态设备上将操作系统加载到RAM中运行,整个过程没有用户的介入;交互模式:目标机上的BootLoader将通过串口或网络等通信手段从开发板上下载内核映像和根文件系统映像等到RAM中,可以写到目标机上的固态存储介质中,或者直接进行系统的引导。

也可以通过串口接收用户的命令。

BootLoader基本功能:初始化相关硬件;把BootLoader自搬移到内存中;执行用户的命令(访问环境变量;通过网络/串口通信;读写RAM/Flash);加载并执行内核。

一个嵌入式Linux系统从软件的角度看通常可以分为四个部分:BootLoader、Linux内核、跟文件系统及用户的应用程序。

BootLoader处于系统的最底层,运行于系统启动的最初阶段。

系统加电或复位后,所有CPU都会从某个地址开始执行,这是由处理器设计决定的。

比如,X86的复位向量在高地址端,ARM处理器在复位时从地址0x00000000取第一条指令。

嵌入式系统的开发板都要把板上ROM或Flash映射到这个地址。

因此,必须把Bootloader程序存储在相应的Flash位置。

系统加电后,CPU将首先执行它。

BootLoader的启动过程可以是单阶段的,也可以是多阶段的。

Bootloader(Vivi)源代码分析

Bootloader(Vivi)源代码分析
pathmunge/usr/local/arm/2.95.3/bin
fi
pathmunge /usr/X11R6/bin after
设置环境变量后,最好是重启或注销一下,这样设置的环境变量才能生效。
1.2.2
如果vivi的源代码已根据开发板作了相应改动,则需要对源代码进行配置和编译,以生成烧入flash的vivi二进制映象文件。
0x53000000,清0
movr2, #0x0
strr2, [r1]
#ifdef CONFIG_S3C2410_MPORT3;不符合条件,跳到下面的关中断
/****在/vivi/include/autoconf.h中#undefCONFIG_S3C2410_MPORT3******/
movr1, #0x56000000;GPACON寄存器地址是
@ now, CPU clock is 200 Mhz;CPU的频率是200MHz
movr1, #CLK_CTL_BASE
ldrr2, mpll_200mhz
strr2, [r1, #oMPLLCON]
#else
@ 1:2:2
mov r1, #CLK_CTL_BASE
ldr r2, clock_clkdivn
CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-
(CROSS_COMPILE为arm-linux安装的相应目录,我的是/usr/local/arm/2.95.3/bin/arm-linux-)
因此修改为:
CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-
2、宿主机上安装交叉编译器。

4.3.1U-Boot代码结构分析

4.3.1U-Boot代码结构分析

4.3.1U-Boot代码结构分析4.3 Bootloader之U-BootU-Boot是在PPC-Boot的基础上进化⽽来的⼀个开放源码的嵌⼊式BootROM程序,本⼩节将使⽤1.1.4版本的代码来分析U-Boot的代码结构,以及如何将它移植到基于S3C2410X的开发板上来。

4.3.1 U-Boot代码结构分析U-Boot4-9所⽰。

board:这个⽬录存放了所有U-Boot⽀持的⽬标板的⼦⽬录,如board/smdk2410/*就和我们的开发平台fs2410相类似。

要将U-Boot移植到⾃⼰的S3C2410X⽬标板上,必须参考这个⽬录下的内容,⽐如对Flash 以及Flash宽度和⼤⼩的定制等就要修改其中的flash.c。

cpu:这个⽬录存放了U-Boot⽀持的CPU类型,因为我们的开发平台是S3C2410X,所以只关⼼cpu/arm920t,CPU相关的⽂件主要是初始化⼀个执⾏环境,包括中断的初始化;start.S是整个u-boot.bin ⽬标可执⾏代码的第⼀段代码,它们是从Flash开始运⾏的,其主要⼯作就是对整个U-Boot⽬标代码的重定位,即将U-Boot转移到内存中去运⾏。

common:这个⽬录存放了U-Boot的⼀些公共命令的实现,像那些以cmd_*.c为名字的⽂件就是对应U-Boot的每个命令的实现代码,我们通常关⼼cmd_boot.c和cmd_bootm.c(它们和内核的引导相关)。

drivers:这个⽬录中存放了各种外设接⼝的驱动程序。

fs:这个⽬录中存放了U-Boot⽀持的⽂件系统。

lib_arm:这个⽬录存放了ARM平台公共的接⼝代码。

include:这个⽬录存放头⽂件的公共⽬录,其中的include/configs/smdk2410.h定义了所有和S3C2410X 相关的资源的配置参数,我们往往只需修改这个⽂件就可以配置⽬标板的参数,如波特率、引导参数、物理内存映射等。

【Bootloader】探究bootloader,分析u-boot源码

【Bootloader】探究bootloader,分析u-boot源码

【Bootloader】探究bootloader,分析u-boot源码Preface之前也发表过关于的⽂章,但是内容表达得⽐较抽象,⼤多是⽂字叙述,所以这⾥从系统和代码的⾓度来深⼊分析bootloader的启动过程。

⼯具:Source Insight⽬标:U-Boot-1.1.6仅留此分析过程,⽇后再作补充(纯⼿打也不容易啊,嘿嘿)。

U-Boot⼯程结构学习⼀个软件,尤其是开源软件,⾸先应该从分析软件的⼯程结构开始。

⼀个好的软件有良好的⼯程结构,对于读者学习和理解软件的架构以及⼯作流程都有很好的帮助。

U-Boot的源代码布局和Linux类似,使⽤了按照模块划分的结构,并且充分考虑了体系结构和跨平台问题。

U-Boot源代码⽬录结构⼦⽬录名作⽤board开发板相关的定义和结构common包含U-Boot⽤到的各种处理函数cpu各种不同类型的处理器相关代码doc U-Boot⽂档drivers常⽤外部设备驱动程序examples存放U-Boot开发代码样例fs⽂件系统有关的代码,包括cramfs、ext2、fat等常见⽂件系统include U-Boot⽤到的头⽂件lib_arm ARM体系结构有关的数据定义和操作lib_generic U-Boot通⽤的操作函数net常⽤的⽹络协议,包括bootp、rarp、arp、tftp等post上电⾃检相关代码rtc实时钟有关操作tools U-Boot有关的数据代码U-Boot总体⼯作流程与⼤多数Bootloader类似,U-Boot的启动分成stage1和stage2两个阶段。

stage1使⽤汇编语⾔编写,通常与CPU体系紧密相关,如处理器初始化和设备初始化代码等,该阶段在start.S⽂件中实现。

上图是U-Boot中Stage1⼯作流程。

Stage1的代码都是与平台相关的,使⽤汇编语⾔编写占⽤空间⼩⽽且执⾏速度快。

Stage1负责建⽴Stage1阶段使⽤堆栈和代码段,然后复制Stage2阶段的代码到内存。

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 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位。

BOOTLOADER启动程序分析

BOOTLOADER启动程序分析

BOOTLOADER启动程序分析——基于工程D003_Malata35P_63509_chinese桂洁2007.12.3 .eboot.nb0是第一次被JTAG烧到NOR。

以后,bootloader负责对:xip.bin:先写到RAM,再烧到nand flash;nk.bin:直接写到RAM;eboot.bin:由eboot.nb0下载,先写到RAM,再烧到nor flash。

上电后:eboot本身会将自己写到RAM。

也会把nand中的镜像写到RAM中再执行。

程序一上电,自动执行0x00000000处的指令。

所以,只要把这条指令设定好,下面就可以按我们自己的思想进行设计。

一.f wxsc1.s位于:D:\WINCE420\PLA TFORM\SEUICBSP\KERNEL\HAL\ARM这是startup。

他是一个汇编程序。

1.入口为:LEAF_ENTRY StartUp,第一条语句是:B Reset_Handler,放在0x00000000处。

所以上电后首先执行这条指令。

2.Reset_Handler,是StartUp的主体。

根据复位类型进行硬件的初始化。

具体步骤为(可能不是很准确):串口初始化,CPU进入特殊指令模式,关MMU,关中断,检查复位原因,初始化硬件(GPIO,内存,中断控制器,时钟,PowerManager),通过串口打印信息,查SDRAM,bootloader将自己写到RAM,检查正确性,跳到RAM,设置并使能MMU,Cache,设堆。

3.最后一条语句是bl main。

跳到main函数。

二main1.main位置:D:\WINCE420\PLA TFORM\SEUICBSP\EBOOT\main.c。

作用:调用BootloaderMain()。

2.BootloaderMain位置:D:\WINCE420\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG\BLCOMMON\blco mmon.c作用:这是bootloader的框架。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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位。

相关文档
最新文档