档案系统的起承转合
基本上,嵌入式Linux核心若有一个根目录档案系统可挂载,则Linux整个系统即可正常运作。但这个根目录档案系统若是使用Ramdisk的方式,亦即利用SPI-Flash里面所储存的initrd.gz这一映像档来挂载,则档案系统通常不大。以本系统为例,Ramdisk最多可扩充到4~5 MBytes左右,而以这种容量大小是绝对不敷使用的。因此本系统的做法是把Ramdisk精简化,只保留挂载USB随身碟的功能。当档案系统转换到USB随身碟后,档案系统即可依实际需要任意扩充。其挂载过程请参考图6所示。
目前Ramdisk是使用Ext2档案系统,大小约为300 KBytes,其最主要的档案是放在/sbin这一目录里面的init。在前篇文章提过,init将会是整个Linux系统的第一个行程(Process),但由于我们主要的档案系统会由USB随身碟里面的rimg这一映像档来担任,因此init会先改写成Script file的形式,待整个档案系统移转到USB随身碟里的rimg后,再执行真正的init去开启第一个行程。init这一Script file所做的工作如下所示:
上述第三行指令所做的工作即是挂载USB随身碟到系统里,挂载完之后将可看到里面有一个文件名称为rimg,此一档案即是系统最终的根目录档案系统。因此第六行指令所做的工作,就是继续挂载rimg到系统里。然后在第九及十行以pivot_root和chroot这两个指令,去转换整个根目录档案系统到rimg。而最后的动作则是执行真正的init去启动第一个Process,并由其继续完成系统的初始化工作。
rimg的制作方式
rimg其实是root filesystem image的简要缩写,前面讲述了从Linux核心一路转换到rimg的过程。而若要使用rimg这一档案系统映像文件,则我们必须另外在PC系统制作出来后,才能放入USB随身碟,并交由系统挂载。下面的指令是在Linux Fedora 4的PC系统上执行,制作出来的rimg将会是空的,就像是一个256 MBytes的储存系统刚做完格式化一样。
在完成上述两项指令后,系统将出现一个256 Mbytes的档案,档名为rimg。但此时的rimg并不只是一个档案,而是已经成为Ext3档案系统的映像文件了。因此我们必须将此映像文件展开,并且把系统真正的内容放到rimg里面。由于本系统使用的是x86兼容的CPU,因此档案系统的内容可以很轻易地由PC系统复制过来使用,而不需经过程序移植以及重新编译等过程。目前Linux Live-CD非常盛行,因此把Live-CD里已制作好的内容搬移至rimg里面,将是一种非常方便的选择。下面的指令是以某Linux Live-CD的内容为一范例,说明如何将已制作好的内容复制到rimg里。
X-Window的启动流程
当rimg挂载完成并且开始执行init后,init将会开始一连串系统的初始化工作。首先它会去参考/etc/inittab这一档案的设定,并且依照设定的内容去执行一个称为rc.sysinit的script file。为了说明系统原理,我们把/etc/inittab的内容简化如下所示:
上述第一行即是告诉init去执行/etc/rc.d/rc.sysinit这一script file。当执行完rc.sysinit后,系统将完成Keyboard、Mouse以及LAN等设定的工作。之后,系统会开启一个TTY console,并且执行autologinroot这一执行档。此一执行档会自动以root权限登入系统,并且执行/etc/profile。透过/etc/profile,系统将会继续去设定一些应用程序和函式库的路径,并且启动X-Window。本系统/etc/profile的最后一行将会执行/root/.rdc_xwin,借着此一script file,X-Window将会被执行起来。.rdc_xwin的内容如下所示:
上述指令主要是设定xinit去启动X-Server和X-Client。X-Server由于是以Xorg为主,因此其config檔是使用 /etc/X11/xorg.conf这一档案。而X-Client的部分则是执行上述指令所指定的 /root/.xinitrc。其关系如图7所示:
X-Server主要是负责键盘和鼠标的侦测,也就是当使用者移动鼠标或透过键盘输入字符时,X-Server将负责接收这些信息,并传送到X-Client端。另外X-Server也负责接收由X-Client送过来的画面,并且透过VGA卡显示到使用者的屏幕。本文系统所使用的X-Server是使用xorg的链接库和执行档,它们皆放在/usr/X11R6这一目录里,其中/usr/X11R6/bin/X这一连结档已指向xorg。通常VGA显示卡可用VESA模式显示,但若有原厂的驱动程序,则显示的效能应该可以更加提升。由于本文系统的VGA显示卡是使用XGI-Z9,其驱动程序放在/usr/X11R6/lib/modules/drivers这一目录里,文件名为xgiz_drv.o。因此我们在/etc/X11/xorg.conf的驱动程序做了以下的设定:
X-Client其实就是一些应用程序,而会放到/root/.xinitrc里去执行的,通常是负责启动X-Window的部分。例如设定桌面背景图档、启动Window Manager等等。本文系统所使用的是一个轻量级的Window Manager,名称为IceWM。关于IceWM的套件安装,请参考IceWM的网站。为了简化说明X-Client,我们把启动流程简化如下所示。透过xinit启动X-Server和X-Client之后,Linux系统将会出现一个X-Window的桌面环境。
系统桌面展示
嵌入式系统通常在开发板上都有固定的Flash、SDRAM以及几个特定的外围IC所组成。而本文系统试图跳脱原本的限制,利用目前市面上最经济实用的USB随身碟来大幅扩充储存系统,以及增加PCI的VGA显示卡来让使用者有一个LCD屏幕可使用。在USB随身碟的使用上,主要是在档案系统的转换过程;而VGA显示卡的使用,则着重在X-Window的几个启动流程。当档案系统顺利移转到USB随身碟,并且利用VGA的驱动程序顺利让X-Window启动后,一台低价计算机的雏型即可出现。剩余的工作即是充实档案系统里的应用程序,使整各系统的应用更加丰富。图8是本系统的X-Window使用者桌面,图9则是执行网络浏缆器的画面。
结语
当一个x86嵌入式系统增加了使用者的输入输出接口后,其实就像一台简易型的PC系统。本文系统是以x86 SOC为发展平台,但由于使用RedBoot Loader去启动系统,因此仍保有嵌入式系统的特性,但又因为有USB Host与PCI Bus可扩充,因此可以很轻易地只靠一些设定,即可让一个Linux系统执行得像PC系统一样。Linux低价计算机其实只是众多应用之一,基于这样的Linux系统的应用,其实充满各种可能性。例如交互式信息系统(KIOSK)、Thin-Client、计算机运算分享器、远程联机POS机、餐厅点菜机、广告机、上网机以及CAI儿童教育计算机……等,都是极具发展潜力的领域。x86 SOC有着低功耗与低成本等优势,而目前其整合度与运算效能仍持续提升当中,相信以x86 SOC为主的新应用将不断地推陈出新。使用者也许感受不到产品正在使用什么CPU,但以x86 SOC为主的嵌入式系统,正逐渐进入我们的生活之中。