Blob在S3C44B0上的移植
关键词:S3C44B0 Blob Bootloader 移值
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的开发板。本文将以运行在MBA44B0开发板上的Blob的源代码为基础,再针对自己的开发板进行Blob的移植。
开发板的主要配置为:
*三星ARM7处理器S3C44B0;
*2MB的Flash,地址范围0x0000 0000~0x0020 0000;
*8MB的SDRAM,地址范围0x0c00 0000~0x0c80 0000;
*1个串口,2个LED灯;(凹丫丫范文网fanwen.oyaya.net收集整理)
*JTAG接口;
*晶振为6MHz,系统主频为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()函数,继续进行如下工作:
*外围的硬件初始化(串口,USB等);
*从Flash中将kernel加载到SDRAM的kernel区域;
*从Flash中的ramdisk加载到SDRAM的ramdisk区域;
《Blob在S3C44B0上的移植》