对于操作系统而言,Linux有着理想的特性:低成本、高可靠性、极好的网络和多任务支持,更重要的是他的开放源码,让使用者不仅能免费使用,更能够根据自身需要量身定制.因此除了节省支出成本之外,能更自由、更有弹性地根据自己的需要来修改系统、开发产品.嵌入式系统市场是Linux最重要的应用领域之一,几乎所有的嵌入式产品都可以利用Linux来完成.在制作Embedded Linux都会面临到要如何利用最少的系统资源,来建构一个特定嵌入式环境的问题,本方式包含有把Linux Kernel依所要执行的目标环境量身打造,建构一个符合该硬件平台的Linux Kernel,避免不必要的核心功能与驱动程序,并且利用动态函数库来减少储存空间.PC104作为相当广泛的嵌入式计算机平台,将量身定做的Linux操作系统移植于其上,无疑是一件很有意义的事情.
1 PC104主板上嵌入式Linux的实现
要在一块配置为集成有586CPU、64 Mb内存、网卡、VGA显示卡、串口、并口、32MbCF卡、软驱接口、IDE接口、键盘接口、鼠标接口、CRT接口的PC104主板上实现一个能从CF卡启动并能运行Linux的shell的嵌入式Linux.这样的工作需要完成内核和文件系统的裁减以及整个系统移植到CF卡上3个部分.
1.1 Linux的启动过程
系统加电自检后,位于BIOS的ROM 中的引导装入程序开始寻找引导扇区,引导装入程序可以选择lilo或者grub,这里选择grub.首先加载你所选择的操作系统内核,接着内核加载并运行init程序.init程序读取/etc/inittab文件,这个文件指定了系统默认的运行级别,然后根据文件内容先由bash运行系统初始化脚本/ete/rc.d/rc.sysinit,进行诸如文件系统检查和加载、时钟设置、主机名设置等初始化工作.然后根据默认的运行级别调用/etc/rc.d/rc脚本,来启动一些服务程序,如http等服务.接着运行mingetty,它使得你能够通过一个虚拟控制台进行登陆.当用户输入用户名之后,login程序开始运行,它请求用户输入密码并核对密码,如果密码准确为用户调用默认的shell.至此,一个简单的Linux启动过程就结束了.
图1 Linux的启动过程
1.2 内核的交叉编译
为了构建目标系统(PC/104)的Linux运行环境,先要在主机系统上搭建一套完整的编译开发环境.编译开发环境可以使用商业发行版的Linux,如RedHat Linux,也可以使用Windows下的虚拟机软件如VMware等.由于目标系统与主机系统的软件和硬件配置不一样,因此需要采用交叉编译环境.所谓交叉编译是指当主机系统和目标系统的体系结构与操作系统不兼容时,将在主机系统上的编译的可执行程序应用到目标系统上运行的编译方法.内核是操作系统中最重要的部分,其地位相当于人类的大脑.就Linux而言,是指/boot目录下的vmlinuz文件.内核负责整个嵌入式系统的运行,包括硬件外围、应用程序等.现在的Linux内核已经开发到2.6.X版本.这样的内核几乎已经包含了所有的常见硬件设备的驱动程序,以及最新的通讯协议等等,而且所支持的文件系统的类型也是非常之多,可谓功能非常强大.由于其内核是以源代码的形式发布的,所以方便了裁减.裁减Linux内核主要就是根据目标板的硬件特点配置内核的编译选项.因此清楚地知道自己的目标板的硬件配置是必须的,尤其是各种适配器、控制卡使用的IRQ、DMA以及I/0地址等.
编译内核的操作是图形化配置的,基本上一目了然,具体操作命令及步骤如下.下载Linux内核源代码,然后照如下命令操作:
#make mrproper
#make menueonfig
之后会出现图形化配置界面,按提示和自己已知的硬件配置进行选择就可以了.接着执行
#make dep
#make clean
#make bzImage
编译过程结束后,在目录../SRC/arch/i386/boot/下的文件bzImage即为满足目标PC104计算机的Linux内核.
1.3 利用Busybox创建根文件系统
Busyox被非常形象地称为嵌入式Linux系统中的"瑞士军刀",因为它将许多常用的UNIX命令和工具结合到了一个单独的可执行程序中.虽然与相应的GNU工具比较起来,busybox所提供的功能和参数略少,但在嵌入式系统中已经足够了.
busybox源程序可在网络上找到相应的软件包.假设安装后源码目录为/../sre/busybox,修改/../src/busybox/Config.h文件,在不用的功能前加//,修改/../src/busybox/Makefile文件,将DOSTATIC处改为TRUE.
执行make(生成的名为busybox的文件大小应在650 K左右),然后在主机上用mkdir命令建立一个临时文件目录.具体操作是mkdir/tmp/filesystem .
make PREFIX=/tmp/filesystem install(此时在/tmp/filesystem 目录下即有Linux启动运行所必须的目录和文件了).
1.4 嵌入式Linux操作系统到CF卡的移植
目标硬件系统为PC104计算机,所用存储设备为CF卡.所以做完内核编译及文件系统的创建后,最后要做的就是实现将内核和文件系统移植到CF卡上,当然,这个过程不是简单的复制就能实现的,因为如果需要PC104计算机能从CF卡上启动Linux操作系统,必须有相应的引导程序,这里采用GRUB软件进行内核引导.具体步骤如下:取一张CF卡,用读卡器连接到运行标准Linux操作系统的台式计算机上,首先用Fdisk命令格式化CF卡,fdisk/dev/sda;然后建立文件格式,mkfs.ext3/dev/sda,这里采用ext3格式,sda代表是通过USB接口连接到计算机上的.接下来要将CF卡挂载到计算机上,以便将准备好的内核文件及根文件系统移植到CF卡上.用mount命令挂载CF卡后,在CF卡上用mkdir命令建立/mnt/cf/boot及/mnt/cf/boot/grub等目录.
下面开始将Grub引导程序安装到CF卡上,这样在PC104启机的时候,就会由Grub将内核文件进行引导并执行.安装的步骤如下:首先按照目标机修改下载的Grub安装包中的grub.conf文件,执行Grub文件,进入Grub的命令模式,在grub>提示符下输人root(hd1,0),由于现在的CF卡不是当前启动硬盘,所以硬盘参数不是hd0而是hd1.下一步在grub>提示符下输入setup(hd1),这样grub在CF卡上的安装就结束了.最后一步在grub>提示符下输入quit,即可退出安装模式.
引导程序装载成功后,最后工作是所有文件和文件系统的移植.将编译成功生成的内核文件bzImage拷贝到CF卡的boot目录下,将Grub目录下的文件拷贝到CF卡的grub目录下.文件系统移植具体操作如下:将/tmp/filesystem文件夹下的目录拷贝到CF卡,可执行文件的拷贝方式为mknod命令,或者更为简单的命令cp -dpR即可将主机上的文件移植到CF卡上,特别注意的是如果直接进行拷贝,文件将不能执行.
2 结束语
本文开拓性地将嵌入式Linux操作系统完整地移植到CF卡上,将CF卡插入PC104计算机,便可将操作系统导入.在台式机上开发完成的应用程序,只需复制到CF卡上,便可以在PC104计算机上运行,实现了嵌入式系统开发的方便性.只要有一台运行Linux操作系统的台式机、一块CF卡以及Usb读卡器、一块PC104计算机主板,整个开发过程就可以顺利进行.