2 Bootloader的可移植性研究
大部分Bootloader的总体结构与BLOB类似,一般分为两个阶段运行。其中第一阶段与CPU架构相关,不同架构CPU往往要求不同的Bootloader与之对应[3],只有少数Bootloader能够适用于多种架构的CPU,如表1。
2.1 相同构架下Bootloader移植
对于相同的CPU构架,Bootloader移植工作大体上可以分为三部分。
(1)目标板驱动部分,针对特定CPU、Flash、SDRAM等对驱动程序进行定制。完成处理器各个I/O口的初始化、Flash描述(包括区块大小及数量)和Flash初始化等。一个必要的工作是Flash分区表的配置,Flash的典型空间分配结构如图2所示。
(2)目标板相关的头文件,文件中包含了目标板配置的宏定义,主要有系统工作频率、GPIO定义、Flash 各分块起始地址及容量、Flash 读/写命令字、SDRAM寄存器配置、SDRAM起始地址及容量、内核装载地址等。其中大部分GPIO设置的目的是在Bootloader下做板载开发,这项功能不是必需的。而CPU频率及Flash的设置则直接影响到系统能否启动。对于采用Ramdisk技术的系统开发,SDRAM的配置也直接关系到Kernel的加载。因此,各头文件的代码修改是移植过程的重点。
(3)Bootloader总体配置文件修改,包括目标板声明、指定目标板头文件、定制文件关联关系等。
图3以BLOB在PXA255[4]的目标板上移植为例表现了需要增、改的关键文件之间的内在联系。
图3中:
(1)SRC/blob/PXA255.c:笔者编写的针对PXA255目标板驱动文件,这里是采用默认设置的最简情况,必要时还需对文件如Flash.c等进行修改。
(2)include/blob/arch/PXA255.h:目标板头文件,它必须通过arch.h及config.h进行指定,最终反映在configure.in中。
(3)configure.in:添加目标板声明,如果已有目标板类型,则无需修改该文件;如果没有,则需要根据情况添加目标板名称、CPU型号、必需的.o文件,如:
PXA255)
AC_MSG_RESULT(Ipaq PXA255)
AC_DEFINE(PXA255)
AC_DEFINE(USE_SERIAL3)
BLOB_PLATFORM_OBJ=″PXA255.o″
BLOB_FLASH_OBJS=″nullflash.o″
use_cpu=″PXA255″
use_LCD=″no″
(4)Makefile.am:由于添加了PXA255.c和PXA255.h,所以要在它们所在目录的Makefile.am中进行登记,保证configure.in和Makefile.am在进行./configure处理时能够生成正确的Makefile文件,最终在执行Make命令后生成BLOB的可执行文件。
需要注意的是Linux内核必须根据目标板硬件情况作相应的设置[5],这里不展开论述。