Bootloader对于嵌入式设备来说至关重要,它涉及到许多硬件相关的知识。对于自制的嵌入式开发板,它又是不可跳过的步骤,所以很多人对于它感到很头痛。本文将以一款优秀的Bootloader Blob为例,详细讲解它的运行原理以及在S3C44B0通用处理器上的移植过程,为在嵌入式设备上的后续软件开发打下基础。
1、 Blob简介
Blob是Boot Loader Object的缩写,是一款功能强大的Bootloader。它遵循GPL控制工程网版权所有,源泉代码完全开放。Blob既可以用来简单的调试,也可以启动Linux kernel。Blob最初是Jan-Derk Bakker和Erik Mouw为一块名为LART(Linux Advanced Radio Terminal)的板子写的,该板使用的处理器是StrongARM SA-1100。现在Blob已经被移植到了很多CPU上,包括S3C44B0。
MBA44B0是一款基于S3C44B0的开发
开发板的主要配置为:
*三星ARM7处理器S3C44B0;
*2MB的Flash,地址范围0x0000 0000~0x0020 0000;
*8MB的SDRAM控制工程网版权所有,地址范围0x0c00 0000~0x0c80 0000;
*1个串口,2个LED灯;
*JTAG接口;
*晶振为6MHzwww.cechina.cn,系统主频为60MHz。
2、 Blob的运行过程分析
图1为Blob程序启动流程
Blob编译后的代码定义最大为64KB,并且这64KB又分成两个阶段来执行。第一阶段的代码在start.s中定义,大小为1KB,它包括从系统上电后在0x00000000地址开始执行的部分。这部分代码运行在Flash中,它包括对S3C44B0的一些寄存器的初始化和将Blob第二阶段代码从Flash拷贝到SDRAM中。除去第一阶段的1KB代码,剩下的部分都是第二阶段的代码。第二阶段的起始文件为trampoline.s,被复制到SDRAM后,就从第一阶段跳到这个文件开始执行剩余部分代码。第二阶段最大为63KB,单词trampoline词义为“蹦床”,所以在这个程序中进行一些BSS段设置控制工程网版权所有,堆栈的初始化等工作后,最后跳转到main.c进入C函数。
我们的移植主要需要对上述的几个文件进行修改。在进行移植以前,首先需要对存储器的地址空间分配了解清楚。关于存储器空间的定义在/include/blob arch/mba44b0.h中。
图2为在Flash中的存储器空间分布,图3为启动后在SDRAM中的存储器空间分布。
如图2所示,2MB的Flash空间分别分配给出Blob、kernel、ramdisk。系统上电后,先执行第一阶段代码,进行相应的初始化后,将Blob第二阶段代码复制的RAM地址bloc_abs_base,然后跳转到第二阶段开始执行。
在第二阶段中,从汇编跳转到C的Main()函数www.cechina.cn,继续进行如下工作:
*外围的硬件初始化(串口,USB等);
*从Flash中将kernel加载到SDRAM的kernel区域;
*从Flash中的ramdisk加载到SDRAM的ramdisk区域;
*根据用户选择,进入命令行模块或启动kernel。
在我们使用的开发板上,kernel选用uClinux。由于Flash的存储空间有限,所以存放在Flash中的uClinux内核是经过压缩的。Blob将压缩的uClinux内核加载到SDRAM地址0x0C300000。如果选择