浅析基于ARM嵌入式开发的BootLoader设计及其实现
摘 要
随着社会经济的不断发展,我国的计算机技术、通信技术、工业控制技术也有了较大发展。在此背景下,嵌入式系统开发技术也有了迅速发展,并且已经被广泛应用在社会的方方面面。本文首先分析了基于ARM嵌入式开发BootLoader的功能,又详细阐述了具体的构建思路,在此基础上,详细分析了BootLoader设计的一般模式和其中涉及到的关键技术,期望能对相关研发部门,提供必要的参考。
【关键词】ARM BootLoader设计 模式 关键技术
随着社会经济的高速发展,移动互联网的普及,嵌入式设备已经被广泛应用在社会的方方面面。嵌入式处理器种类多种多样,有ARM嵌入式架构,还有MIPS、PPC 等嵌入式架构。例如,32位ARM嵌入式处理器,它由于性能好、功能损耗低、价格便宜等优势,已经被广泛应用于电子产品以及移动网络通信方面。当前,利用嵌入式开发的操作系统种类繁多,例如,WindowsCE、Linux等。要想将LINUX嵌入式操作系统准确无误的移植到嵌入式设备上面,就必须开发出相关启动程序将LINUX操作系统读取到内存中运行。这个启动程序就是BootLoader,它的作用便是,将硬件初始化并且进行加载,引导嵌入式操作系统的正常运行。下面本文就对基于ARM嵌入式开发的BootLoader设计问题,进行详细阐述。
1 BootLoader的概念及功能
1.1 BootLoader的概念
BootLoader是嵌入式系统内核运行前的一段程序,这段程序可以初始化硬件设备,并且建立一个内存空间的映射图,将整个嵌入式系统的软硬件环境引领至一个较为舒适的状态,进而为整个系统的正常运行创造一个良好的环境。
1.2 BootLoader的功能
BootLoader能够对嵌入系统的硬件设备、系统的处理器以及相关设备进行初始化;BootLoader 可以将底层硬件的差异给屏蔽、消除掉,让上层应用软件的编写和移植更加简便;BootLoader 可以引领嵌入式系统的内核正常运行,还能起到加载内核的作用;BootLoader能够对内核传递必要的硬件信息。在嵌入式系统的内核启动之后, BootLoader的使命便已完成,通过 BootLoader的引领,整个嵌入式系统的设备就能正常运行,发挥其应用功能。例如,我们熟悉的PC中的引导程序,一般由BIOS和位于MBR的OS BootLoader一起组成,实现对整个程序的引导加载。
2 BootLoader的通用功能介绍
在嵌入式系统中,不同系统结构需要的BootLoader也并不相同,另外,BootLoader还需要依赖具体的嵌入式系统板级设备配置,才能发挥其作用。对于一个ARM嵌入式系统而言,BootLoader要能够真正的发挥其引领、加载内核镜像的作用,还需要做到以下几点:
2.1 对ARM进行初始化
这一点是BootLoader必须要能做到的,通过初始化ARM,才能对相关latile数据进行保存。
2.2 初始化串口
在整个系统运行中,这一环节也具有重要价值,通过初始化串口,能够保持和PC端口进行信息流通。
2.3 启动内核镜像
这一点也是BootLoader必须要做到的,一般情况下,镜像的启动模式,主要有两种启动方式,即:FLASH启动模式和RAM启动模式。但这两种启动模式,必须要满足相关的系统状态,才能启动。首先,CPU寄存状态当中,要保持R0=0;其次,启动参数相关的数据列表要注重保持在RAM中的起始地址;最后,CPU模式要注重采用SVC模式。
3 BootLoader的设计
3.1 阶段设计
在对BootLoader进行设计时,考虑到编程语言的因素,可以将BootLoader分为两个阶段进行设计。在第一个阶段设计时,可以采用汇编语言来实现,通过对cpu以及相关存储设备进行初始化工作,完成驱动内核加载。例如,本文将阶段一中的这段汇编文件定名为rom reset.s。编制时,首先要做伪代码:1、定义ARM模式的栈大小如.equMonstacksz,4096,.equ fiqstacksz,4096等;2、申明各模式的栈,.global monstack,.global fiqstck;3、将栈大小和各模式栈结合,明确分配站大小,.con Monstack,Monstacksz、.com Fiqstack,Fiqstackse;4、申明一些标号量,这些基本工作完成以后,进入初始化工作,以reset标号为标识,进行启动工作,之后对相关数据进行存储:如mcrp15,o,r0,c15,cl,0等;之后清空TLB及写缓冲区,然后再对硬件进行初始化工作,初始化工作时,首先要屏蔽所有的中断,再设置CPU的速度和时钟频率,对SDRAM进行初始化。在进行第二部分设计时,通常采用C语言进行编写,主要通过加载内核镜像并将控制权转让给内核来实现。
3.2 地址规划设计
在BootLoader阶段设计好后,急需解决的是,如何分配镜像存储地址的问题,镜像存贮地址相关的问题较多,其中包括:总镜像应该存贮在什么地方;第二阶段过程中,镜像会被复制到什么地方,BootLoader会将原来的镜像加载到什么地方,同时还得注重在分配镜像的过程中,要注重保证镜像之间不会发生冲突等。假设,嵌入式系统需要的内核镜像和系统根文件系统,都需要被加载到到SDRAM中运行时,就要考虑镜像存贮地址的问题,以免二者在运行过程中出现冲突。例如本文已经将SDRAM的操作模式设置了分配的栈区,在这一阶段要注重为ARM设置栈指针,比如,mrc ro,cpsr,要保存CPRS的值,orr ro,ro,xif中应该清楚相关模式位等。由此可见,BootLoader在启动和加载内核的过程中,要注重考虑到镜像存储的问题。
3.3 BootLoader模式设计
通常情况下,普通用户只需BootLoader的启动加载模式,就可以使用设备了,然而对于系统研发人员而言,要时刻面临着镜像要更新的问题,因此研发人员不仅需要启动加载模式,还需要BootLoader的下载模式。要想设计的模式不仅支持启动加载,还支持下载功能,在BootLoader模式设计的时候,可以遵循以下流程进行操作:在BootLoader初始完系统的硬件工作之后,加载内核镜像程序前期,要注重在一定时间内观察有无用户利用键盘进行输入的情况。倘若没有用户使用键盘输入,则直接加载内核镜像进行启动,倘若有用户利用键盘进行输入,则需要进入命令行格式,如本文将内核镜像存在oxooocooo处,然后将FLASH中的kernel拷贝如SDARM中,之后设置启动参数并加载。而研发人员要注重根据自己的实际需求,结合BootLoader的支持情况,做一定的工作。例如,进行FTP文件传输工作,进行下载。
4 结束语
BootLoader是在嵌入式系统迅猛发展下的产物,它能够对系统硬件进行初始化,引领操作系统内核的启动和加载,并能够对系统运行中的各种参数进行检测,保证系统内核的运行和应用。在当前社会经济快速发展、网络等信息技术迅速发展的背景下,要注重对系统的BootLoader进行科学合理的设计,进而提高嵌入式操作系统的稳定性,促进系统的良好运转。
参考文献
[1]徐磊.基于ARM嵌入式开发的BootLoader设计与实现[J].电脑知识与技术,2014,(4):762-764.
[2]朱华宽,朱维杰.基于ARM嵌入式系统的Bootloader的设计与实现[J].中国科技纵横,2011,(1):179.
[3]胡振国.基于ARM的嵌入式软硬件系统设计与实现[D].电子科技大学,2010.
作者单位
楚雄医药高等专科学校 云南省楚雄彝族自治州 675005