嵌入式 Linux 应用:概述
转载:http://www.ibm.com/developerworks/cn/linux/embed/embl/overview/index.html
从腕表到基于群集的超级计算机
在对嵌入式 Linux 的应用及其环境做了一番考察之后,接下来 Darrick Addison 将一步步地教您如何建立开发这些应用的软、硬件环境。
0 评论:
Darrick Addison (dtadd95@bellatlantic.net), 高级软件工程师/顾问, ASC Technologies Inc.
2001 年 8 月 01 日
- 内容
现在 Linux 广泛用于各类计算应用,不仅包括 IBM 的微型 Linux 腕表、手持设备(PDA 和蜂窝电话)、因特网装置、瘦客户机、防火墙、工业机器人和电话基础设施设备,甚至还包括了基于集群的超级计算机。让我们看一下 Linux 用作嵌入式系统需要提供哪些功能,以及它在目前可用的选择中最具吸引力的原因所在。
嵌入式系统的出现
用于控制设备的计算机,也叫做 嵌入式系统,它的历史几乎和计算机自身的历史一样长。它们最初于六十年代晚期在通讯中被用于控制机电电话交换机。由于在过去的十多年里,计算机产业不断朝着更小的系统方向发展,嵌入式系统也与之一起为这些小型机器提供了更多的功能。渐渐地,就需要把这些嵌入式系统连接到某种网络上,因而也就产生了对网络栈的要求,这提高了系统的复杂程度并要求更多的存储器和接口,还有,您猜对了,操作系统的服务。
七十年代晚期出现了用作嵌入式系统的现成的操作系统,现在有许多可行的选择方案。其中,一些主要的竞争者开始崭露头角,比如,VxWorks、pSOS、Neculeus 和 Windows CE。
在嵌入式系统中使用 Linux 的优点和缺点
虽然大多数 Linux 系统运行在 PC 平台上,但 Linux 也可以作为嵌入式系统的可靠主力。Linux 流行的“back-to-basics”方法使得它的安装和管理比 UNIX 更加简单灵活,这对于那些 UNIX 专家们来说又是一个优点,他们已经因为 Linux 中有许多命令和编程接口同传统的 UNIX 一样而赏识它了。
典型的压缩包装 Linux 系统经过打包,在拥有硬盘和大容量内存的 PC 机上运行,嵌入式系统可不要这么高的配置。一个功能完备的 Linux 内核要求大约 1 MB 内存。而 Linux 微内核只占用其中很小一部分内存,包括虚拟内存和所有核心的操作系统功能在内,只需占用 Pentium CPU 系统的 100 K 内存。只要有 500 K 的内存,一个有网络栈和基本实用程序的完全的 Linux 系统就可以在一台 8 位总线(SX)的 Intel 386 微处理器上运行的很好了。由于内存要求常常是需要的应用所决定的,比如 Web 服务器或者 SNMP 代理,Linux 系统甚至可以仅使用 256 KB ROM 和 512 KB RAM 进行工作。因此它是一个瞄准嵌入式市场的轻量级操作系统。
与传统的实时操作系统相比(RTOS),采用象嵌入式 Linux 这样的开放源码的操作系统的另外一个好处是 Linux 开发团体看来会比 RTOS 的供应商更快地支持新的 IP 协议和其它协议。例如,用于 Linux 的设备驱动程序要比用于商业操作系统的设备驱动程序多,如网络接口卡(NIC)驱动程序以及并口和串口驱动程序。
闪存
快闪 RAM 内存是大多数 Palm 设备用来存储操作系统的专用的存储器。它具有允许操作系统升级的优点,还可以用于数字式蜂窝电话、数字式照相机、LAN 交换机、PC 卡、数字式机顶盒、嵌入式控制器和其它小型设备。嵌入式系统,如嵌入式 Linux,不要求有磁盘驱动器,尽管可能使用其它的内存组织方式。因此如果,打个比方,Linux 用完了闪存,它就可以将其中一部分作为只读的文件系统来存储额外的程序和静态数据。
核心 Linux 操作系统本身的微内核体系结构相当简单。网络和文件系统以模块形式置于微内核的上层。驱动程序和其它部件可在运行时作为可加载模块编译到或者是添加到内核。这为构造定制的可嵌入系统提供了高度模块化的构件方法。而在典型情况下该系统需结合定制的驱动程序和应用程序以提供附加功能。
嵌入式系统也常常要求通用的功能,为了避免重复劳动,这些功能的实现运用了许多现成的程序和驱动程序,它们可以用于公共外设和应用。Linux 可以在外设范围广泛的多数微处理器上运行,并早已经有了现成的应用库。
Linux 用于嵌入式的因特网设备也是很合适的,原因是它支持多处理器系统,该特性使 Linux 具有了伸缩性。因而设计人员可以选择在双处理器系统上运行实时应用,提高整体的处理能力。例如,您可以在一个处理器运行 GUI,同时在另一个处理器上运行 Linux 系统。
在嵌入式系统上运行 Linux 的一个缺点是 Linux 体系提供实时性能需要添加实时软件模块。而这些模块运行的内核空间正是操作系统实现调度策略、硬件中断异常和执行程序的部分。由于这些实时软件模块是在内核空间运行的,因此代码错误可能会破坏操作系统从而影响整个系统的可靠性,这对于实时应用将是一个非常严重的弱点。
另一方面,现成的 RTOS 完全是为实时性能而设计的,它通过在由用户而非系统级进程启动时分配给某个进程以高于其它进程的优先级的方式来实现可靠性。进程在操作系统看来就是在内存里或硬盘驱动器上执行的程序。给他们指定进程 ID 或者数字标识符为的是让操作系统跟踪正在执行的程序和这些程序的相关联的优先等级。这样的方式保证了 RTOS 时间能比 Linux 提供更高的可靠性(可预见性)。但最重要的,这还是一种更加经济的选择。
不同类型的嵌入式 Linux 系统
已经有许多嵌入式 Linux 系统的示例;可以有把握地说,某种形式的 Linux 能在几乎任一台执行代码的计算机上运行。例如,ELKS(可嵌入 Linux 内核子集)方案计划在 Palm Pilot 上使用 Linux。下面列出了一些更加广为人知的小型嵌入式 Linux 版本:
ETLinux ― 设计用于在小型工业计算机,尤其是 PC/104 模块上运行的 Linux 的完全分发版。
LEM ― 运行在 386 上的小型(<8 MB)多用户、网络 Linux 版本。
LOAF― “Linux On A Floppy”分发版,运行在 386 上。
uClinux ― 在没有 MMU 的系统上运行的 Linux。目前支持 Motorola 68K、MCF5206 和 MCF5207 ColdFire 微处理器。
uLinux― 在 386 上运行的 tiny Linux 分发版。
ThinLinux ― 面向专用的照相机服务器、X-10 控制器、MP3 播放器和其它类似的嵌入式应用的最小化的 Linux 分发版。
软件和硬件要求
许多的用户接口工具和程序增强了 Linux 基本内核的多功能性。就此而论,可以把 Linux 看作是这样一个连续范围,从只有存储器管理、任务转换和定时器服务最小化的微内核一直到完整的一系列文件系统和网络服务的功能完善的服务器。
最小的嵌入式 Linux 系统仅需要三个基本元素:
- 引导实用程序
- Linux 微内核,由内存管理、进程管理和定时服务构成
- 初始化过程
要实现最低限度的工作能力,您还需要添加:
- 硬件驱动程序
- 一个或多个应用进程,以提供所需功能
随着要求的增加,您可能还需要:
- 一个文件系统(可能是在 ROM 或者是 RAM 里)
- TCP/IP 网络栈
- 储存半瞬态数据和提供交换空间的磁盘
- 32 位内置 CPU(所有完全的 Linux 系统都需要)
相关的硬件方案
下面是一些现有的为 Linux 操作系统定制的嵌入式硬件方案。
PLEB:带有 ARM SA-1100 / ArmLinux Ucsimm / Uclinux Flash EPROM 的袖珍 Linux 嵌入式机器。
Linux Lab: Linux Lab 方案旨在帮助人们开发 Linux 数据采集和过程控制软件。它计划提供从硬件支持到应用开发的广阔范围内应用的标准化开发环境。
控制器域网:Linux GPIB 的控制器域网(CAN)总线驱动程序;Linux GPIB 包是一个对普通 GPIB(IEEE 488.1) 硬件的支持包。驱动程序支持 National Instruments AT-GPIB、TNT488.2 以及 PCII 和 PCIIa 板。这个包里有完整的开发环境,包括测试和配置工具、库以及对 tcl 和 python 语言的支持。
硬件平台选项
挑选最佳硬件的过程会相当复杂,问题起源于公司内部政策、成见、其它方案的遗留问题、缺乏全面的或者精确的信息以及成本 ― 需考虑总的产品成本,而不仅仅是 CPU 本身。有时,一旦把 CPU 使用其它外围设备所必需的总线逻辑和延迟时间考虑在内,那么快速而廉价的 CPU 也可能变得昂贵。要计算任意给定的项目所需的 CPU 速度,首先要现实地看看为了完成一个给定的任务 CPU 得运行多快然后再乘以三。还要确定总线需要运行多快。如果还有二级总线,比如 PCI 总线,那么将它们也考虑在内。一条慢的总线(即一条被 DMA 通信阻塞的总线)将会显著降低高速 CPU 的速度。下面是一些嵌入式 Linux 应用的最佳硬件解决方案。
Bright Star Engineering:Bright Star Engineering 的 ipEngine-1 是支持嵌入式 Linux 的信用卡大小的单片机。它利用了基于 PowerPC 的 CPU,并提供了一组板上外设,有 Ethernet、LCD/视频控制器、USB、串口 I/O 以及一个 16K 门的可由用户配置的 FPGA。BSE 的嵌入式 Linux 配置允许 Linux 从 ipEngine 的板上 4MB 闪存中引导。
Calibri:CalibriTM-133 是将嵌入式 Linux 作为其操作系统来使用的网络设备,它方便使用、紧凑,并且可以用于多种用途。它为防火墙、VPN 和路由要求提供了一种高效、低成本的解决方案。
EmbeddedPlanet:EmbeddedPlanet 创造了后 PC 时代的计算机,它出现时就装有 MontaVista 的 HardHat Linux。由基于 PowerPC 的计算引擎和匹配的 I/O 卡驱动,Linux Planet 装在一个彩色的透明盒子里并且带有触摸屏,还可以访问数字及模拟 I/O。
Eurotech:Eurotech 提供了嵌入式 PC SBC 并资助了 ET-Linux,一个为在小型工业计算机上运行而专门设计的基于 glibc 2.1.2 的完全的 Linux 系统。
Microprocess Ingenierie:Microprocess 为产业和嵌入式市场开发、生产以及销售标准的和定制的产品。Microprocess 在实时软件方面活动范围遍及全球,并具有系统集成的专业知识。它的产品,比如 740 PowerPC compactPCI 板可以与标准的 Linux 分发版或者嵌入式 Linux 版本一起订购。
Moreton Bay:Moreton Bay 发布基于 Linux 的 Internet 路由器,其范围在 NETtel 2520 和 NETtel 2500 之间。这些小型的、易于连接的智能路由器解决方案设计旨在为平面网络提供简便、安全和价格适中的外部网友好的虚拟私有网络(VPN)。NETtel 路由器系列运行的是嵌入式 Linux 内核。现有一套开发工具能够把定制代码存在闪存中并在 NETtel 内部执行。代码可能含有特定的加密或者身份验证协议,或者在 NETtel 被用作远程控制设备代码时,会含有一些本地监视脚本。
Matrix Orbital:这是个可选的、但不是推荐的附加项。Matrix Orbital 生产的一系列串行 LCD 和 VFD 被许多 Linux 用户添加到了他们的嵌入式系统中。这条生产线的范围包括了 8x2 到 40x4 的字符 LCDs、20x2 和 20x4 的 VFD 加上 240x64 图形 LC(128x128 还在生产之中)。运用显示器的通信不是通过 RS232 就是通过 I2C 实现的,两者都是其所有模块上的标准。模块的 BIOS 中包含一个全面的命令集。
实时嵌入式 Linux 应用
有关嵌入式系统最重要的事务之一就是要求有一个实时操作系统。这里实时有好几种定义。对有些人来说,实时意味着在 1 微秒的时间内对事件作出反应,但对另外一些人来说,那就可能是 50 毫秒了。实时的硬度也各不相同。一些系统需要硬实时响应,在很短的时间内对事件作出确定性响应。但是,当我们对许多系统进行仔细分析时,我们发现事实上对响应时间的要求只是接近实时。实时的要求常常是时间和缓冲空间的折衷。随着内存越来越便宜,CPU 速度越来越快,现在接近实时比硬实时更加常见,许多商用的所谓实时操作系统远非硬实时。通常情况下,当您进入这些系统的详细设计部分时,就需提高警惕必须非常仔细地设计驱动器的中断和应用以满足实时要求。
RT-Linux(实时扩展的 Linux 系统)里含有时间紧要的函数可以用中断管理器来精确控制中断处理,从而很好地确保了关键性中断可以在需要时得到执行。这种方法的硬度主要取决于 CPU 中断结构和环境转换的硬件支持。这种方法可以满足广泛范围内的实时要求。即使没有实时扩展,Linux 也能很好地处理多个事件流。例如,运行于低端 Pentium 上的 Linux PC 系统能让多个 10BaseT 接口有效地执行,同时又以全速的 56KBPS 运行字符级串口,而不会丢失任何数据。
值得考虑的实时硬件和软件 Linux API 有 RTLinux、RTAI、EL 和 Linux-SRT。RTLinux 是一个最初在新墨西哥理工学院开发的硬实时 Linux API。RTAI(DIAPM)是由 Polytechnic Politecnico di Milano(DIAPM)航天工程部的程序员们开发的 RTLinux 实时 API 的副产品。EL/IX 是一个计划中的基于 POSIX 硬实时 Linux API,由 Red Hat 发起。Linux-SRT 是个实时 API 的软实时替代品,它可以使所有的 Linux 程序无需修改或者重新编译即可增强性能。
请参阅本文后面的 参考资料部分,查找有关前面内容的资料和一些 Web 站点,那里提供了用于不同类型的标准 Linux 操作系统的软件扩展、开发工具、支持以及培训课程。
短暂的确定性响应时间
某些实时嵌入式系统需要迅速对外部事件作出响应,以完成一项特定任务。比如,嵌入一枚导弹的一个定制的微控制器在指引导弹瞄准它周围环境的一个特定目标之前,需要迅速对诸如移动目标、天气和人等的外部事件作出迅速响应。短暂的确定性响应时间是指嵌入式系统可以确定它对外部事件作出响应的时间。
配置步骤
现在让我们来看一下如何 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 程序来结束引导进程。现在:
- 解压缩 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)领域会出现更多!
参考资料
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文.
- 获取完全的 ETLinux Linux 分发版。
- 看一下多用户、基于网络的 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。
- Ash 是个非常小的 Bourne shell。
- Sysvinit 是 Linux 最常用的 init 包。我们将会用到 init 和 C 语言版的 start-stop-daemon。
- 请阅读 LILO 文档。
- 要建立新的分区,在新的分区建立 ext2 文件系统,请阅读 LFS-HOWTO。
- 实时 Linux 是标准 Linux 操作系统的扩展。它提供了一种简单的、流畅的实时程序,它把标准 Linux 内核作为最低优先级的任务来执行。它不仅允许插入用户定义的、优先级更高的(实时)任务,还允许使用标准 Linux 成熟的服务的功能。
- RTAI 是一套建立在 Linux 内核修改最少的基础之上的模块(添加/修改了大约 70 行),实现了实时硬件抽象层(RTHAL),实时应用程序接口(RTAI)建立在该层上。RTAI 服务实现了内核模块级的硬实时,用户空间级的稳定实时。您也可以到 rtai.org 查找更多关于 RTAI 的资料。
- Zentropix 重点介绍实时 Linux 并提供开发工具、支持、培训课程和一张经过测试的由配置管理的实时 Linux 安装 CD。
- 访问 IBM 嵌入式 Linux 首页。
- 查阅 IBM 的嵌入式 Linux 产品和开发人员技术支持。
- 浏览 developerWorks, 获取更多的 Linux 参考资料。
- 浏览 developerWorks, 获取更多开放源代码参考资料。
嵌入式 Linux 应用:概述的更多相关文章
- 嵌入式linux的网络编程(1)--TCP/IP协议概述
嵌入式linux的网络编程(1)--TCP/IP协议概述 1.OSI参考模型及TCP/IP参考模型 通信协议用于协调不同网络设备之间的信息交换,它们建立了设备之间互相识别的信息机制.大家一定都听说过著 ...
- Linux开源模块迁移概述暨交叉编译跨平台移植总结--从《嵌入式Linux驱动模板简洁和工程实践》
本文摘录<嵌入式Linux驱动模板简洁和工程实践>一本书"开发和调试技术". Linux强大的是,有那么多的开源项目可以使用.通常非常需要可以通过寻找相关的源模块被定义 ...
- 《嵌入式Linux基础教程学习笔记一》
常用书目下载地址:http://www.cnblogs.com/pengdonglin137/p/3688029.html 第二章 1.进程上下文和中断上下文(Page20) 当应用程序执行系统调用, ...
- 【分享】4412开发板-嵌入式Linux开发须要掌握的基础知识和技能
本文转自迅为电子论坛:http://www.topeetboard.com 1.Linux 基础 安装Linux操作系统 Linux文件系统 Linux经常使用命令 Linux启动过程具体解释 熟悉L ...
- 【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)
深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系 ...
- 《嵌入式Linux开发实用教程》
<嵌入式Linux开发实用教程> 基本信息 作者: 朱兆祺 李强 袁晋蓉 出版社:人民邮电出版社 ISBN:9787115334831 上架时间:2014-2-13 出版日期: ...
- 《嵌入式linux应用程序开发标准教程》笔记——6.文件IO编程
前段时间看APUE,确实比较详细,不过过于详细了,当成工具书倒是比较合适,还是读一读这种培训机构的书籍,进度会比较快,遇到问题时再回去翻翻APUE,这样的效率可能更高一些. <嵌入式linux应 ...
- 嵌入式LINUX基础教程 第2版
嵌入式LINUX基础教程 第2版 目录 第1章 入门 11.1 为什么选择Linux 11.2 嵌入式Linux现状 21.3 开源和GPL 21.4 标准及相关组织 31.4.1 Linux标准基 ...
- CH02基于ZYNQ的嵌入式LINUX移植
CH02基于ZYNQ的嵌入式LINUX移植 1.1概述 实验环境: Windows 10 专业版 Vmware workstation 14.1.1 Ubuntu 16.04.3 Xilinx SDx ...
随机推荐
- (转载)OC学习篇之---概述
前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲 ...
- java集合框架复习
数组类Array是java中最基本的一个存储结构,它用于存储 一组连续的对象或一组类型相同的基本类型的数据. Array特点:效率高,但容量固定且无法动态改变, 缺点:无法判断其中存有多少元素,len ...
- Fast Intro To Java Programming (2)
Java局部变量 局部变量声明在方法.构造方法或者语句块中: 局部变量在方法.构造方法.或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁: 访问修饰符不能用于局部变量: 局部变量只在声明它 ...
- 第二百八十六天 how can I 坚持
bug不断啊,头疼. 今天早上到的倒是挺早. 中午吃的黄焖鸡,晚上加了会班. 勇江的鱼都死了,杨建的还剩3条,晚上到家都快十点了,还洗了衣服,没捞出来呢, 希望可以请下来假吧. 晾上衣服睡觉.
- awk的二维数组
awk是不支持二维数组的,它的底层是一维数组,将两个key拼接为一维数组的key. 如下是其初始化和遍历 awk 'BEGIN{ for(i=0;i< 3; ++i) for(j = 0; j ...
- jstat用法
jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具.它可以显示本地或者远程虚拟机进程中的类装载.内存.垃圾收集.JIT编译等运行数据 ...
- 怎样提交FIREDAC数据集的DELTA到中间件然后保存进数据库
你可以在客户端序列FireDAC数据集的DELTA , 将序列后的STREAM发送给中间件, 中间件的TFDQuery或TFDMemTable调用LOADFROMSTREAM()方法加载流, 然后调用 ...
- [iOS基础控件 - 6.12.2] Modal
A.概念 1.也可以用来切换控制器 2.如ActionSheet 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展示出来 Modal的默认效果 ...
- [iOS基础控件 - 6.10.2] PickerView 自定义row内容 国家选择Demo
A.需求 1.自定义一个UIView和xib,包含国家名和国旗显示 2.学习row的重用 B.实现步骤 1.准备plist文件和国旗图片 2.创建模型 // // Flag.h // Co ...
- CoordinatorLayout的简单应用(材料设计新控件)
CoordinatorLayout字面意思为:协调布局,一般作为根布局使用.关于这个布局,记录一下两个用法,备忘. 一.配合 FloatingActionBar 使用 <?xml version ...