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左右。
系统启动
系统的启动顺序及相关文档仍在核心源码目录下,看以下几个文档:
./arch/ $ARCH/boot/
bootsect.s
./arch/ $ARCH/boot/setup.s
./init/main.c
bootsect.S 及 setup.S
这个程式是Linux kernel的第一个程式,包括了Linux自己的bootstrap程式,但是在说明这个程式前,必须先说明一般IBM PC开机时的动作(此处的开机是指“打开PC的电源”)。
一般PC在电源一开时,是由内存中地址FFFF:0000开始执行(这个地址一定在ROM BIOS中,ROM BIOS一般是在FEOOOh到FFFFFh中),而此处的内容则是个jump指令,jump到另一个位于ROM BIOS中的位置,开始执行一系列的动作。
紧接着系统测试码之后,控制权会转移给ROM中的启动程式(ROM bootstrap routine)。这个程式会将磁盘上的第零轨第零扇区读入内存中,至于读到内存的哪里呢? --绝对位置07C0:0000(即07C00h处),这是IBM系列PC的特性。而位于Linux开机磁盘的boot sector上的,正是Linux的bootsect程式。
把大家所熟知的MS DOS 和Linux的开机部分做个粗浅的比较。MS DOS 由位于磁盘上boot sector的boot程式负责把IO.SYS载入内存中,而IO.SYS则负有把DOS的kernel --MSDOS.SYS载入内存的重任。而Linux则是由位于boot sector 的bootsect程式负责把setup及Linux的kernel载入内存中,再将控制权交给setup。
驱动程式
在Linux系统里,设备驱动程式所提供的这组入口点由一个结构来向系统进行说明。
设备驱动程式所提供的入口点,在设备驱动程式初始化的时候向系统进行登记,以便系统在适当的时候调用。Linux系统里,通过调用register_chrdev 向系统注册字符型设备驱动程式。
在Linux里,除了直接修改系统核心的源代码,把设备驱动程式加进核心里以外,还能够把设备驱动程式作为可加载的模块,由系统管理员动态地加载他,使之成为核心的一部分。也能够由系统管理员把已加载的模块动态地卸载下来。Linux中,模块能够用C语言编写,用gcc编译成目标文档(不进行链接,作为*.o文档存在)。为此需要在gcc命令行里加上-c的参数。在成功地向系统注册了设备驱动程式后(调用register_chrdev成功后),就能够用mknod命令来把设备映射为一个特别文档。其他程式使用这个设备的时候,只要对此特别文档进行操作就行了。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




