Linux自身具备一整套工具链,容易自行建立嵌入式系统的开发环境和交叉运行环境,并且可以跨越嵌入式系统开发中的仿真工具(ICE)的障碍。内核的完全开放使人们可以自己设计和开发出真正的硬实时系统,软实时系统在Linux中也容易得到实现。强大的网络支持使得可以利用Linux的网络协议栈将其开发成为嵌入式的TCP/IP网络协议栈。 Linux提供了完成嵌入功能的基本内核和所需要的所有用户界面,它是多面的。它能处理嵌入式任务和用户界面。 一个小型的嵌入式Linux系统只需要下面三个基本元素: * 引导工具 * Linux微内核,由内存管理、进程管理和事务处理构成 * 初始化进程 如果要让它能干点什么且继续保持小型化,还得加上: * 硬件驱动程序 * 提供所需功能的一个或更多应用程序。 再增加功能,或许需要这些: * 一个文件系统(也许在ROM或RAM)中 * TCP/IP网络堆栈 下面我们就从精简内核、系统启动、驱动程序将、X-Window换成MicroWindows四个步骤介绍嵌入式Linux的实际开发。 精简内核 构造内核的常用命令包括:make config、dep、clean、mrproper、zImage、bzImage、modules、modules_install。命令说明略。 现在举个例子说明一下: 我使用的是 Mandrake内附的 2.2.15。我没有修改任何一行程序码,完全只靠修改组态档得到这些数据。 首先,使用 make config 把所有可以拿掉的选项都拿得。 不要 floppy;不要SMP、MTRR;不要 Networking、SCSI;把所有的 block device 移除,只留下 old IDE device;把所有的 character device 移除;把所有的 filesystem 移除,只留下 minix;不要 sound 支援。相信我,我己经把所有的选项都移除了。这样做之后,我得到了一个 188K 的核心。 还不够小吗? OK,再加上一招,请把下列两个档案中的 -O3,-O2 用 -Os 取代。 ./Makefile ./arch/i386/kernel/ Makefile 这样一来,整个核心变小了 9K,成为 179K。 不过这个核心恐怕很难发挥 Linux 的功能,因此我决定把网络加回去。把General中的 network support 加回去,重新编译,核心变成 189 K。10K就加上个 TCP/IP stack,似乎是很上算的生意。 有stack没有driver也是枉然,所以我把 embedded board常用的RTL8139的driver加回去,195K。 如果你需要 DOS 档案系统,那大小成为 213K。如果 minix 用 ext2 换代,则大小成长至 222K。 Linux所需的内存大约在600K~800K之间。1MB内存就可能可以开机了,但不太有用,因为连载入C程序库都有困难。2MB内存应该就可以做点事了,但要到 4MB以上才可以执行一个比较完整的系统。 因为Linux 的filesystem 相当大,大约在 230K 左右,占了 1/3 的体积。内存管理占了80K,和核心其它部分的总和差不多。TCP/IP stack 占了65K,驱动程序占了120K。SysV IPC占了 21K,必要的话可以拿掉,核心档应该可以再小个10K左右。 如果要裁剪核心大小,应该动那里呢? 答案很明显,当然是文件系统。Linux 的 VFS简化了档案系统的设计,buffer cache, directory cache增加了系统的效率。但这些embedded系统根本就用处不大。如果可以把它们拿掉,核心可以马上缩小 20K 左右。如果跳过整个 VFS,直接将文件系统写成一个 driver 的型式,应该可以将 230K缩减至50K左右。整个核心缩到100K左右。 |