第 2 步:引导加载程序
第 3 步:内核
第 4 步:Init
第 5 步:Inittab
第 6 步:登录过程
第 7 步:创建新的分区
第 8 步:在新的分区上创建一个 ext2 文件系统
第 9 步:加载分区
创建引导磁盘
引导磁盘本质上是一张装有微缩的、自含式 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 varmkdir -p usr/bin usr/sbin usr/share usr/libmkdir -p etc/config etc/default etc/init.d etc/rc.bootmkdir -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 程序来结束引导进程。现在:
解压缩 Sysvinit 归档文件进入 src 目录复制 $EMBPART/sbin 目录下的 init 可执行文件
Sysvinit 包在 contrib 目录下也有 C 语言版的 start-stop-daemon。
编译复制 $EMBPART/usr/sbin 下的文件
第 15 步:配置 Sysvinit
Sysvinit 需要一个名为 inittab 的配置文件,它应该在 $EMBPART/etc 目录下。下面是 LEM 分发版中使用的配置文件:
清单 1. Inittab 配置脚本
# /etc/inittab: init(8) configuration.# $Id: inittab,v 1.6 1997/01/30 15:03:55 miquels Exp $
# Modified for LEM 2/99 by Sebastien HUET
# default rl.
id:2:initdefault:
# first except in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS
# single-user mode.
~~:S:wait:/sbin/sulogin
# /etc/init.d executes the S and K scripts upon change
# 0:halt 1:single-user 2-5:multi-user (5 may be X with xdm or other) 6:reboot.
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# CTRL-ALT-DEL pressed.
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -r now
# Action on special keypress (ALT-UpArrow).
kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."
# /sbin/mingetty invocations for runlevels.
1:2345:respawn:/sbin/getty 9600 tty1
2:23:respawn:/sbin/getty 9600 tty2
#3:23:respawn:/sbin/getty tty3 #you may add console there
#4:23:respawn:/sbin/getty tty4
第 16 步:创建初始的引导脚本
就象在 inittab 文件里看到的一样,Sysvinit 需要在它自己的目录下的一些附加脚本。
第 17 步:创建必需的目录和基础文件
用下面的命令来创建目录:
清单 2. 创建目录和基础文件的脚本
cd $EMBPART/etcmkdir rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d init.d rcS.d rc.boot
进入解压缩后的 Sysvinit 源目录
把 debian/etc/init.d/rc 复制到:$EMBART/etc/init.d
进入 $EMBPART/etc/init.d/ 目录
创建一个与 LEM 中的文件类似的新文件 rcS:
清单 3. RCS 脚本
#!/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
/etc/default/rcS
export VERBOSE
# Trap CTRL-Conly in this shell so we can interrupt subprocesses.
trap ":" 2 3 20
# Call all parts in order.
for i in /etc/rcS.d/S--*
do
[ ! -f "$i" ] && continue
case "$i" in
*.sh)
(
trap - 2 3 20
. $i start
)
;;
*)
$i start
;;
esac
done
# run the files in /etc/rc.boot
[ -d /etc/rc.boot ] && run-parts /etc/rc.boot
把可执行文件从您的分发版复制到 $EMBPART/bin。
第 18 步:添加基础脚本
这里用的许多命令是 UNIX/Linux 命令,对嵌入在 UNIX shell 脚本内部的路径进行设置、导出等操作。
清单 4. 注释行
<!-reboot---------------------------------------------->
创建一个新文件 reboot,它包含以下内容:
清单 5. Reboot 脚本
#!/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/bin
echo -n "Rebooting... "
reboot -d -f -i
<!-halt---------------------------------------------->
创建新文件 halt,它包含以下内容:
清单 6. Halt 脚本
#!/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/bin
halt -d -f -i -p
<!-mountfs---------------------------------------------->
总结
在嵌入式应用的领域里,从因特网设备到专用的控制系统,Linux 操作系统的前景都很光明。所有新造的微型计算机芯片中大约有 95% 都是用于嵌入式应用的。由于 Linux 功能强大、可靠、灵活而且具有伸缩性,再加上它支持大量的微处理器体系结构、硬件设备、图形支持和通信协议,这些都使它作为许多方案和产品的软件平台越来越流行。
由于可以公开免费得到 Linux 源代码,因此对 Linux 和它支持的软件组件的许多修改和配置也得到了不断改进,以满足采用 Linux 的市场和应用的多种需求。另外还有小型版本和实时增强版本。尽管 Linux 开始是作为 PC 体系结构的操作系统,但是现在已经有了非 X86 CPU 的版本(带或不带内存控制单元),包括 PowerPC、ARM、MIPS、68K 甚至是微控制器。但是,请注意,在不久的将来,在许多其它的信息技术(IT)领域会出现更多!
参考资料
您可以参阅本文在 developerWorks 全球站点上的英文原文.
获取完全的ETLinuxLinux 分发版。
看一下多用户、基于网络的 Linux 版本LEM。
LOAF,“Linux On A Floppy”版本, 象uLinux一样,在 386 上运行。
您还可以得到不带 MMU 的 Linux 系统和 uClinux。
ThinLinux是用于专用的相机服务器、X-10 控制器、MP3 播放器以及其它一些类似的嵌入式应用的最小化的 Linux 分发版。
RTLinux就是最早在新墨西哥理工学院开发的硬实时 Linux API。
EL/IX是基于 POSIX 的硬实时 Linux API。
TinyLogin是由 Erik Andersen 维护的,Busybox也是。
Ash是个非常小的 Bourne shell。
Sysvinit是 Linux 最常用的 init 包。我们将会用到 init 和 C 语言版的 start-stop-daemon。
请阅读LILO 文档。
要建立新的分区,在新的分区建立 ext2 文件系统,请阅读LFS-HOWTO。
了解更多关于LEM的细节,以及其它用于嵌入的专用软件。
实时 Linux是标准 Linux 操作系统的扩展。它提供了一种简单的、流畅的实时程序,它把标准 Linux 内核作为最低优先级的任务来执行。它不仅允许插入用户定义的、优先级更高的(实时)任务,还允许使用标准 Linux 成熟的服务的功能。
RTAI是一套建立在 Linux 内核修改最少的基础之上的模块(添加/修改了大约 70 行),实现了实时硬件抽象层(RTHAL),实时应用程序接口(RTAI)建立在该层上。RTAI 服务实现了内核模块级的硬实时,用户空间级的稳定实时。您也可以到rtai.org查找更多关于 RTAI 的资料。
Linux-SRT是对 Linux 的内核的扩展,改进了实时(RT)应用运行的方式。标准 Linux 的设计意图并不是成为“媒体操作系统” 因而无法保证音频、视频或者其它关键程序以固定的速度运行。
Zentropix重点介绍实时 Linux 并提供开发工具、支持、培训课程和一张经过测试的由配置管理的实时 Linux 安装 CD。
访问IBM 嵌入式 Linux 首页。
查阅IBM 的嵌入式 Linux 产品和开发人员技术支持。
浏览developerWorks,获取更多的 Linux 参考资料。
浏览developerWorks,获取更多开放源代码参考资料。