1.1 为什么为嵌入式系统选择Linux

Linux首次亮相是作为英特尔x86架构的PC硬件所用的通用操作系统(General-Purpose Operating System,GPOS)。正如Linux创造者Linus Torvalds在news:comp.os.minix上现在非常有名的帖子中所写的,他明确说道,“我正在做一个(免费)操作系统……它是不可移植的(使用386任务切换等),并且它可能永远不会支持除了AT硬盘以外的硬盘……”

被互联网的兴起所驱动,因为很多理由充分的原因,Linux迅速进化成为网络服务器和联网服务提供基础设施的服务器操作系统。

然而,在三个主要方面,Linux保持了它的通用操作系统的初始特点。这三个方面使得它在初期并没有成为工程师为嵌入式操作系统所定的首要选择:

文件系统:Linux是基于文件的操作系统,它需要一个在有读和写访问的面向块的大容量存储设备上的文件系统。面向块的大容量存储通常意味着硬盘驱动器具有旋转的盘片,而这对于大部分嵌入式的用例都是不实际的。

内存管理单元(Memory Management Unit,MMU):Linux是多任务操作系统。有效的任务切换要求在CPU上运行时,各个进程有自己的可以很容易映射到物理内存的私有内存地址空间。被广泛使用在典型嵌入式应用上的微控制器不提供内存管理单元。

实时:运行关键应用的嵌入式系统可能会要求在一定误差幅度(margin of error)内保证时间的预测响应,通常称为决定论(determinism)。在其随后的程序或者部分的迭代中时间上的错误数量被称作“抖动”(jitter)。可以绝对保证其执行操作的最大时间的操作系统被称为“硬实时系统”(hard real-time system)。通常在一定时间内执行操作的操作系统被称为“软实时”(soft real-time)。对Linux来说,虽然有一些提供了实时能力的解决方案(例如最著名的PREEMPT-RT)早在1996年就开发出来了,但是它们仍然没有成为主流Linux内核的一部分。

在过去的几年里,半导体技术的进步帮助克服了这些在嵌入式系统中采用Linux的障碍。在很多消费产品(例如数码相机)中使用到的、随处可见的、廉价的和长期可靠的闪存设备正在为文件系统提供必要的大容量存储。在单一芯片上把一个或者多个通用CPU核心和内存管理单元以及外围设备结合起来的强大的片上系统(System-on-Chip,SoC)设计成为嵌入式系统工程师的处理器的首选,并且在嵌入式应用方面正在逐渐取代微控制器。

今天我们看到了将Linux用于嵌入式设备的爆炸性的增长。几乎每个行业都受到这种趋势的影响。运营商级Linux(Carrier-Grade Linux,CGL)操作系统被用在公共交换的电话网络和全球数据网络的产品中。可能的情况是,你携带了手机,看带有机顶盒的电视和高清电视,通过宽带调制解调器和网络交换机的互联网浏览,通过个人导航设备来寻找路线,以及日常使用其他设备,这些都是由Linux来驱动的。

嵌入式Linux的快速增长存在很多理由。以下列出一些:

特许权使用费(Royalty):与传统的专有操作系统不同,Linux可以不用支付任何特许权使用费而部署。

硬件支持:Linux支持大量硬件设备,包括所有主要和通常使用的CPU架构:在各自32位和64位变体上的ARM、英特尔x86、MIPS以及PowerPC。

网络:Linux支持大量网络协议。除了普遍的TCP/IP之外,几乎在任何物理介质上的任何其他协议也可被实现。

模块化:Linux操作系统栈是由很多不同的软件包组成的。工程师们可以定制这个栈来使它精准地适合自己的应用。

可伸缩性:从只有一个CPU和有限资源的系统,到具有多个多核CPU、大内存占用、多个网络接口以及更多其他特性的系统,Linux都能伸缩适用。

源代码:Linux内核源代码,以及所有组成Linux操作系统栈的软件包的源代码,都是公开可获取的。

开发者支持:因为它的开放性,Linux吸引了极大数量的活跃的开发者,那些开发者快速构建了对新硬件的支持。

商业支持:数量正在增加的硬件和软件厂商,包括所有半导体生产商以及很多独立的软件厂商(Independent Software Vendor,ISV),正在通过产品和服务对Linux提供支持。

工具化:对软件开发,Linux提供了无数工具。这些工具包括从为几乎任何编程语言提供的编译器到数量逐渐增长的对嵌入式系统开发很重要的分析和性能测量工具。

现在,这些原因和很多其他原因使得Linux成为嵌入式系统工程师的首要选择,并推动着它在消费者产品和专业产品方面的加速应用。