您的位置:首页 > 运维架构 > Linux

嵌入式 Linux 应用:概述

2015-06-24 09:26 399 查看


嵌入式 Linux 应用:概述


创建引导磁盘

引导磁盘本质上是一张装有微缩的、自含式 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 程序来结束引导进程。现在:

解压缩 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/etc
mkdir 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/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
/etc/default/rcS
export VERBOSE
# Trap CTRL-C  only 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/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
echo -n "Rebooting... "
reboot -d -f -i
<!-halt---------------------------------------------->


创建新文件 halt,它包含以下内容:

清单 6. Halt 脚本


#!/bin/sh
PATH=/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)领域会出现更多!
http://www.ibm.com/developerworks/cn/linux/embed/embl/overview/index.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: