某些实时嵌入式系统需要迅速对外部事件作出响应,以完成一项特定任务。比如,嵌入一枚导弹的一个定制的微控制器在指引导弹瞄准它周围环境的一个特定目标之前,需要迅速对诸如移动目标、天气和人等的外部事件作出迅速响应。短暂的确定性响应时间是指嵌入式系统可以确定它对外部事件作出响应的时间。
配置步骤
现在让我们来看一下如何 make LEM,它是一个小型的可嵌入 Linux 分发版,既提供网络又提供 X 服务器。您可以下载该分发版,尽管它并非必需。您需要一个完全的 Linux 分发版来建立自己的嵌入式 Linux 操作系统,其中将包括您所需要的一切(实用程序、源代码、编译器、调试器和文档)。下面是能用来 make LEM 的软件列表:
TinyLogin:TinyLogin 是一套 tiny UNIX 实用程序,它用于登录嵌入式系统、接受其验证身份、为其修改密码,并能维护其用户和用户组。为了增强系统安全性它还支持影子口令。正如它的名字所暗示的,TinyLogin 非常小,对嵌入式系统上的 BusyBox 是极好的补充。
BusyBox:BusyBox 是一个多调用的二进制文件,它提供了 POSIX 式的命令和专用函数的最小子集。它适合于非常小的嵌入式系统,比如引导磁盘等等。特别用于 Debian 拯救/安装系统(它激发了对最初的 BusyBox 的开发)、Linux Routeur 方案、LEM、lineo 及其它地方。Busybox 是由 Erik Andersen 维护的。
Ash:Ash 是个非常小的 Bourne shell。
Sysvinit:Sysvinit 是 Linux 最常用的 init 包。我们将会用到 init 和 C 语言版 start-stop-daemon。
创建引导磁盘
引导磁盘本质上是一张装有微缩的、自含式 Linux 系统的软盘。它可以执行许多和完全的 Linux 系统相同的功能。下面的材料基于 Bootdisk-HOWTO(请参阅参考资料)。
第 1 步:Bios
所有的 PC 系统都是通过执行 ROM(明确地说,BIOS)中的代码从引导磁盘的 0 柱面 0 扇区加载扇区,从而开始引导过程。引导驱动器通常是第一个软盘驱动器(在 DOS 下指定为 A:,而 Linux 下指定为 /dev/fd0)。然后 BIOS 试图执行这个扇区。大多数可引导磁盘的 0 柱面 0 扇区上包括了以下两种内容中的一种:
来自加载程序,比如 LILO 的代码,该加载程序定位、加载并运行内核以开始正常引导一个操作系统,比如 Linux 的内核,的开头部分
如果 Linux 内核直接裸拷贝到磁盘、硬盘驱动器或者其它介质上,那么磁盘的第一个扇区将是 Linux 内核本身的第一个扇区。第一个扇区从引导设备上加载内核的其余部分继续引导过程。
第 2 步:引导加载程序
您可以用一个象 LILO 这样的加载程序执行引导过程。它允许开发和生产平台在同一硬件上共存,并且允许通过重新引导来实现从一个平台到另一平台的切换。LILO 引导加载程序是由 bios 加载的。然后它加载内核或者其它操作系统的引导扇区。它还提供了一个简单的命令行接口,以根据其选项交互地选择要引导的项。请参阅参考资料,获取更多关于 LILO 的信息。
第 3 步:内核
内核检查硬件并加载根设备,然后查找根文件系统的 init 程序并执行该程序。
第 4 步:Init
Init 是将要在您的 Linux 操作系统上运行的所有其它进程的父进程。它会观察其子进程,并在需要的时候启动、停止、重新启动它们。Init 从 /etc/inittab 获取所有信息。
第 5 步:Inittab
/etc/inittab 文件通过引用名为 /etc/rc... 的脚本安装系统。它还拥有 getty 工具的条目用来处理登录过程。
第 6 步:登录过程
对于每个允许用户使用的控制台,inittab 文件里都有一个 getty。getty 会启动 /bin/login 来验证用户口令。
第 7 步:创建新的分区
摘自 LFS-HOWTO(请参阅参考资料):在安装新的 Linux 系统之前,我们需要一个空的 Linux 分区来安装新系统。如果您已经有一个 Linux Native 分区可用,您就可以跳过这一步和下面一步。选择合适的硬盘(如 /dev/hda,如果您想在基本的主 IDE 磁盘上建立新的分区的话)启动 fdisk 程序(或者 cfdisk,如果您更喜欢 cfdisk 的话)。创建一个 Linux Native 分区,写入分区表并退出 (c)fdisk 程序。如果您被通知需要重新引导系统以确保分区表被更新,那么请在继续下面的步骤之前重新引导系统。
第 8 步:在新的分区上创建一个 ext2 文件系统
摘自 LFS-HOWTO(请参阅参考资料):我们用 mke2fs 命令创建一个新的 ext2 文件系统。把 $LFS 作为唯一的选项,这样文件系统就建立了。从现在起,我将把这个新建的分区称作 $EMBPART。$EMBPART 应该被换成您创建的分区。
第 9 步:加载分区
为了访问这个新建的文件系统,您必须安装它。要安装分区,您要建立一个 /mnt/hda? 目录并且在 shell 提示符下输入下列内容:
mkdir /mnt/hda?
mount $EMBPART /mnt/hda?
如果您在 /dev/hda4 建立了分区并把它安装到 /mnt/hda4 上,那么您需要返回到把文件复制到目录 $EMBPART/usr/sbin 下的那一步,并把那个文件复制到目录 /mnt/hda4/usr/bin 下。完成了第 14 步的最后一个命令后再执行这一步(复制 $EMBPART/usr/sbin 目录下的文件)。
第 10 步:填充文件系统
根文件系统必须包括支持一个完全的 Linux 系统所需的全部内容。我们将要建立一个与文件层次标准(参见参考资料)相去不远的目录结构。
第 11 步:目录
新安装的文件系统的 mkdir 命令建立了以下目录:
/proc:proc 文件系统要求的目录存根
/etc :系统配置文件
/sbin:关键的系统二进制文件
/bin :被视为系统组成部分的基本的二进制文件
/lib :提供实时支持的共享库
/mnt :维护用的安装点
/usr :附加的实用程序和应用软件
cd /mnt/hda/
mkdir bin dev home proc sbin usr boot etc liv mnt root tmp var
mkdir -p usr/bin usr/sbin usr/share usr/lib
mkdir -p etc/config etc/default etc/init.d etc/rc.boot
mkdir -p etc/rc0.d etc/rc1.d etc/rc2.d etc/rc3.d etc/rc4.d etc/rc5.d etc/rc6.d etc/rcS.d
/dev :dev 目录是执行设备输入/输出要求的存根。这个目录下的每个文件都可以用 mknod 命令建立。您可以用下面的指令从您的桌面 Linux 直接复制要求的 dev 条目以节省时间:
cp -dpR /dev /mnt
安装 TinyLogin 以及登录从属需求
TinyLogin(请参阅参考资料部分进行安装)将为您安装不足 35kb 的下列工具:
/bin/addgroup、/bin/adduser、/bin/delgroup、/bin/deluser、/bin/login、/bin/su、/sbin/getty、/sbin/sulogin 和 /usr/bin/passwd。
请参阅主要的发布文档或者手册页以获得关于这些命令的详细说明。
第 12 步:配置 TinyLogin
摘自 TinyLogin README:TinyLogin 模块化后可以帮助您只配置必需的组件从而缩小二进制长度。要关闭不想要的 TinyLogin 组件,只需编辑 tinylogin.def.h 文件并用 C++ 风格的(//)注释将您不想要的部分注释掉。
第 13 步:安装 TinyLogin
在编译完成以后,生成了一个 tinylogin.links 文件,它随后被 make install 用来为所有的内编译函数创建指向 tinylogin 二进制文件的符号连接。缺省情况下,make install 会在 pwd /_install 中放入一个符号连接林,除非您已经定义了 PREFIX 环境变量。
第 14 步:安装 Sysvinit 和 start-stop daemon
在内核加载完成后,它会运行 init 程序来结束引导进程。现在:
1.解压缩 Sysvinit 归档文件
2.进入 src 目录
3.复制 $EMBPART/sbin 目录下的 init 可执行文件
4.Sysvinit 包在 contrib 目录下也有 C 语言版的 start-stop-daemon。
5.编译
6.复制 $EMBPART/usr/sbin 下的文件
