基于MIPS的BootLoader设计与研究

摘 要:嵌入式系统因其成本低、可靠性高等特点,被广泛应用于工业控制及民用设备。在嵌入式系统设计过程中,BootLoader的设计是一个难点,以MIPS架构的CPU为例,介绍了BootLoader的设计。

1 MIPS架构介绍
MIPS体系结构首先是一种RISC架构,MIPS32架构中有32个通用寄存器,虽然硬件没有强制性地指定寄存器使用规则,但在实际使用中,这些寄存器的用法都遵循一系列约定。MIPS的每条指令编码长度是固定的,长度都是32位;无条件码,只有Load/Store指令访存;对于跳转指令范围限制:绝对跳转256M,相对跳转128K;乘除法专用寄存器(HI和LO),没有字节或者半字运算指令。MIPS处理器的通用寄存器用法如表1所示。

表1 通用寄存器的习惯命名和用法

2 BootLoader设计
BootLoader指系统启动后,在操作系统内核运行之前运行的一段小程序。通过BootLoader,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。从BootLoader的功能来看,它一般需要完成完整的启动、下载、升级BootLoader或内核的功能,并且包含文件管理等附加功能。综上所述,BootLoader的分解可以见图1

图1 BootLoader分解

ROM 启动功能模块负责CPU的初始化,包括各寄存器、高速缓存、内存管理单元,使CPU 处于一个正常的工
作状态,这部分的编程实现要求是使用汇编语言来实现的。最小子系统的功能用于完成内存、存储器、输出设备、CPU调度等功能。BootLoader附加功能是为了方便用户而提供的一些功能集,包括串口下载,上传等。

2.1 ROM 启动功能模块
 ROM 启动功能模块
(1)寄存器、Cache初始化。初始化操作的大致伪码实现算法如下:

CPO寄存器初始化,主要包括:①CPU状态寄存器初始化;②MMU TLBs初始化成无效值;③其它寄存器赋初始值;

CPU协处理器CPO寄存器初始化;
/调用MIPS架构通用的L1Cache初始化接口/Cache初始化;
/主要包括Dram控制器初始化、板级相关的硬件系统初始化等等/

调用hardware_init进行特定硬件系统初始化。

硬件初始化的最主要工作是内存控制器的初始化,而由于需要动态兼容多种产品,动态识别Memory配置信息,直接导致算法、代码量规模都比较复杂。按常规做法,这里不能使用C语言函数,而必须使用汇编码实现,因为Memory还不可用,即通常意义的函数运行栈不可用。

使用如下策略来实现对C语言函数的调用:在Memory初始化之前将Cache打开,指定一块Cache Enable的区域作为临时Stack区域。只需要保证Stack的实际使用大小小于L1Cache大小,就不会发生Cache Flush操作,从而保证程序运行正确性,待Memory控制器初始化完毕后,将所有的Data Cache内容全部丢弃即可。

大致调用流程的伪码实现如下:
/Target相关硬件初始化人口/
.golbl hardware_init
hardware_init:
CPU的一些基本BUS、IO参数设置;
/该过程完成后临时栈可用,可以调用C语言函数/
Enable Cache & mmu for STACK AREA;
设置临时栈指针;
产品ID信息获取;
/根据上一步的产品ID信息获取结果而定:Normal
OR SetMac/
设置当前运行模式;
CPU类型识别;
dram_init(id,运行模式);
丢弃Cache内容;
恢复MMU设置;
保存允许模式设置:Normal OR SetMac;
函数返回。

(2)内存控制器初始化。BootLoader启动早期一般是在NorFlash中运行,这个期间CPU只是从NorFlash中读取指令并执行,整个过程都是读,不能完成写,所以需要尽快地初始化好内存,以便将代码段和数据段搬移到内存中运行。内存控制器的初始化因硬件平台而异,要参考具体的内存控制器手册来完成初始化。

(3)BootLoader、BOOT/CTRL的.text、.data均定位到RAM空间,因此必须将这些代码数据搬移到正确位置。

在连接脚本中,已经定义了代码数据搬移的ROM 源地址、RAM目标地址、区间大小等符号,因此代码数据段搬移的算法时序大致如下:
#ifdef CONFIG_ROMVERSION

/类C语言算法如下,实际实现中需要使用汇编语言
实现/memcpy((void*)__rom_copy_begin,(void*)__ram
_copy_begin,__rom_copy_size)

/保证代码数据都被正确写入到Memory/Flush All Cache;
#endif/*CONFIG_ROMVERSION */

2.2 BootLoader附加功能
BootLoader附加功能主要包括以下几个方面:①XModem下载升级BootLoader(自身)、主程序;②TFTP下载升级BootLoader(自身)、主程序;③直接运行主程序文件;④文件管理:格式化、查看文件列表、删除文件、文件名修改等。

具体的命令格式由开发人员自行决定,比如对于XModem上传的功能可采用如下的命令格式:
XModem上传功能
命令格式如下:
xmup-file FILE|- rom

合法应用模式如下:
xmup-file config.text(XModem上传文件系统文件)
xmup-rom (XModem上传烧片文件)

2.3 ROM分区
BootLoader编译出来的可执行文件需要存放在不挥发的存储介质上,在嵌入式系统中这个存储介质一般都选用NorFlash,它的容量大小一般为2M、4M、8M 等。在NorFlash中除了需要存放BootLoader的可执行文件外,还需要存放分区信息、环境变量等信息,如表2所示。

表2 ROM 分区

表2中,每个分区的大小可依据具体的应用灵活分配。所有的符合MIPS32、MIPS3264架构标准的处理器都使用相同的逻辑地址空间定位,即启动地址都固定为0xBFC00000,BootLoader的可执行文件存放位置一般均为0xBFC00000,继而约定Flash ROM的逻辑地址也为0xBFC00000。对于8M的ROM分区可采用表3所示的方案。

表3 8MFlashROM 的分区方案

3 结语
本文着重研究了基于MIPS架构的CPU 的Boot-Loader设计,给出了BootLoader设计的整个框架图,并详细讨论了各个模块的功能,对其后续功能的完善和开发具有很的好参考价值。

作者:杨怀德,柯 钢,李建新,祝衍军 来源:软件导刊

附件大小
tu_biao_2.jpg15.9 KB
--电子创新网--
粤ICP备12070055号