在1991 年Linux 诞生以前,嵌入式系统和嵌入式操作系统(如VxWorks、pSOS、Lynux、Neculeus)已经得到了广泛的应用,而Linux基于GPL 开放源代码授权模式、易于定制,可以方便地裁剪和移植,与多样的嵌入式系统堪称天作之合。所以伴随着自身的完善,Linux 从最初的面向桌面PC和小型服务器,迅速应用和普及到各种不同的嵌入式平台和应用环境,在电信设备、交换机、路由器、移动终端、智能手机、汽车电子、工业控制、数码电视、机顶盒、娱乐设备等领域得到了广泛的应用,成为Linux 的一个重要分支,而自成一个嵌入式Linux大家族。嵌入式Linux在2005年的市场总额已经超过1亿美元,而且在2010年以前都将保持快速显著增长的势头。目前大多数新型的嵌入式系统,尤其是基于SoC快速成型的系统,都会给出基于Linux操作系统的软件解决方案, 而早期的嵌入式操作系统,也大都实现了基于POSIX标准的API级兼容。
开放、灵活、应用广泛的家族
开放、灵活和应用广泛,嵌入式Linux的这几大特点,很大程度上是从Linux 继承而来。Linux开放源代码,而且代码层次结构清楚,很容易阅读、裁剪和维护。虽然Linux本身不是完全的微内核操作系统,但是可以通过menuconfig、xconfig等方便的裁剪和配置内核,也可以开放的对内核进行实时性、最小化改造。同时,Linux对每一个外围的物理设备, 统一抽象定义为字符设备、块设备或者网络接口,可以按照规范开发驱动程序,加载成一个模块而装入内核中,通过虚拟文件系统(VFS)等方便的管理和维护。这样, 可以快捷而低成本的设计出正好满足特定嵌入式系统需求的操作系统。同时,GNU 为Linux 配备了一整套工具链,可以很容易地自行建立嵌入式系统的开发环境、交叉编译环境和交叉运行调试环境。而Linux 各种版本大都在不同程度上符合IEEE POSIX 标准,使应用程序具有较好的可移植性。
嵌入式Linux 可以很方便的定制一套完整的工具链(toolchain),利用GNU 的gcc做编译器,用gdb、kgdb、xgdb做调试工具,能够实现从操作系统到应用软件各个级别的开发和调试。
开源、开放的家族产品:uClinux 和RTLinux
从普通的Linux到嵌入式Linux,有两个方面必须认真的考虑:精悍可靠,必须足够小,同时足够稳定;机敏实时,必须有足够的实时响应,以满足大部分嵌入式系统高实时性的要求。uClinux 和RTLinux在这两个方面做了经典的探索,是嵌入式Linux家族中极其具有代表性的两个产品。
◆ uCLinux(http://www.uclinux.org)
uClinux 是一个完全符合GNU/GPL 公约的项目, 完全开放代码, 专门针对没有MMU的CPU,或者不使用CPU的MMU(很多嵌入式系统的CPU不使用MMU,或者存储简单而不必使用MMU),并且针对嵌入式系统做了许多代码和运行时小型化的工作。uClinux与标准Linux的架构完全一致, 最大区别就在于内存管理,即因为不能使用MMU,而不能使用处理器的虚拟内存管理技术,所以采用存储器分页管理,采用实存储(real memeory)管理策略,对于内存直接访问,对内存空间没有保护,各个进程实际上共享一个运行空间,而开发人员可以访问任意的地址空间。
◆ RTLinux-Real-Time Linux
RTLinux最初是美国墨西哥理工学院的一个嵌入式实时Linux操作系统的科研项目,在于将当时采用分时机制的Linux 改造成具有实时性的操作系统。RT-Linux 没有重写Linux的内核,而是利用内核模块机制,采用插入模块的方式加载了一个RTLinux内核,把原来的Linux内核作为实时核心的一个低优先级的进程,同用户的实时进程一起调度。普通Linux 内核中的进程可以通过FIFO 和实时内核的进程进行通信。这样对Linux内核的改动非常小,并且充分利用了普通Linux内核的资源,可以直接运行软件。
开放、灵活、应用广泛的家族
开放、灵活和应用广泛,嵌入式Linux的这几大特点,很大程度上是从Linux 继承而来。Linux开放源代码,而且代码层次结构清楚,很容易阅读、裁剪和维护。虽然Linux本身不是完全的微内核操作系统,但是可以通过menuconfig、xconfig等方便的裁剪和配置内核,也可以开放的对内核进行实时性、最小化改造。同时,Linux对每一个外围的物理设备, 统一抽象定义为字符设备、块设备或者网络接口,可以按照规范开发驱动程序,加载成一个模块而装入内核中,通过虚拟文件系统(VFS)等方便的管理和维护。这样, 可以快捷而低成本的设计出正好满足特定嵌入式系统需求的操作系统。同时,GNU 为Linux 配备了一整套工具链,可以很容易地自行建立嵌入式系统的开发环境、交叉编译环境和交叉运行调试环境。而Linux 各种版本大都在不同程度上符合IEEE POSIX 标准,使应用程序具有较好的可移植性。
嵌入式Linux 可以很方便的定制一套完整的工具链(toolchain),利用GNU 的gcc做编译器,用gdb、kgdb、xgdb做调试工具,能够实现从操作系统到应用软件各个级别的开发和调试。
开源、开放的家族产品:uClinux 和RTLinux
从普通的Linux到嵌入式Linux,有两个方面必须认真的考虑:精悍可靠,必须足够小,同时足够稳定;机敏实时,必须有足够的实时响应,以满足大部分嵌入式系统高实时性的要求。uClinux 和RTLinux在这两个方面做了经典的探索,是嵌入式Linux家族中极其具有代表性的两个产品。
◆ uCLinux(http://www.uclinux.org)
uClinux 是一个完全符合GNU/GPL 公约的项目, 完全开放代码, 专门针对没有MMU的CPU,或者不使用CPU的MMU(很多嵌入式系统的CPU不使用MMU,或者存储简单而不必使用MMU),并且针对嵌入式系统做了许多代码和运行时小型化的工作。uClinux与标准Linux的架构完全一致, 最大区别就在于内存管理,即因为不能使用MMU,而不能使用处理器的虚拟内存管理技术,所以采用存储器分页管理,采用实存储(real memeory)管理策略,对于内存直接访问,对内存空间没有保护,各个进程实际上共享一个运行空间,而开发人员可以访问任意的地址空间。
◆ RTLinux-Real-Time Linux
RTLinux最初是美国墨西哥理工学院的一个嵌入式实时Linux操作系统的科研项目,在于将当时采用分时机制的Linux 改造成具有实时性的操作系统。RT-Linux 没有重写Linux的内核,而是利用内核模块机制,采用插入模块的方式加载了一个RTLinux内核,把原来的Linux内核作为实时核心的一个低优先级的进程,同用户的实时进程一起调度。普通Linux 内核中的进程可以通过FIFO 和实时内核的进程进行通信。这样对Linux内核的改动非常小,并且充分利用了普通Linux内核的资源,可以直接运行软件。
优秀的家族商业产品:MontaVista Linux
在操作系统大小和系统实时嵌入式Linux 家族回顾与前瞻性方面,许多公司也参与其中进行改造,推出了高稳定性、高实时性的商业嵌入式操作系统产品。目前这些产品已经广泛的使用于手机、汽车、电信、网络设备及消费电子产品, 以及航空航天和军事领域。其中MontaVista Linux 是其中的佼佼者。
◆ MontaVista Linux(http://www.mvista.com)
MontaVista Linux是MontaVista Software于1999 年开始推出的,专门面向嵌入式系统的商业级操作系统。目前最新版本的MontaVista Linux 专业版4.0(Pro 4.0),基于Linux内核2.6,采用可抢占内核技术,集合了MontaVista硬实时技术,性能远远高于标准2.6内核,具有更短的抢占延迟,反映速度是标准内核的200倍;采用优先级线程实现中断服务程序的调度,提供三种选择模式进行实时性的配置,O(1)调度实现固定优先级实时调度,实现微秒级时钟分辨率(HRT),高速实时域(FRD,Fast RealtimeDomain);同时支持多线程、多进程、多处理器,本地POSIX线程库为内核的组件更好实现了对POSIX 兼容性;内建内存保护机制有效阻止运行错误,虚拟内存过渡使用机制防止内存溢出,并且提供了很多增强的I/O支持和设备的支持,支持32/64位处理器;基于升级的Eclipse和CDT,设计实现了MontaVista DevRocket (TM)开发环境,支持高性能多线程设计并且改进了调试功能。
与Linux 家族兼容的产品:VxWorks 和LynxOS
已经有一些嵌入式操作系统产品,并非从Linux裁剪或者改造而来,但是已经基本实现POSIX 兼容,在接口级与嵌入式Linux系列产品达成一致。这些产品具有优良的传统和特定的实时性、可靠性实现,在嵌入式操作系统中具有重要地位。
◆ VxWorks(http://www.windriver.com/)
VxWorks 操作系统是美国WindRiver 公司于1983年设计开发的一种嵌入式实时操作系统,具有良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据最重要的一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。VxWorks具备一个高效的微内核,支持实时系统的多任务,中断支持,任务抢占式调度和循环调度。微内核设计使VxWorks缩减了系统开销,并加速了对外部事件的反应,内核的运行非常快速和确定。
◆ LynxOS(http://www.lynuxworks.com/)LynxOS作为LynuxWorks公司的核心产品,是一个强实时的嵌入式操作系统,1988年发布了第一个版本,现在已经成为完全可抢占和可重入的,使用于高可靠性场合的商业嵌入式操作系统。LynxOS的高度模块化是其具有很强的可扩展性而且易于配置,能够适用从大规模复杂系统到小嵌入式控制器的需求。
面向应用量身定做嵌入式Linux
嵌入式系统的软件和硬件往往只需针对某种特别的应用定制,因此嵌入式操作系统需要量体裁衣,除去冗余,同时尽可能发挥系统的潜力。
Linux最初目标是一个通用的操作系统,因此必须对其进行面向嵌入式系统和应用环境的改造,以适应嵌入式系统的特殊要求。一个可用的嵌入式Linux 系统包括内核和应用程序两部分。内核为应用程序提供一个虚拟的硬件平台,以统一的方式对资源进行访问,并且透明地支持多任务。嵌入式Linux 内核可以分为六部分:进程调度,内存管理,文件系统,进程间通信,网络,设备驱动。应用程序负责系统的部分初始化,基本的人机界面,必要的命令等内容。裁剪或者普通的Linux以适应嵌入式系统并不是特别复杂的事情,除了实现和定制上面的这些内容,在以下几个方面也应该倍加注意,可以更加贴近应用而事半功倍。
快速启动,减少Linux 启动的繁文缛节
Linux系统的启动过程主要为引导程序的初始化、内核加载、系统初始化、启动对应运行级别的守护进程及建立终端。首先,可以对内核进行优化,根据嵌入式系统的特性,去掉对不会使用的硬件的支持,去掉一些不必要的初始化和初始状态检查,去掉对不会使用到的操作系统调用的支持。对内核裁剪缩小内核大小,也缩短了加载时间。
其次,还可以把一些服务并行启动,但是这样要理清楚必需的服务之间的依赖的关系。Linux没有把这些依赖关系完全显式地表示出来,但是可以通过分析配置文件和部分启动部分的源代码得到一个确定的服务启动顺序和关系,这样就可以把不相互的服务并行启动,相互依赖的服务分层次启动。甚至某些服务不随系统启动,需要使用时再启动。
使用Ramdisk,建立内存中的虚拟分区
为了提高嵌入式系统中外设的访问速度,Ramdisk是一项实用而已经被Linux内核支持的技术。一个Ramdisk就是一个内存快,作为一个盘分区使用。将内存模拟为硬盘空间,将高频率访问的特定文件(甚至设备文件)放入Ramdisk中,也就是在访问前已经置入内存,从而提高访问速度。
Ramdisk 还可以通过对应用程序预加载的方法来加快启动过程,比如为了启动X Window或者浏览器等加载、初始化较慢的程序,可以将这些程序提前放入Ramdisk,从Ramdisk启动以提高启动速度。
加载嵌入式C 库和Shell,使系统和程序更小更快
用户程序为了运行,必须动态加载或者静态链接C库,多数Linux中使用的标准C库是GNU 的glibc,相对于嵌入式系统,体积过于庞大而且系统开销很大。所以嵌入式Linux往往需要加载小容量的嵌入式标准C 库,比如常用的有Newlib(http://sourceware.org/newlib)、uClibc(http://www.uclibc.org)。同时为了和与用户交互,Linux也必须加载一个Shell,而通常的bash、csh都过于庞大,经过裁剪的shell 比较常用的有BusyBox(http://www.busybox.net)。
注意特有的内存和文件管理,尤其Flash支持在一些小型的系统中,MMU并没有得到使用,或者没有启用,对应嵌入式Linux也需要相应的修改,在Linux2.6 的内核中,已经加入了对没有M M U 的系统支持。而对应Ramdisk,一般使用cramfs 文件系统(http://sourceforge.net/projects/cramfs/)。嵌入式系统中,Flash存储器由于体积小、耗电量小,而且速度比较快,已经获得了广泛的应用,可以作为普通ROM 使用,或者直接片上运行(XIP)运行程序。如果Flash作为ROM使用,一般使用只读文件系统romfs(http://romfs.sourceforge.net/),而可读写的Flash文件系统主要有YAFFS(http://www.aleph1.co.uk/yaffs)、JFFS(http://developer.axis.com/software/jffs/)和JFFS2(http://sources.redhat.com/jffs2/)。
关注嵌入式GUI,图形化的永恒话题
在智能手机、PDA 等信息家电和无线设备中,对友好方便、稳定可靠的嵌入式GUI具有特别的需求。目前很多面向嵌入式系统应用定制的GUI 已经发布出来供大家移植和使用,比较著名和常用的有Microwindows(http://www.microwindows.org/)、MiniGUI(http://www.minigui.org/)、OpenGUI(http://www.tutok.sk/fastgl/)、PicoGUI(http://picogui.org/)、Qt/Embedded(http://www.trolltech.com/)。其中MiniGUI在低端嵌入式系统和Qt/Embedded 在高端嵌入式系统,获得了越来越广泛的应用。
嵌入式Linux 稳步发展前进
- 从Linux2.6内核版本开始的实时性革命
Linux 内核(http://www.kernel.org/)本身也已经特别注重了向嵌入式系统的应用,2.6内核已经把uCLinux的大部分并入主流内核功能中,同时加入提高中断性能和调度响应时间的改进,有三个最显著的改进:采用可抢占内核、更加有效的调度算法以及同步性的提高。 2.6内核在一定程度上是可抢占的,比2.4内核具备更好的实时响应性(不是所有的内核代码段都可以被抢占)。2.6内核加入了多种微控制器的支持,无MMU的处理器已经整合进了新的内核中,而且在无MMU控制器上仍旧支持多任务处理,但没有内存保护功能。对于WLAN、Bluetooth、GPRS、CDMA和WiFi等最新出现的无线网络协议和设备,2.6 内核重建了驱动的体系层次和编程模型,可以方便地适应这些网络设备的变化,而且特别提出了NAPI 等模型提高网络处理效率。
更加广阔的市场环境和应用前景
嵌入式Linux 已经在消费电子设备中得到广泛应用,基于嵌入式Linux 的手持设备和智能手机已经具有了很大的市场,2006年新出品的智能手机中已经有超过15%使用了嵌入式Linux。嵌入式Linux 也得到了相当广泛的半导体厂商的支持和投资,如Intel、Motorola和IBM 都在主推基于嵌入式Linux 的SoC整体解决方案。Montavista Linux也推出了电信级、移动设备级版本,并已经有许多成功的应用案例。传统的嵌入式操作系统通过POSIX标准,也在一定程度上与Linux有所兼容,而且在某些实现上也有所借鉴。随着熟悉Linux的用户和开发人员越来越多,基于嵌入式Linux的新的嵌入式应用开发,相比VxWorks、LynxOS等,要熟悉而容易得多。预计到2010年以前,嵌入式Linux 将一直处在一个高速发展的时期,不但在消费电子设备中的份额将稳步提高,在更多的领域将会得到具体而广泛的应用,深入到交换机、路由器、汽车电子等领域,并且引领嵌入式开源的浪潮,降低许多嵌入式软件产品的版税,推动嵌入式软件产业的扩张和发展。
当然,目前Linux 本质上还是一个分时系统,关于高实时性和高可靠性依然是一个争议的话题。而且目前各种嵌入式Linux 对POSIX 的兼容程度并不一致,代码在一定程度上需要改写,这也给跨平台统一带来了一定障碍。百花齐放的嵌入式Linux 系统格局将会长时间维持,并且直接基于普通Linux内核的裁剪和定制将会更加普遍。无论如何,开放带来发展和支持,品质带来信赖和市场。秉承Linux 的开放和灵活,迎合广大嵌入式系统使用和开发者的热情,嵌入式Linux 将更加稳定和完善,在各种嵌入式系统,尤其是高端嵌入式系统中,得到更广泛的应用和普及.