Blob在S3C2440A上的移植
1引言
本文引用地址://m.amcfsurvey.com/article/90712.htmBootloader是在操作系统运行之前执行的一段程序。通过这段小程序,初始化硬件设备,建立内存空间的映射表,设置适当的系统软硬件环境,为最终调用操作系统内核做准备。目前流行的可以引导加载Linux的Bootloader包括:支持x86体系结构的LILO,GRUB,ROLO,Loadlin,Etherboot,LinuxBIOS;支持ARM体系结构的Compaq的bootldr,Blob,U-Boot,vivi,RedBoot;支持MIPS体系结构的PMON和支持m68K体系结构的sir-boot。相对于上述Bootloader,Blob具有代码量小,文件结构清楚等优势,更易于在具有ARM核的器件上移植。
2 Blob简介
Blob是Boot Loader Object的缩写,是一款功能强大的Bootloader。它遵循GPL,源代码完全开放,既可用来进行简单调试,也可启动LinuxKernel。最初的Blob是Jan-DerkBakker和Erik Mouw为一块名为LART(Linux Advanced Radio Terminal)的板子写的,该板使用的处理器是StrongARMSA-1100。Blob的主要特征是引导嵌入式Linux功能即把Kernel、根文件系统等从Flash中调入SDRAM执行;存储操作功能。即支持内存查看、修改、比较;设备驱动功能。即支持串口,Flash、外部SDRAM等驱动;命令交互功能。可在命令行下在线更新Blob,Kemel和ramdisk。
3 Blob的运行过程分析
图1给出Blob的启动示意图。定义Blob编译后的最大代码为64 KB,并且这64 KB分为两个阶段来执行。第一阶段的代码在start.s中定义,大小为1 KB,包括从系统上电后在0x00000000地址开始执行的部分。这部分代码包括对S3C2440A的一些寄存器的初始化和将Blob第二阶段代码从Flash拷贝到SDRAM中。除去第一阶段的1 KB代码,剩下的部分都是第二阶段的代码。第二阶段的起始文件为trampoline.s,被复制到SDRAM后,就从第一阶段跳到这个文件开始执行剩余部分代码。第二阶段的代码最大为63 KB,trampoline词义为"蹦床",所以在该程序中进行一些BSS段设置和堆栈的初始化等工作后,最后跳转到main.c进入C函数。
图2给出目标开发板QQ2440V3的Flash存储器空间分配图。系统上电后,先执行第一阶段代码,进行相应的初始化后,将Blob第二阶段代码复制到SDRAM地址bloc_abs_base,然后跳转到第二阶段开始执行。图3给出了SDRAM布局。在第二阶段中,从汇编跳转到C语言编写的Main()函数,将继续对外围的硬件初始化(串口,USB等),从Flash中将Kernel,ramdisk分别加载到SDRAM的Kernel区域和ramdisk区域,根据用户选择,进入命令行模块或启动Kernel。
由于Flash的存储空间有限,所以存放在Flash中的Linux内核是经过压缩的。Blob将压缩的Linux内核加载到SDRAM地址0x30008000。如果选择启动Linux,那么压缩的Linux内核将自解压到0x30008000,然后跳转到Linux Kernel首地址,启动Linux。由图3可见,Blob_base和blob_abs_base两部分。blob_abs_base是Blob将自身的第二阶段代码复制到SDRAM所在的区域,而blob_base则是从Blob进行自升级或调试的区域。
4 SC32440A上Blob的移植过程
blob-2.0.5-pre2版本的移植工作是在微处理器S3C2440A和对应的系统板QQ2440V3的基础上执行的。表1给出了系统板硬件资源配置。
4.1建立交叉编绎环境
首先在宿主机(一般为PC)上安装标准Linux操作系统,然后安装交叉编译工具链即可建立编译环境。这里的主机端(PC)开发平台选用Linux操作系统,使用的交叉编译工具为arm-linux-gcc-2.95.3。
4.2移植操作内容
根据Blob的文件结构加入移植所需的相关文件、宏定义及变量。在configure.in加入目标板的定义;在acconfig.h加入目标板定义,例如:添加/*Define for s3c24-40A*/#undefs3c2440A。类似的在include/blob/arch.h中添加目标板头文件s3c2440A.h,并把加人的目标板头文件复制到blob/arch目录下,同时添加目标板相关头文件到Makefile.am;在utils/build/build_all和utils/build/build_Makefile中把目标板s3c2440A赋值给变量"arch",并在src/blob/Makefile.am文件中,把与目标板相关的源文件s3c2440.c添加到变量EXTRA_blob_rest_elf32_SOURCES中。最后一步就是把目标板源文件s3c2440.c,memsetup-s3c2440.s,nandflash.c复制到src/bolb目录下,在include/blob/linux.h中加入结构体系号。
Blob启动汇编文件的修改。修改Blob启动文件start.s,包括关看门狗Watchdog(上电后,Watchdog默认是打开的);禁止所有中断;初始化系统时钟;配置PLLCON寄存器,以决定系统的主频;禁止MMU;禁止CACHE;初始化SDRAM刷新速率,修改memsetup,并初始化存储器空间等。
注意:在BLOB源代码中有处BUG,将src/blob/lib/command.c中GetCommand()函数的else if(c==/b)修改为else if(c==0x7f),支持Backspace功能。
5 Blob编译与测试
5.1 Blob编译
完成初级移植工作后完成可运行配置命令./configure--with-board=S3C2440--with-linux-prefix=/home/2440blob-en-able-xmodem-enable-md5-with-commands=used进行相关配置。最后,执行make,即完成编译。
5.2 Blob测试结果
系统采用NAND Flash启动,在运行编译好的Blob之前必须通过JATG口把blob/src/blob目录下编译生成好的Blob映像文件和linux zImage,ramdisk映像文件烧录到NANDFlash中,如果在前述的工作中没有问题,板子上电就可以从串口看到欢迎信息。加载Linux内核和文件系统后,等待几秒,如果没有操作,将启动操作系统,否则出现提示符,以下是help命令测试结果。
6结语
研究了Blob在S3C2440上的移植方法及过程,对于其工作原理及所移植开发板的硬件资源配置是Bootloader移植工作成功与否的关键。目前移植好的Blob已经能稳定地在开发板上运行,实现了串口与PC通信、查看、修改内存、引导Linux操作系统等功能,为后续开发奠定了良好基础。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)
linux操作系统文章专题:linux操作系统详解(linux不再难懂)万能遥控器相关文章:万能遥控器代码
c语言相关文章:c语言教程
linux相关文章:linux教程
评论