step by step 构建嵌入式Linux系统平台

发表于:2007-05-26来源:作者:点击数: 标签:
前些日子写的一些文章,大家可以看看... 为了适应目前 嵌入式 系统操作平台在 性能 、成本、 可靠性 等各方面的要求,论述了以Linux作为操作系统平台的优势,分析了以PC104卡和CompactFlash卡构造带图形用户界面(GUI)的 Linux系统 的关键技术. 0 前言 嵌入式

前些日子写的一些文章,大家可以看看...

为了适应目前嵌入式系统操作平台在性能、成本、可靠性等各方面的要求,论述了以Linux作为操作系统平台的优势,分析了以PC104卡和CompactFlash卡构造带图形用户界面(GUI)的Linux系统的关键技术.

0 前言
嵌入式系统的商品化操作系统十分丰富,如Palm OS、VxWorks、pSOS、Neculeus和Windows CE等。高端嵌入式系统要求许多高级的功能,但其价格也相对昂贵,一般用户难以接受。微软的Windows CE也有此类功能,却不具备大多数嵌入式系统要求的实时性能,而且难以移植。
Linux为嵌入式系统提供了一个极有吸引力的选择,对于嵌入式系统而言,性能、成本和可靠性是最至关重要的三个因素。首先,众多文献资料表明,Linux是当前可获得的最简捷、最快速的操作系统 ,其性能优越之处,是把图形处理为一个用户级的应用,图形可根据需要被选择是否运行。Linux系统中存在适度复杂的图形界面,但是它们并没有与操作系统的内核紧紧捆绑在一起,图形界面可按需求关闭。这样就可以在Linux内核上运行专门为嵌入式系统定制的图形系统,从而获得优越的性能。其次,Linux系统源代码完全公开,可以用非常便宜的价格得到各种Linux分发版,不必考虑许可成本,将用户从许可证的限制中解脱出来,无需去为资金短缺而烦忧。Linux能正常运行于内存缺乏,容量紧张的系统中,减少在硬件升级上的开支。另外,在系统稳定性方面,Linux几乎不崩溃,Linux的稳定性是由于它没有像其它操作系统一样内核极其庞大。考察资料表明,Linux与其它Unix系统和大型操作系统如VMSIBM大型机等一样具有相同的可靠性。在上述优势之外,Linux还拥有众多硬件支持的特点和强大的网络支持功能。正因为Linux在价格、性能、稳定性以及用户定制等方面的突出优势,用它来构建系统操作平台是一个很不错的解决方案


1 开发中的关键问题及解决方案
1.1 硬件及软件环境
Linux系统的硬件环境以PC104卡为核心,卡上集成美国国家半导体公司(NS GeodeGX1 300MHz CPU,SVGA/LCD/LAN接口以及增强型IDE硬盘接口,支持CompactFlash卡。硬盘和光驱接至PC104IDE1口,设置跳线使硬盘为主设备(master),光驱为从设备(slave),CompactFlash装在IDE2口,设为主设备,这样Linux识别CompactFlah卡为/dev/hdc,而硬盘和光驱分别为/dev/had,/dev/hdb.我的Linux开发系统是Red Hat 7.2版,通过PC104上的光驱安装在硬盘上。
CompactFlash卡容量为32M,如果系统的BIOS支持自动检测,应该可以直接探测到它。如果不行的话,需要自己输入卡的各项参数。确保不要带电插拔CompactFlash卡,因为这可能导致卡上数据的丢失。
    由于像Red HatMandrake这样的Linux分发版体积庞大(如果带X-Windows基本都在1G以上),是不可能装在容量只有32MCompactFlash卡上的。目前有许多小型的嵌入式Linux版本,比较有名的有:
ETLinux 设计用于在小型工业计算机,尤其是 PC/104 模块上运行的 Linux 的完全分发版。
LEM 运行在 386 上的小型(<8 MB)多用户、网络 Linux 版本。
LOAF "Linux On A Floppy"分发版,运行在 386 上。
uClinux 在没有 MMU 的系统上运行的 Linux。目前支持 Motorola 68K、MCF5206 和 MCF5207 ColdFire 微处理器。
出于深入了解Linux系统运行环境和机制的想法,建议自己构建Linux系统,这对于将来系统内核版本的升级和应用功能的拓展很有好处。选择Red Hat 7.2的Linux版本。


1.2 系统分区和格式化
首先,需要在CompactFlash卡上建立分区和格式化,在Linux下用fdisk命令可以在CompactFlash卡上创建分区,命令格式为fdisk /dev/hdc,然后用mke2fs命令创建ext2文件系统.

1.2 系统分区和格式化
首先,需要在CompactFlash卡上建立分区和格式化,在Linux下用fdisk命令可以在CompactFlash卡上创建分区,命令格式为fdisk /dev/hdc,然后用mke2fs命令创建ext2文件系统.

1.3 编译内核
接下来要做的事情是编译一个自己的内核。内核负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。从技术上而言,Linux 是一个内核,而且只是一个内核。其余我们通常称之为 "Linux" (例如一个 shell 和编译器)的部分实质上只是整个软件包的一部分,它们从技术上而言是与 Linux (内核)分开的。选择与开发系统一样的内核版本2.4.7,在Linux内核版本发布的官方网站 http://www.kernel.org 上可以找到内核源代码。
在编译内核的时候,由于内核是在特定的机器上使用的,所以应该对机器的情况了如指掌。另一方面,为了降低过高的复杂性,可以不用kernel module支持,把所有需要的东西直接编译到内核里。IDE支持是必不可少的,因为Linux认CompactFlash卡为IDE硬盘,Frame buffer的支持也是必要的,这来源于GUI系统—MiniGUI的要求,网络支持可以不要,但是如果认为显示屏将来有这方面的要求也可以把它加上。

1.4 创建根文件系统(Root Filesystem)
在编译好内核后,需要在CompactFlash卡上创建根文件系统。每台机器都有根文件系统(一般在本地盘中,当然也可以在RAM盘或网络盘中),它包含系统引导和使其他文件系统得以mount所必要的文件,根文件系统应该有单用户状态所必须的足够的内容。还应该包括修复损坏系统、恢复备份等的工具。
如果有一个任务比其它任务更能简化从头构建 Linux 根文件系统过程的话,那就是构建和安装 BusyBox 软件包。BusyBox 是一个可执行文件,它提供许多其它常用命令行工具的功能,所有这些功能都合为一体。BusyBox 的文档声称构建一个有效系统所需要的全部就是 BusyBox 和"/dev、/etc 以及内核"— 而且他们没有开玩笑。
Busybox 编译出一个单个的独立执行程序,就叫做 busybox。但是它可以根据配置,执行 ash shell 的功能,以及几十个各种小应用程序的功能。这其中包括有一个迷你的 vi 编辑器,系统不可或缺的 /sbin/init 程序,以及其他诸如 sed, ifconfig, halt, reboot, mkdir, mount, ln, ls, echo, cat ... 等等这些都是一个正常的系统上必不可少的。但是如果我们把这些程序的原件拿过来的话,它们的体积加在一起,让人吃不消。可是 busybox 有全部的这么多功能,大小也不过 100K 左右。而且,用户还可以根据自己的需要,决定到底要在 busybox 中编译进哪几个应用程序的功能。这样的话,busybox 的体积就可以进一步缩小了。Busybox的具体编译和配置方法请参阅Busybox的官方文档,用户可以在http://www.busybox.net/上找到.
系统启动后内核调用的第一个进程是/sbin/init。init进程是系统所有进程的起点,内核在完成核内引导以后,即在本线程(进程)空间内加载init程序,它的进程号是1。init程序需要读取/etc/inittab文件作为其行为指针,inittab是以行为单位的描述性(非执行性)文本,inittab文件至少应该包含下面几行:
::sysinit:/etc/init.d/rcS         //运行系统公共脚本
::respawn:/bin/sh             //立即进入shell环境
::ctrlaltdel:/bin/umount -a      //捕捉Ctrl+Alt+Del快捷键,退出系统
由于init进程第一个执行的脚本文件是/etc/init.d/rcS,编辑rcS文件:
#! /bin/sh
mount -a
接着还需要编写/etc/fstab文件:
proc          /proc          proc           defaults           0       0
none          /var/shm       shm           defaults           0       0


1.5 安装系统引导工具(boot loader)
现在CompactFlask卡上新的内核已经有了,文件系统也已经建好了,接着要做的事情是安装系统引导工具(boot loader)。目前可以选用的引导工具很多,象LILO或GRUB都是挺不错的,用户可以按自己的喜好来选择。在这里我们选用LILO,它在硬盘开始的MBR写入引导代码,这些代码不经过文件系统,直接从硬盘扇区号读内核映象(kernel image)装入内存。那么要如何安装LILO呢?首先需要根据用户系统的搭建情况编辑/etc/lilo.conf文件,下面是我的/etc/lilo.conf文件,配有注释,你可以根据自己的情况进行更改,具体你可以参考LILO mini-HOWTO:
boot=/dev/hdc              #从CompactFlash卡启动
disk=/dev/hdc
bios=0x80                 #使BIOS认CompactFlash卡为启动盘
delay=0                   #可选,以秒为单位
vga=0x311                #可选,参照Frame buffer的配置
image=/boot/vmlinuz-2.4.7   #内核文件位置
root=/dev/hdc1             #root分区位置
label=CompactFlash         #嵌入式Linux的名字
read-write                  #以read-write方式mount根文件系统
编辑完/etc/lilo.conf后,将它写到CompactFlash卡上,假设CompactFlash卡已经被mount到了/mnt/CompactLinux目录下,运行命令:
/mnt/CompactLinux/sbin/lilo -r /mnt/CompactLinux -C etc/lilo.conf
使用这个命令时必须非常小心,它可能会破坏开发系统上的引导系统而使它不能启动,为确保安全应在运行此命令前先创建系统引导软盘。
嵌入式Linux系统的雏形建立完成后,应先对其进行简单测试。关上PC104卡的电源,拔下接在IDE1口的硬盘和光驱,合上电源重启PC104,在BIOS中设置IDE1口硬盘为None,存盘退出BIOS,进入CompactFlash卡上的系统。如果系统可以一直运行到出现shell提示符#,那就证明Linux平台已经初步搭建成功了。
1.5 安装系统引导工具(boot loader)
现在CompactFlask卡上新的内核已经有了,文件系统也已经建好了,接着要做的事情是安装系统引导工具(boot loader)。目前可以选用的引导工具很多,象LILO或GRUB都是挺不错的,用户可以按自己的喜好来选择。在这里我们选用LILO,它在硬盘开始的MBR写入引导代码,这些代码不经过文件系统,直接从硬盘扇区号读内核映象(kernel image)装入内存。那么要如何安装LILO呢?首先需要根据用户系统的搭建情况编辑/etc/lilo.conf文件,下面是我的/etc/lilo.conf文件,配有注释,你可以根据自己的情况进行更改,具体你可以参考LILO mini-HOWTO:
boot=/dev/hdc              #从CompactFlash卡启动
disk=/dev/hdc
bios=0x80                 #使BIOS认CompactFlash卡为启动盘
delay=0                   #可选,以秒为单位
vga=0x311                #可选,参照Frame buffer的配置
image=/boot/vmlinuz-2.4.7   #内核文件位置
root=/dev/hdc1             #root分区位置
label=CompactFlash         #嵌入式Linux的名字
read-write                  #以read-write方式mount根文件系统
编辑完/etc/lilo.conf后,将它写到CompactFlash卡上,假设CompactFlash卡已经被mount到了/mnt/CompactLinux目录下,运行命令:
/mnt/CompactLinux/sbin/lilo -r /mnt/CompactLinux -C etc/lilo.conf
使用这个命令时必须非常小心,它可能会破坏开发系统上的引导系统而使它不能启动,为确保安全应在运行此命令前先创建系统引导软盘。
嵌入式Linux系统的雏形建立完成后,应先对其进行简单测试。关上PC104卡的电源,拔下接在IDE1口的硬盘和光驱,合上电源重启PC104,在BIOS中设置IDE1口硬盘为None,存盘退出BIOS,进入CompactFlash卡上的系统。如果系统可以一直运行到出现shell提示符#,那就证明Linux平台已经初步搭建成功了。

1.6 MiniGUI
现在面向嵌入式Linux 系统的图形用户界面很多,如MicoroWindows/NanoX ,OpenGUI,Qt/Embedded,MiniGUI等,我们选用的是MiniGUI . MiniGUI是由魏永明主持,并由许多自由软件开发人员支持的一个自由软件项目(遵循 LGPL 条款发布),其目标是为基于 Linux 的实时嵌入式系统提供一个轻量级的图形用户界面支持系统。该项目自 1998 年底开始到现在,历经 3 年多的开发过程,已经非常成熟和稳定。因为 MiniGUI 的灵活性非常好,可以应用在包括手持设备、机顶盒、游戏终端等在内的各种高端或者低端的嵌入式系统中,并且是免费的,这使其在众多GUI系统的竞争中脱颖而出,成为我们选择它的一个很重要的理由。
从MiniGUI的官方网站(http://www.minigui.org)上下载MiniGUI的源代码,在PC104的硬盘上进行编译安装,MiniGUI的官方网站上有关于这方面的文档,本文也就不再赘述了。因为MiniGUI 是以源代码的形式发布的,在硬盘上以编译的方法产生的MiniGUI的libminigui 目录下包含了这些源代码以及编译时生成的中间文件,所以需要的空间很大,是不可能将它全部安装到CompactFlash卡上的,需要的文件有:

MiniGUI的演示文件。
*  MiniGUI 的函数库,包括 libminigui、libmywins 和 libmgext 等。
*  MiniGUI 的配置文件,即 MiniGUI.cfg 文件。
*  MiniGUI 所使用的资源文件。
如果你觉得文件太大,参照下面的方法进行修改:
1. 首先可以修改编译选项,把不用的功能去掉,比如说繁体支持等。这样库会小一些。
2.去掉不需要的演示程序。
3. 去掉无用的资源,可以只保留一种字体,只保留一种输入法,删除一些位图文件。
   
至此,带图形用户界面的Linux系统已经搭建完成,可以在开发系统上写自己的基于MiniGUI的应用程序,然后将它拷贝至CompactFlash卡上运行。
1.6 MiniGUI
现在面向嵌入式Linux 系统的图形用户界面很多,如MicoroWindows/NanoX ,OpenGUI,Qt/Embedded,MiniGUI等,我们选用的是MiniGUI . MiniGUI是由魏永明主持,并由许多自由软件开发人员支持的一个自由软件项目(遵循 LGPL 条款发布),其目标是为基于 Linux 的实时嵌入式系统提供一个轻量级的图形用户界面支持系统。该项目自 1998 年底开始到现在,历经 3 年多的开发过程,已经非常成熟和稳定。因为 MiniGUI 的灵活性非常好,可以应用在包括手持设备、机顶盒、游戏终端等在内的各种高端或者低端的嵌入式系统中,并且是免费的,这使其在众多GUI系统的竞争中脱颖而出,成为我们选择它的一个很重要的理由。
从MiniGUI的官方网站(http://www.minigui.org)上下载MiniGUI的源代码,在PC104的硬盘上进行编译安装,MiniGUI的官方网站上有关于这方面的文档,本文也就不再赘述了。因为MiniGUI 是以源代码的形式发布的,在硬盘上以编译的方法产生的MiniGUI的libminigui 目录下包含了这些源代码以及编译时生成的中间文件,所以需要的空间很大,是不可能将它全部安装到CompactFlash卡上的,需要的文件有:

MiniGUI的演示文件。
*  MiniGUI 的函数库,包括 libminigui、libmywins 和 libmgext 等。
*  MiniGUI 的配置文件,即 MiniGUI.cfg 文件。
*  MiniGUI 所使用的资源文件。
如果你觉得文件太大,参照下面的方法进行修改:
1. 首先可以修改编译选项,把不用的功能去掉,比如说繁体支持等。这样库会小一些。
2.去掉不需要的演示程序。
3. 去掉无用的资源,可以只保留一种字体,只保留一种输入法,删除一些位图文件。
   
至此,带图形用户界面的Linux系统已经搭建完成,可以在开发系统上写自己的基于MiniGUI的应用程序,然后将它拷贝至CompactFlash卡上运行。

2 一些补充
上面的Linux系统满足了一个系统所需的基本要求,但是针对不同的硬件环境和软件要求,还可以作出一些改进。
首先是在体积上的裁减,在本文中采用的是32MCompactFlash卡,所以这不是一个很迫切的问题,但如果是16M8M容量DOC,片内的空间可以说是寸土寸金,那就需要一些其他的方法:
* 内核编译  在编译内核时去掉不需要的功能,如网络支持等。
* uClibc     每个 Linux 系统都需要一个 C 库。C 库提供了常用的文件操作(打开、读和写)、内存管理操作(malloc 和 free)和许多其它使一个 Linux 系统名副其实的函数。大多数 Linux 系统使用 gLibc。gLibc 是成熟的、经过良好测试的,并且正在积极的开发中。遗憾的是,它使用的内存数量相对较多,容量也较大。 uClibc是一个现代的、稳定的、具有高度兼容性的 gLibc 替代品。uClibc 是针对嵌入式系统开发的,所以它力图成为完整但轻量级的 C 库。
如果系统在启动后要求登录的话,建议采用TinyLoginTinyLogin 是一套 tiny UNIX 实用程序,它用于登录嵌入式系统、接受其验证身份、为其修改密码,并能维护其用户和用户组。为了增强系统安全性它还支持影子口令。正如它的名字所暗示的,TinyLogin 非常小,对嵌入式系统上的 BusyBox 是极好的补充。

3 结束语

    在嵌入式应用的领域里,从因特网设备到专用的控制系统,Linux 操作系统的前景都很光明。所有新造的微型计算机芯片中大约有 95% 都是用于嵌入式应用的。由于 Linux 功能强大、可靠、灵活而且具有伸缩性,再加上它支持大量的微处理器体系结构、硬件设备、图形支持和通信协议,因此大大扩展了用途,使其作为许多方案和产品的软件平台越来越流行。相信在不久的将来,在许多其它的信息技术(IT)领域会出现更多的Linux产品

参考文献
* Linux bootdisk HOWTO
* LILO mini-HOWTO
* 王学龙. <<嵌入式Linux系统设计与应用>>. 清华大学出版社. 2001.8
* Darrick Addison. 嵌入式 Linux 应用:概述. IBM developerWorks网站. 2001.8
* http://www.kernel.org/
* http://www.minigui.org/
* http://www.busybox.net/

原文转自:http://www.ltesting.net