ARM上的Bootloader的具体实现1071098736

BootLoader简介:
当完成用户程序的编译并下载到目标板上运行时,总是要首
先进行存储器的映射,然后通过 ADS(或 SDT)调试环境下载,显然,这个过程对
普通用户来说显得特别烦琐,然而,要在裸板(没有任何程序的系统板)上调试运
行程序,也只能采用这种方法。
如果能在用户设计的系统板上烧写一段 BootLoader程序,就可以将该过程屏蔽
起来,让用户通过一些简单的操作,就可完成程序的下载、调试等工作。在嵌入式
系统中,BootLoader的作用与 PC 机上的 BIOS 类似,通过 BootlLoader可以完成对
系统板上的主要部件如 CPU、SDRAM、Flash、串行口等进行初始化,也可以下载
文件到系统板、对 Flash 进行擦除与编程。事实上,一个功能完善的 BootLoader 已
经相当于一个微型的操作系统了。
BootLoader 作为系统复位或上电后首先运行的代码,一般应写入 Flash 存储器
中并从起始物理地址 0x0 开始。BootLoader 根据实现的功能不同,不相同。一个简单的 BootLoader程序可以仅仅完成串行口的初始化,并进行
通信,而功能完善的 BootLoader可以支持比较复杂的命令集,对系统的软硬件资源
进行合理的配置与管理。因此,用户可根据自身的需求实现相应的功能
涉及具体汇编代码前,有些术语要必须弄懂的
O:映像文件(image):指一个可执行文件,在执行的时候被加载到处理器中,它是ELF(Executable and Linking Format)格式的。
O:RO :是Read-Only的简写形式。一般存放的代码
O:RW:是Read-Write 的简写形式,一般存放初始化的数据
O:ZI:是zero-Initialized的简写形式。一般是存放初始化数据
O:输入段(Output Section):它包含一系列具有相同RO,RW,ZI属性的输入段
对于
一个ARM bootloader系统来说,本质上,bootloader作为引导与加载内核镜像的工具,必须提供以下几个功能,更确切地说,必须做到以下几点:
~1~初始化RAM(必需):bootloader应该能初始化RAM,因为将来系统要通过它来保存一些Volatile数据,但具体地实现要求依赖与具体的CPU以及硬件系统。~2~初始化串口(可选),bootloader应该要初始化及使能一个串口,通过
~1~ 它与控制台联系进行一些debug的工作;甚至与PC通信。
创建内核参数列表(针对linux操作系统,推荐)。
启动内核镜像(必需):根据内核镜像保存的存储介质不同,可以有两种启动方式:FALSH启动以及RAM启动;但是无论是哪种启动方式,下面的系统状态必须得到满足:
Bootloader 阶段1的代码实现:
1,定义ARM个模式的栈大小
2,申明各模式的栈
3,将各模式的栈与栈大小结合起来,既为各栈分配栈大小
4,申明一些标号量
5,以某标号标识,一开始处设置异常中断向量表,当冷启动时,直接跳转至对应处启动
6系统正常启动时:1使能各协处理器,2关闭MMU,内部指令/数据cache以及缓冲区,ARM体系bootloader中都无需MMU的功能,所有的地址都直接使用物理地址:cache也都关闭,原因.3清空TLB,Caches以及写缓冲区,当系统冷启动时所有的保留数据都以无效处理,因此都要清空,况且cache都已经关闭 4开系统各存储空间域的访问权限;ARM体系中系统的存储空间分为最多的16个域,每个域对应一定的内存区域,该区域具有相同的访问控制属性。MMU中寄存器C3用于控制与域相关属性的配置。(
以上涉及的是相关存储方面通用的处理,接着就要开始具体的硬件初始化的工作了,与
具体的CPU以及具体的存储芯片大小有关。)
1. 屏蔽所有的中断:为中断提供服务通常是操作系统设备驱动程序的责任,因此在bootloader的执行全过程中可以不必相应任何中断,中断屏蔽是通过写CPU提供的中断屏蔽寄存器来完成的。
2. 设置CPU的速度与时钟频率:系统复位后对于CPU的速度与时钟频率都有一个初始的默认值,可以直接使用该值,到内核启动初始化的时候再设置;也可以在此处直接设置。
3. SDRAM 的初始化以及使能,这个设置与具体的RAM大小有关,包括正确地设置系统的内存控制器以及各内存库控制寄存器。具体代码稍长,在这里相关代码略去。
相关基本硬件初始化之后,开始设置模式。
1. 为ARM的各个操作模式设置称栈指针:在前面的伪代码中已经为各个操作模式分配相应的栈区,而且ARM各个模式下都有自己通用的栈顶指针SP,现在要做的是在不同模式下将该模式下的SP指向栈顶。每个模式的处理都类似,都是通过设置状态寄存器CPSR(可以参看前面章节的介绍)来完成,并且每个模式都要完成。以IRQ模式为例:
到此时,用汇编编写的硬件基本初始化代码完成,对于阶段1来说,剩下的工作就是将镜像2拷贝到SDRAM的指定处,这个工作我们通过一小段C代码来完成,文件名为cstart.c,完成拷贝功能的函数设为cstart。则在汇编末尾可以通过跳转指令进入阶段1的这一小段C代码:
/***************************有关中断向量表**************/
为什么在中断向量表中不直接LDR PC,"异常地址".而是使用一个标号,然有再在后面
使用DCD 定义这个标号
A:因为LDR 指令只能跳到当前PC 4kB 范围内,而B 指令能跳转到32MB 范围,而现在这样
在LDR PC, "xxxx"这条指令不远处用"xxxx"DCD 定义一个字,而这个字里面存放最终异
常服务程序的地址,这样可以实现4GB 全范围跳转

如:在PROTEUS 中的芯片组:
LPC2220的复位与存储器映射
芯片复位后,MAP=00,启动boot装载程序,boot装载程序检测P0.14口的状态和用户的异常向量表,判断是进入ISP还是启动用户程序,若启动用户程序,则自动设置MAP=1或3。若用户程序需要更改异常向量表,可以将异常向量表复制到片内0x40000000,然后设置MAP=2进行重新映射,0x40000000地址上的向量表就可以更改了。
LPC2220在复位运行的第一段程序并不是用户程序,而是boot block(引导模块),是设计厂家在ARM内部固化的一段代码,用户无法修改或删除,其主要功能为:
判断运行那个存储器上的程序。
检查用户代码是否有效。(主要检测异常向量表的机器码值之和是否为0)
判断芯片是否被加密。
芯片的在应用编程(IAP)和在系统编程(ISP)
boot block(包括bootload 和64字节异常向量表)。

对于LPC2220,复位后(也即是运行完Boot Block后),用户所能见到的存储空间,及其各存储空间上的内容。
0xF0000000----0xFFFFFFFF:AHB外设;
0xE0000000----0xEFFFFFFF:VPB外设;
0x80000000----0xDFFFFFFF;保留给外部存储器;
0x7FFFDFFF---0x7FFFE000;BOOT BLOCK;
0x40004000----0x4000FFFF;64KB片内RAM;
0x00000000—0x0000003f,ARM异常向量位置;



    		    ARM上的Bootloader的具体实现1071098736
650) this.width=650;" alt="" border="0" src="http://www.ceet.hbnu.edu.cn/bbs/attachments/forumid_80/20081210_9be82ae74b0c52c6266aUw6WhvMsgP8E.jpg" />




    		    ARM上的Bootloader的具体实现1071098736
map.jpg (33.06 KB)

2008-12-10 11:26

存储器映射控制
MAP=00:由任何硬件复位激活,boot block中断向量映射到存储器的底部以允许处理异常。
MAP=01:中断向量表没有被重新映射,它位于存储器的底部。
MAP=10:由用户程序激活,中断向量表重新映射到静态RAM的底部。
MAP=11:用户外部模式,由BOOT[1:0]来控制存储器的引导方式,中断向量表重新映射到外部存储器的底部。
例如:每当产生一个软件中断,ARM内核就从0x00000008处取出32位数据,当MAP=0x11时,这就意味着从0x00000008处取值既是对0x80000008处取值。
存储器重新映射控制用于改变从地址0x00000000开始的中断向量表的映射,使就使得运行在不同存储器空间中的代码对中断的控制。



    		    ARM上的Bootloader的具体实现1071098736
650) this.width=650;" alt="" border="0" src="http://www.ceet.hbnu.edu.cn/bbs/attachments/forumid_80/20081210_0f5bbaa58063bb232fdcmPqbxoBav4qT.jpg" />
拿LPC说
bootblock 出厂时固化的Loader 主要实现ISP功能!
bootloader 自己写的程序
再到main()
上电后bootblock 检测是否有ISP的相关引脚被设定,如果设定进入ISP模式,如果没有设定 运行用户程序(一般来说时用户的BootLoader),然后启动内核或者其他的。
关于异常向量表,配置好你自己的就可以了,不用管 bootblock 上的!

1 设置异常中断向量表
ARM处理器的中断向量表从地址0x0处开始存放,连续有8×4字节的空间。在ARM存储空间里每个字32位,占4个字节。可以通过图1来描述中断向量表的地址分配。
每当有中断或者异常发生时,ARM处理器便强制把PC指针指向向量表中对应中断类型的地址值。为了加快中断响应,我们在Flash的0x0地址存放能跳转到0x0c000008地址处中断向量的跳转指令,即在RAM中建立一个二级中断向量表,起始地址为0x0c000008,除复位外,其它异常入口地址由Flash跳转得到,如表1所示:



    		    ARM上的Bootloader的具体实现1071098736
更多相关文章
  •  MPlayer 1.0已经把大部分解码库都自带了,如ffmpeg,但是自带的音频库在S5PV210下效果非常不好.换成使用libmad效果不错.因此MPlayer 在ARM-Linux的最简单的移植只需要移植这两个即可.移植后即进行字符界面的播放.      移植之前先做好移植前准备,安装好arm
  • 源:用于ARM上的FFT与IFFT源代码(C语言,不依赖特定平台) 代码在2011年全国电子大赛结束后(2011年9月3日)发布,多个版本,注释详细. /*************************************************************************
  • OpenCV在ARM上的移植
    OpenCV在ARM上的移植 与X86 Linux类似,请参考: Linux 下编译安装OpenCV 本文在此基础上进行进一步操作. 网络上很多移植编译的方法比较老,多数针对OpenCV 1.0,而且方法很麻烦,不仔细操作很容易出错,我的方法是尽可能的利用现成的工具,尽量图形化界面配置操作,方便编译 ...
  • Qtopia Core 4是QT/embedded的最新版,网上找很久都没有相关教材,尽是QT/embedded 2的版本.我刚学,干脆就直接上最新版 ^_^ 费了不少时间,作个记录,方便有需要的朋友... 我的目标平台是三星的s3c2410,linux2.4内核,研发平台是RHEL.AS.v4.0 ...
  • ubuntu10.04 准备移植phonon,4.5移植失敗.播放声音就出错...没辦法.转移到QtMutimedia 安装交叉编译工具这里就不提了... 1.下载QT5.3.2:http://download.qt.io/archive/qt/ 不小下载5.0,这个版本有问题... 2.配置 配置 ...
  • 首先,保证sd卡驱动是完好,但是sd卡却无法热插拔或者无法识别.     刚开始我的板子上,sd是能够读取的,但是却不支持热插拔,看了几天sd驱动,找到了问题的原因,是驱动中硬件引脚相关设置的问题,具体根绝个人板子来修改,我想说的是sd卡驱动完好下如何使板子支持热插拔,内核的相关配置我就不多说了,网
  • 1.内核编译的时候,看到以下关于PPP的全部要选择如下: Device Drivers--->Network device support ---> │ │ <*> PPP (point-to-point protocol) support │ │ │ │ [*] PPP m ...
  • 


    		    基于ARM的嵌入式Linux移植真實體驗(2)――BootLoader
    基于ARM的嵌入式Linux移植真实体验(2)――BootLoader 宋宝华 [email protected] 出处:dev.yesky.com BootLoader指系统启动后,在操作系统内核运行之前运行的一段小程序.通过BootLoader,我们可以初始化硬件设备.建立内存空间的映射图,从而将
一周排行
  • 一部server2008,远程RDP登录桌面没有任何显示,可能进程哪里有问题了,需要重启.用如下方式: 在本机用管理员打开CMD 输入命令shutdown /i 在弹出的窗口处点add输入计算机名,然后点ok,远程服 ...
  • 


    		    ROS IPsecVPN點到端配置教程
    BY:孤星 ROS交流群号:286850453 --------------------- ...
  • over partition by與group by
    over partition by与group by 的区别 http://www.cnb ...
  • 学习 : http://blog.csdn.net/darennet/article/details/9009361 http://www.uedsc.com/dpkg-sudo-dpkg-configure-a.h
  • 视图 >> 解决方案资源管理器 >> 右击XXX.rc >> 打开方式 >> 源代码(文本)编辑器
  • 


    		    RHEL 5.3通過安裝光盤構建本地yum 伺服器
    1.检查是yum和createrepo包是否安装 [[email protected] ~]# rpm -
  • 在足球比赛中,有不少赛事,例如世界杯淘汰赛和欧洲冠军联赛淘汰赛中,当比赛双方经过正规比赛和加时赛之后仍然不分胜负时,需要进行点球大战来决定谁能够获得最终的胜利.点球大战的规则非常简单,两方轮流派出球员罚点球,每方各罚
  • 串口WIF簡單I調試
        串口WIF简单I调试   /***************************
  • Emp类 1 package jihe; 2 3 public class Emp { 4 5 public String id; 6 public String name; 7 8 public Emp(Strin
  • 一.打开CRM的报表出现“报表服务器数据库内出错.此错误可能是因连接失敗.超时或数据库中磁盘空间不足而导致的. (rsReportServerDatabaseError) 获取联机幫助 对象名 'ReportServ ...