构造嵌入式Linux
Linux自身具备一整套工具链,容易自行建立嵌入式系统的开发环境和交叉运行环境,并且可以跨越嵌入式系统开发中的仿真工具(ICE)的障碍。内核的完全开放使人们可以自己设计和开发出真正的硬实时系统,软实时系统在Linux中也容易得到实现。强大的网络支持使得可以利用Linux的网络协议栈将其开发成为嵌入式的TCP/IP网络协议栈。
Linux提供了完成嵌入功能的基本内核和所需要的所有用户界面,它是多面的。它能处理嵌入式任务和用户界面。
一个小型的嵌入式Linux系统只需要下面三个基本元素:
*引导工具
*Linux微内核,由内存管理、进程管理和事务处理构成
*初始化进程
如果要让它能干点什么且继续保持小型化,还得加上:
*硬件驱动程序
*提供所需功能的一个或更多应用程序。
再增加功能,或许需要这些:
*一个文件系统(也许在ROM或RAM)中
*TCP/IP网络堆栈
下面我们就从精简内核、系统启动、驱动程序将、X-Window换成MicroWindows四个步骤介绍嵌入式Linux的实际开发。
精简内核
构造内核的常用命令包括:makeconfig、dep、clean、mrproper、zImage、bzImage、modules、modules_install。命令说明略。
现在举个例子说明一下:
我使用的是Mandrake内附的2.2.15。我没有修改任何一行程序码,完全只靠修改组态档得到这些数据。
首先,使用makeconfig把所有可以拿掉的选项都拿得。
不要floppy;不要SMP、MTRR;不要Networking、SCSI;把所有的blockdevice移除,只留下oldIDEdevice;把所有的characterdevice移除;把所有的filesystem移除,只留下minix;不要sound支援。相信我,我己经把所有的选项都移除了。这样做之后,我的到了一个188K的核心。
还不够小吗?OK,再加上一招,请把下列两个档案中的-O3,-O2用-Os取代。
./Makefile
./arch/i386/kernel/
Makefile
这样一来,整个核心变小了9K,成为179K。
不过这个核心恐怕很难发挥Linux的功能,因此我决定把网络加回去。把General中的networksupport加回去,重新编译,核心变成189K。10K就加上个TCP/IPstack,似乎是很上算的生意。
有stack没有driver也是枉然,所以我把embeddedboard常用的RTL8139的driver加回去,195K。
如果你需要DOS档案系统,那大小成为213K。如果minix用ext2换代,则大小成长至222K。
Linux所需的内存大约在600K~800K之间。1MB内存就可能可以开机了,但不太有用,因为连载入C程序库都有困难。2MB内存应该就可以做点事了,但要到4MB以上才可以执行一个比较完整的系统。
因为Linux的filesystem相当大,大约在230K左右,占了1/3的体积。内存管理占了80K,和核心其它部分的总和差不多。TCP/IPstack占了65K,驱动程序占了120K。SysVIPC占了21K,必要的话可以拿掉,核心档应该可以再小个10K左右。
如果要裁剪核心大小,应该动那里呢?答案很明显,当然是文件系统。Linux的VFS简化了档案系统的设计,buffercache,directorycache增加了系统的效率。但这些embedded系统根本就用处不大。如果可以把它们拿掉,核心可以马上缩小20K左右。如果跳过整个VFS,直接将文件系统写成一个driver的型式,应该可以将230K缩减至50K左右。整个核心缩到100K左右。
系统启动
系统的启动顺序及相关文件仍在核心源码目录下,看以下几个文件:
./arch/$ARCH/boot/
bootsect.s
./arch/$ARCH/boot/setup.s
./init/main.c
bootsect.S及setup.S
这个程序是Linuxkernel的第一个程序,包括了Linux自己的bootstrap程序,但是在说明这个程序前,必须先说明一般IBMPC开机时的动作(此处的开机是指“打开PC的电源”)。
一般PC在电源一开时,是由内存中地址FFFF:0000开始执行(这个地址一定在ROMBIOS中,ROMBIOS一般是在FEOOOh到FFFFFh中),而此处的内容则是一个jump指令,jump到另一个位于ROMBIOS中的位置,开始执行一系列的动作。
紧接着系统测试码之后,控制权会转移给ROM中的启动程序(ROMbootstraproutine)。这个程序会将磁盘上的第零轨第零扇区读入内存中,至于读到内存的哪里呢?--绝对位置07C0:0000(即07C00h处),这是IBM系列PC的特性。而位于Linux开机磁盘的bootsector上的,正是Linux的bootsect程序。
把大家所熟知的MSDOS与Linux的开机部分做个粗浅的比较。MSDOS由位于磁盘上bootsector的boot程序负责把IO.SYS载入内存中,而IO.SYS则负有把DOS的kernel--MSDOS.SYS载入内存的重任。而Linux则是由位于bootsector的bootsect程序负责把setup及Linux的kernel载入内存中,再将控制权交给setup。
驱动程序
在Linux系统里,设备驱动程序所提供的这组入口点由一个结构来向系统进
- REDIce-Linux--灵活的实时Linux内核(11-12)
- linux文件系统基础(02-09)
- Linux标准趋向统一(11-12)
- linux基础技术(02-09)
- LINUX的目录树(02-09)
- 在Windows下启动Linux(02-09)