1、嵌入式Linux软件结构与分布
在一般情况下嵌入式Linux系统中的软件主要分为以下及部分:
(1)引导加载程序:其中包括内部ROM中的固化启动代码和Boot Loader两部分。
而这个内部固化ROM是厂家在芯片生产时候固化的,作用基本上是引导Boot Loader。有的芯片比较复杂,比如Omap3,他在flash中没有代码的时候有许多启动方式:USB、UART或以太网等等。而S3C24x0则很简单,只有Norboot和Nandboot。
(2)Linux kernel 和drivers。
(3)文件系统。包括根文件系统和建立于Flash内存设备之上的文件系统(EXT4、UBI、CRAMFS等等)。它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好运行环境的载体。
(4)应用程序。用户自定义的应用程序,存放于文件系统之中。
在Flash 存储器中,他们的 一般分布如下:
但是以上只是大部分情况下的分布,也有一些可能根文件系统是initramfs,被一起压缩到了内核映像里,或者没有Bootloader参数区,等等。
2、在嵌入式Linux中为什么要有BootLoader
在linux内核的启动运行除了内核映像必须在主存的适当位置,CPU还必须具备一定的条件:
1. CPU 寄存器的设置:
R0=0;
R1=Machine ID(即Machine Type Number,定义在linux/arch/arm/tools/mach-types);
R2=内核启动参数在 RAM 中起始基地址;
2. CPU 模式:
必须禁止中断(IRQs和FIQs);
CPU 必须 SVC 模式;
3. Cache 和 MMU 的设置:
MMU 必须关闭;
指令 Cache 可以打开也可以关闭;
数据 Cache 必须关闭;
但是在CPU刚上电启动的时候,一般连内存控制器都没有配置过,根本无法在内存中运行程序,更不可能处在Linux内核的启动环境中。为了初始化CPU及其他外设,使得Linux内核可以在系统主存中跑起来,并让系统符合Linux内核启动的必备条件,必须要有一个先于内核运行的程序,他就是所谓的引导加载程序(Boot Loader)。
而Boot Loader并不是Linux才需要,是几乎所有的运行操作系统的设备都具备的。我们的PC的BOIS就是Boot Loader的一部分(只是前期引导,后面一般还有外存中的各种Boot Loader),对于Linux PC来说,Boot Loader = BIOS + GRUB/LILO。
3、Boot Loader的功能和选择
通过上面的讲述,我们可以知道:Boot Loader是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境,最后从别处(Flash、以太网、UART)载入内核映像并跳到入口地址。
由于BootLoader直接操作硬件,所以她严重依赖于硬件,而且依据所引导的操作系统的不同,也有不同的选择对于嵌入式世界中更是如此。就S3C24x0而言,如果是引导Linux,一般选用韩国的mizi公司设计的vivi或者DENX软件工程中心的U-boot,如果是引导Win CE,就选用Eboot。如果是开发StrongARM 构架下的LART,就可选用由Jan-Derk Bakker 和 Erik Mouw发布的Blob(Boot Loader Object)。如果是要引导eCos系统,就可以选用同是Redhat公司开发的Redboot。
所以在嵌入式世界中建立一个通用的 BootLoader 几乎是不可能的,而有可能的是让一个 Boot Loader代码支持多种不同的构架和操作系统,并让她方便移植。U-boot就是支持多平台多操作系统的一个杰出代表。这也是为什么我喜欢用U-boot的原因,因为如果在开发S3C2440时熟悉了U-boot,再转到别的平台的时候就可以很快地完成这个平台下的U-boot移植,而且U-boot的代码结构越来越合理,对于新功能的添加也十分容易。
值得一提的是国内的一个开源项目maxwit中的g-bios也是一个不错的开源BootLoader,同样支持多平台。
一、U-boot的起源
U-Boot是
Das U-Boot的简称,其含义是
Universal Boot Loader,是遵循
GPL条款的开放源码项目。一开始德国
DENX软件工程中心的
Wolfgang
Denk基于
8xxROM和
FADSROM的源码创建了
PPCBoot工程项目,此后不断添加处理器的支持。后来,
Sysgo Gmbh把
PPCBoot移植到
ARM平台上,创建了
ARMBoot工程项目。然后以
PPCBoot工程和
ARMBoot工程为基础,创建了
U-Boot工程,
2002年
12月
17日第一个版本
U-Boot-0.2.0发布,同时
PPCBoot和
ARMboot停止维护。而今,
U-Boot作为一个主流、通用的
Bootloader,成功地被移植到包括主流的
PowerPC、
ARM、
X86 、
MIPS、
NIOS、
XScale等体系结构的上百种开发板,成为功能最多、灵活性最强,并且开发最积极的开源
BootLoader。目前。
U-Boot仍然由
DENX的
Wolfgang
Denk维护。
二、U-boot的开发情况和资源
一开始U-boot的版本号是由X.Y.Z来表示的,从0.2.0一直到1.3.4,之后便开始使用年份加月份的表示方法,2008.11到现在的2010.3平均每3个多月出一个新版本,每次代码的结构和定义都会有一些修正和改进。我从1.2.0开始移植U-boot到S3C24x0,到现在的2010.03,发现U-boot的代码越来越规整,功能越来越强,但是移植的难度反而越来越小,需要修改的地方越来越少。
而对于U-boot,不仅仅有主线版本,在U-boot的Git代码仓库中还有各个CPU构架的分支版本,这些分支会在一定的时候将修改汇入主线。值得注意的是U-boot-V2,这是下一代的U-boot,代码的构架比较新,现在正处在开发的阶段,但针对S3C2440的支持似乎可以了,还没有时间尝试。
下面总结一下关于U-boot源代码的网络资源:
官方链接
德国DENX软件工程中心主页
http://www.denx.de/
U-boot官方主页
(注意其中的
邮件列表链接)
http://www.denx.de/wiki/U-Boot/WebHome
U-boot官方源码
FTP下载
ftp://ftp.denx.de/pub/u-boot/
U-boot官方
Git代码仓库
http://git.denx.de/?p=u-boot.git
针对S3C2440的修改
Openmoko手机的
U-boot源码
Git
http://git.openmoko.org/?p=u-boot.git;a=shortlog;h=refs/heads/stable
buserror的
U-boot源码
Git(针对
mini2440)
http://repo.or.cz/w/u-boot-openmoko/mini2440.git
我的U-boot源码Git(针对
mini2440)
http://github.com/tekkamanninja