ARM bootloader程序的理解

作为一个嵌入式工程师,如果不能写bootloader程序,那就不能成为一个真正的嵌入式工程师.以前做linux driver,常对bootloader程序是一知半解,其实要写好bootloader程序还得好好去研读一下处理器 architecture.

ARM 处理器是一种很热门的嵌入式处理器,现在绝大部分的嵌入式产品都用到了ARM处理器,其低廉的价格和丰富的性能都受到的消费者的青睐.下面针对ARM处理器来具体谈一下ARM bootloader程序.

首先简单的了解一下ARM architecture.ARM主要由ARM内核单元,vector interface ,coprocessor,两种cache(instruction and data),两种TCM(instruction and data), MMU, power management等. cache是为了平衡数据之间的速度而使用的,而TCM是为了存储一些频繁使用的数据,如中断向量等,MMU主要处理虚拟地址到物理地址的转换,起到了对数据的保护作用,用在操作系统的体系中,很显然,bootloader程序就是要为后来的程序提供一个良好的运行环境,这里对ARM architecture的几个组成单元进行必要的配置.

综上所述,ARM bootloader程序主要完成下面几个功能:

1)初始化栈.

2)中断向量表的复制.

3)TCM 和cache的配置,如果有操作系统的话,就应该设置MMU.

4)建立一个程序执行文境.(具体一点,就是根据image文件的属性来处理image段的数据).

5)对内存如mddr,sram进行简单的测试.

6)需要设置一些外围设备,一般来说需要配置一下串口.

一、初始化栈:

应该对irq,firq,svc的栈进行指定,分别操作这几中模式的寄存器。如对irq模式.

mov r0 , #0x12; irq mode

msr CPSR , r0; set irq mode

ldr sp, =0x800; irq steak address

二、中断向量表的复制:

Boot_Def
ldr PC,Arm_Addr_Ini ;0x00
ldr PC,Arm_Addr_Und ;0x04
ldr PC,Arm_Addr_Swi ;0x08
ldr PC,Arm_Addr_Pre ;0x0C
ldr PC,Arm_Addr_Abt ;0x10
nop ;0x14
ldr PC,Arm_Addr_Irq ;0x18
ldr PC,Arm_Addr_Fiq ;0x1C

Arm_Addr_Ini DCD bootstrap_entry + 0x00 ;0x20
Arm_Addr_Und DCD undefined_exception_handler ;0x24
Arm_Addr_Swi DCD software_interrupt_handler ;0x28
Arm_Addr_Pre DCD prefetch_exception_handler ;0x2C
Arm_Addr_Abt DCD abort_exception_handler ;0x30
Arm_Addr_Irq DCD irq_interrupt_handler ;0x34
Arm_Addr_Fiq DCD fiq_interrupt_handler ;0x38

DCD 0x12345678 ; 0x3c

...

ldr r0,=Boot_Def
ldr r1, =0x0 ;address 0x0
mov r2,#0x3C
add r2, r2, r1

0
cmp r1, r2
bge %b1
ldrcc r3,[r0],#4
strcc r3,[r1],#4
b %B0
1

三、TCM的配置

TCM和cache是有区别的,虽然都是为了加快速度,但是TCM必须给它指定地址,TCM和cache的用途也不样,TCM保存常用到的数据如中断向量表和realtime数据,而cache只是为了加快处理器和外设之间的数据处理。

ldr r0, =0x0;
mrc p15, 0, r1, c9, c1, 1;读coprocessor instruction tcm region register.
orr r0, r0, r1;
mov r1, #1
orr r1, r1, r0;instruction tcm bit_o 置1,enable insturction tcm.
mcr p15,0,r1,c9,c1,1;写入

其它的cache配置也类似,主要读懂ARM document.

四、建立一个程序运行文境:

image(bin文件)包括俩部分:RO and RW,RO部分一般我们在加载前后的位置都不用变化,但是RW必须在加载后把他放到RAM中执行,所以RW部分我们把它映射到RAM地址中。

IMPORT |Image$$RO$$Base| ;image RO 开始地址
IMPORT |Image$$RO$$Limit|
IMPORT |Image$$RO$$Length|
IMPORT |Image$$RW$$Base|
IMPORT |Image$$RW$$Limit|
IMPORT |Image$$RW$$Length|
IMPORT |Image$$ZI$$Base|
IMPORT |Image$$ZI$$Limit|
IMPORT |Image$$ZI$$Length|

ldr r0,=|Image$$RO$$Limit|
ldr r1,=|Image$$RW$$Base|
ldr r2,=|Image$$RW$$Limit|

3
cmp r1,r2
bge %B3
ldrcc r3,[r0],#4;从RO段的结束地址+1load rw段数据
strcc r3,[r1],#4;重新写入到rw段
b %B4
4

ldr r0,=|Image$$ZI$$Base|;处理ZI段数据
ldr r1,=|Image$$ZI$$Length|
add r1, r1, r0
ldr r1, =0X2000
ldr r2,=0
5
cmp r0, r1
bge %B6
strcc r2,[r0],#4;初始化ZI段数据为0
b %B5
6

五、对内存进行测试:

由于系统中有各种各样的内存,可以对内存进行简单测试。

六、UART的配置:

UART在嵌入式系统中很重要,虽然它很简单,但是在早期开发中,UART是必须的设备之一。UART作为下一篇中将进一步详细讨论。

更多相关文章
  • QT Sqlite ARM 编写程序是本文要介绍的内容,主要是代码,先来看内容. #include <QApplication> #include <QTextEdit> #include <QString> #include <qsqldatabase.h ...
  • 


    		    02,计算机组成与操作系统的理解、对程序的理解、OS发展史、Linux常见版本 以及 一些杂项
    这里马哥讲了好多,能听懂,但需要记得东西好少,不过我还是 按照 我 对 计算机 的 理解 画了 一张 图, 不一定 准确 , 但是 差不多 把, 计算机 底层 是 由 运算器.控制器.存储器.输入设备.输出设备 这 五大部件 组成 的 其中 运算器 和 控制器 是 在 cpu 中 的, 运算器 是 ...
  • 


    		    ARM上的Bootloader的具体实现1071098736
    BootLoader简介: 当完成用户程序的编译并下载到目标板上运行时,总是要首 先进行存储器的映射,然后通过 ADS(或 SDT)调试环境下载,显然,这个过程对 普通用户来说显得特别烦琐,然而,要在裸板(没有任何程序的系统板)上调试运 行程序,也只能采用这种方法. 如果能在用户设计的系统板上烧写一 ...
  • [摘要]编译器保证volatile自己的读写有序,但由于optimization和多线程可以和非volatile读写interleave,也就是不原子,也就是没有用.C++11 supposed会支持atomic operation. ^C^V的原帖在这里-- 这篇文章详细剖析了为什么在多核时代进行
  • (一)关于ARM处理器Remap的理解 0.什么是Remap 我的理解是:在ROM从0x0用几句指令引导系统之后,把RAM映射到0x0就是Remap. 1.Remap的作用 当ARM处理器上电或者Reset之后,处理
  • RO段.RW段和ZI段 要了解RO,RW和ZI需要首先了解以下知识: ARM程序的组成 此处所说的"ARM程序"是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别. 一个ARM程序包含3部分:RO,RW和ZI.RO是程序中的指令和 ...
  • 这是嵌入式开发中常用的几个专业术语,其诞生的背景和其具体作用大概如下 在很久很久以前,那是8051单片机流行的时代,做单片机开发都需要一个专用工具,就是单片机的编程器,或者叫烧写器.说"烧"写一点不为过,当年的经典芯片AT89C51在编程时需要十几伏的高电压,加在一个特定的引脚上 ...
  • 简介 ARM是Advanced RISC Machine的首字母缩写,它可以称之为一家嵌入式处理器的提供商,也可以理解为一种处理器的架构,还可以将它作为一套完整的处理器指令集. 原生程序与ARM汇编语言 对于使用ARM处理器的Android手机来说,它最终会生成相应的ARM elf可执行文件,分析软 ...
一周排行
  • 


    		    基于2008安裝sccm2010
    这个实验目的是安装sccm 基于上一篇的继续装 下面送上传送门 步骤相对来说比较简单 ht
  • 


    		    軟件開發工具包3D Mesh 功能介紹
    3D Mesh 是基于对象的软件开发工具包,提供了完全可配置的曲面和实体网格划分能力.该组 ...
  • 稀疏表示 分为 2个过程:1. 获得字典(训练优化字典:直接给出字典),其中字典学习又分为2个步骤:Sparse Coding和Dictionary Update:2. 用得到超完备字典后,对测试数据进行稀疏编码Sp
  • c# winform 火狐浏覽器 查看cookie
    c# winform 火狐浏览器 查看cookieFirefox的Cookie数据位于:%
  • 工程中具有导入Excel数据的功能,但是需要满足一定的格式.为了在导入之前,对Excel的格式进行规范,对vbs脚本语言进行了一定的了解,并实现了一个可以将Excel全部单元格设为文本格式的vbs脚本.具体内容如下:
  • 题目链接 算法:BFS 14.01.02 PS: 本人再次脑残,BFS又是写得那么脓肿,突然发现我原来什么搜索都是不会的呀.. //5已更新 ****************************
  • 在远程管理linux系统基本上都要使用到ssh,原因很简单:telnet.FTP等传输方式是‍以明文传送用户认证信息,本质上是不安全的,存在被网络窃听的危险.SSH(Secure Shell)目前较可靠,是专为远程登
  •   InterruptedException    这个异常一般发生在线程中,当一个正在执行的线程被中断时就会出现这个异常-! 简单的说就是:假如有两个线程,第一个线程正在运行,第二个没有运行,这时第二个线程启动运行
  • poj3627
    题意: 输入一个N和B N为牛的个数,B为高度,然后输入N头牛,为最少多少头牛加起来高度大 ...
  • Unity Chan 2D Asset
    4月份時,UNITY CHAN 官方網站推出了3D大島こはく,之後也有更新1.11版,而在 ...