Linux or QNX ?

Linux大家可能都比较熟悉了,我们先来看一下QNX的简介。

QNX简介

关于QNX名字的由来有一则趣事:Gordon Bell和Dan Dodge在1980年成立了Quantum Software Systems公司,他们根据大学时代的一些设想写出了一个能在IBM PC上运行的名叫QUNIX(Quick UNIX)的系统,直到AT&T发律师函过来才把名字改成QNX。从QNX的最初命名可以看出,QNX是一种类UNIX的操作系统,其遵守POSIX规范,也就是说在Linux(也遵守POSIX规范)上编写的应用程序可以不作修改重新编译后可以直接在QNX上运行。

2004年,音响设备制造商 Harman 国际工业公司收购了QNX。2010年,黑莓手机(BlackBerry)制造商RIM宣布收购哈曼国际工业集团旗下的QNX软件公司。QNX这个原本的渥太华公司,在被美国哈曼国际 Harman 在买走6年后,又重返加拿大。

QNX被RIM并购的消息传出,才让这个在中国的认知度并不高的“默默无闻”的操作系统厂商被大家所熟知。但在汽车领域,QNX早已是最大的操作系统供应商。据不完全资料显示,QNX在车用市场占有率达到75%,目前全球有超过230种车型使用QNX系统,包括哈曼贝克、德尔福、大陆、通用电装、爱信等知名汽车电子平台都是在QNX系统上搭建的。几乎全球所有的主要汽车品牌包括讴歌、阿尔法-罗密欧、奥迪、宝马、别克、凯迪拉克、雪弗兰、克莱斯勒、戴姆勒、道奇、菲亚特、福特、通用汽车、本田、悍马、现代、英菲尼迪、捷豹、吉普、蓝旗亚、马自达、马赛地、迷你宝马、三菱、尼桑、欧宝、庞迪克、保时捷、萨博、土星、双龙、丰田和大众汽车等目前都采用了基于QNX技术的系统。

除汽车领域之外,QNX的最大客户订单来源于思科系统,其中高端路由设备几乎全部采用QNX操作系统,因此,网络通信也成为了QNX第二大应用领域。此外,QNX与通用电气、阿尔斯通、西门子、洛克希德·马丁和NASA等公司都有着紧密合作,在轨道交通、医疗器械、智能电网、核设施、军工领域及航空航天中,都发挥着积极作用。

看完了QNX的简介,再来了解一下Linux的现状。

Linux的实时性空白

嵌入式系统的设计人员对 Linux 操作系统的兴趣日益浓厚,主要是因为它采用开源模式。但事实证明,标准 Linux 内核无法提供大多数嵌入式系统需要的硬实时性能,例如可预测的响应时间和微秒级延迟。也出现了几种产品可填补 Linux 的实时空白,其中有成功的也有失败的。例如,某些供应商采用的双内核技术为实时任务提供了脆弱的运行环境,迫使软件开发人员重写新的驱动程序和系统服务,即使 Linux 中已经存在相同的服务。在本文中,我们会为您介绍一种替代解决方案——使用针对嵌入式系统专门设计的基于 POSIX 的实时操作系统——这不仅能确保软件开发人员使用现有的 Linux 编程技术,还能保留 Linux 开源模式的关键优势。此外,该技术还允许软件开发人员使用标准 Linux 或实时 Linux 扩展无法实现的各种操作系统服务,为用户带来额外收益。

填补Linux的实时性空白

Linux 让嵌入式系统的设计人员陷入两难境地。一方面,Linux 允许设计人员利用大批软件开发人员、丰富的历史源代码和行业标准的 POSIX 应用程序接口 (API)。但同时,标准 Linux 内核无法提供“硬”实时性能,例如有保证的响应时间和微秒级延迟——而这些都是许多嵌入式设备所需要的。

导致这种情况的根源是 Linux 的通用架构。开发 Linux 的目的是提供像 UNIX 一样的功能,而且已针对服务器与 IT 市场对其进行了深度优化。这些市场的要求与嵌入式市场的要求大相径庭,因此,Linux 内核选择的定义对嵌入式应用其实不适用。

以进程调度为例。Linux 不会像实时操作系统那样采用基于可抢占优先级的调度程序,相反,它采用一种“公平”策略,因此每个进程都有合理的机会运行。这样,优先级高、时间要求严格的进程就无法随时立刻访问 CPU。实际上,操作系统有时会中断优先级高的进程,以便优先级低的进程共享 CPU 时间。此外,当驱动程序或其他系统服务(通常在内核调用中运行)以客户端线程的名义执行时,操作系统往往会丢失所有优先级信息。这种系统行为会导致无法预料的延迟,而且会妨碍关键运行按时完成。

需要提醒的是,如果认为这种调度模式是 Linux 的缺陷那可就错了。模式本身运行良好,例如在实现桌面和服务器程序所需的较高的总吞吐量时。但是,当被迫进入不符合其设计用途的确定环境(例如网络路由器、医疗器械、工厂机器人和汽车应用)中时,它就会凸显不足。

在尝试解决这些缺陷的过程中,出现了许多旨在填补 Linux 实时空白的产品。其中一些是商业供应商的杰作;另一些是开源研究项目的成果。还有一些是二者的组合。但没有一种方法可作为“标准”技术。实际上,某些方法甚至偏离了标准 Linux/POSIX 编程模型。

在 Linux 外部应用的实时功能

例如,有些供应商试图在一个实时内核上以任务的方式运行Linux,以提供“实时 Linux”(参见图 1)。任何需要确定性调度的任务都会在这种抢占式内核中运行,但其优先级要高于 Linux 的优先级。因此,只要这些任务需要运行,它们就能抢占 Linux,而且只有在其工作完成后,才会向 Linux 释放 CPU。

在这种双内核模式中,实时内核通常先接收到硬件中断。如果中断是标记针对实时任务的,内核会安排该任务运行。否则,内核会将中断传递至 Linux 进行处理。该工作对在 Linux 环境下运行的应用程序是不可见的——除了被实时内核及其任务占用而损失了的 CPU 周期以外。这种方法依然有许多缺陷:

1)代码移植的麻烦

在实时内核中运行的任务无法充分利用现有的 Linux 系统服务——如文件系统、网络服务等。实际上,如果实时任务向 Linux 请求任何服务,它会面临同样的抢占问题,这会阻止 Linux 进程以确定方式运行。

因此,必须针对实时内核创建新的驱动程序和系统服务,即使 Linux 中已存在相同的服务。由于此类可用的现成驱动程序不多,所以,Linux 系统开发人员通常必须使用不熟悉的应用程序接口 (API) 从头编写。

2)脆弱的运行环境

Linux 是基于宏内核架构的。这样,应用程序会在用户空间运行并受益于内存保护。但是,Linux 为通常的非实时进程提供的受内存管理单元 (MMU) 保护的可靠环境却无法惠及实时内核中运行的任务。相反,它们会在无保护的内核空间运行。因此,任何含有公共编码错误(如损坏的 C 指针)的实时任务都会轻易导致内核出现严重故障。这的确是一个问题,因为需要实时功能的大部分系统同样需要极高的可靠性。

3)有限的可移植性

应用双内核方法后,实时任务不再是 Linux 进程了,而是基于POSIX 应用程序接口 (API) 一小部分子集的线程和信号处理程序,或者在某种情况下,是一种非标准应用程序接口 (API)。将既存的 Linux 代码和应用程序移植到实时环境中变得十分困难。

双内核方法的不同实现使用不同的应用程序接口 (API) 使问题进一步复杂。针对一个供应商的实时软件开发平台编写的实时任务可能无法在另一个供应商的实时软件开发平台上运行。希望利用广泛支持的 Linux 应用程序接口 (API) 的嵌入式系统制造商们必须在竞争激烈的“标准”之间选择。

4)对现有 Linux 应用程序和驱动程序没有可确定性

由于 Linux 进程不会在实时内核中运行,因此其运行具有不确定性。相反,系统会根据 Linux 的公平算法继续调度它们。

5)设计选项有限

如上所述,实时内核支持的应用程序接口 (API) 仅提供标准 POSIX 和 Linux 应用程序接口(API) 提供的服务的子集。因此,与利用 Linux 或成熟的实时操作系统相比,软件开发人员的设计选项非常有限。

针对以上Linux在实时性上的困境,我们看一下QNX怎么应对。

1)混合软件模式的精华

QNX® Neutrino® 实时操作系统为我们讨论的问题提供了更灵活、更可靠的解决方案。它不是迫使软件开发人员利用脆弱的运行环境,相反,它提供了一种经过验证的实时运行环境:

允许 Linux 软件开发人员保留已有的应用程序接口 (API) 和编程模型

通过采用面向实时和非实时应用程序的更严格的运行模式、更多的设计选项 以及统一的运行环境解决实时 Linux 软件开发平台的缺陷

以 Linux 的开源模式的主要优势为基础,例如故障排解简单和可定制操作系统——实际上,像QNX Neutrino 一样的微内核实时操作系统同时具有这两种显著的优势

提供基于 Linux 的解决方案无法提供的各种操作系统服务(如安全分区、分布式处理、高级多核支持)

2)兼容内核

具有 IEEE 标准的可移植操作系统接口 (POSIX) 系列最早是开发用于 Unix的,它定义的公共应用程序接口 (API) 允许在一种 POSIX 操作系统上开发的应用程序在另一种操作系统上运行,而且通常无需修改。请注意,POSIX 定义的是一种编程接口而非操作系统架构。因此,实时操作系统无需采用 Linux 的非确定型内核,就能利用兼容 Linux 的各种灵活性支持与 Linux 一样的POSIX 应用程序接口 (API)。

QNX Neutrino 实时操作系统为这种与实现无关的方法提供了证明:它提供了兼容 POSIX 的应用程序接口 (API),但却是在实时微内核架构中实现的。参见图 2。

重要的是,QNX Neutrino 不是以附加层的形式实现 POSIX。相反,QNX Neutrino 实时操作系统的内核(微内核)一开始就是设计支持 POSIX 实时工具的,包括线程。因此,POSIX 与 Linux 的兼容性很强。

3)统一的运行环境

在 QNX Neutrino 实时操作系统中,实时与非实时运行环境是一个整体而且完全相同。实时应用程序能利用全部的 POSIX 应用程序接口 (API) 并能完全访问系统服务——图形用户界面 (GUI)、文件系统、协议栈等。由于同样的原因,已有的 POSIX/Linux 程序就能迅速实现确定运行。由于实时与非实时应用程序都是在相同的环境中运行的,因此它们之间的进程间通信 (IPC) 就能大大简化。

4)针对故障排解与定制操作系统的内在开放性

但是,如果实时操作系统不能说明为何大部分软件开发人员会首先考虑 Linux:即开源模式的优势, 那么Linux 的兼容性仍会使人迷惑。软件开发人员能利用开源模式分析操作系统架构,以更好地集成自己的代码,使操作系统组件适应程序的特定要求并节省大量的故障排解时间——不仅在其自己的程序出现问题时,而且在底层操作系统代码出现无法预料的问题时。总之,软件开发人员无法通过许多商用操作系统的“黑盒”模式实现一定程度的厂商无关性和自给自足,即使以维护自己的操作系统为代价。

QNX Neutrino 实时操作系统以两种方式提供这些优势:

通过使用内在可扩展的微内核架构;

通过向驱动程序、函数库、网络服务和板级支持包 (BSP),包括经证明的适用各种设备的驱动程序开发工具包 (DDK) 提供源代码。

作为一种微内核操作系统,QNX Neutrino 本质上是可公开定制的。除一些驻留在内核空间的核心服务(如调度、定时器、中断处理)外,多数操作系统级服务(驱动程序、文件系统、协议栈等)都以用户空间程序的形式存在于内核之外。因此,开发定制的驱动程序和应用程序特定的操作系统扩展组件不需要专门的内核调试工具或内核专家。实际上,开发用户空间程序、操作系统扩展组件和开发标准应用程序一样容易,因为每位 Linux 开发人员都能使用其熟悉的标准、源代码级工具对它们进行调试。

5)减少复制的麻烦

如上所述,双内核方法会迫使软件开发人员使用不熟悉的应用程序接口 (API) 编写定制驱动程序。在多数操作系统环境中,开发这些驱动程序都需要内核调试工具(难以使用)、内核重建(耗费时间)和内核程序员(成本昂贵)。

QNX Neutrino 实时操作系统通过多种方式解决了这一问题。首先,像具有大量用户基础的所有已建的操作系统一样,QNX 支持各种适用标准硬件的现成驱动程序。而且,如我们所见,QNX Neutrino 在用户空间运行所有驱动程序,因此可使用标准的源代码级工具和技术对其进行开发。QNX 驱动程序开发工具包让这项工作变得更容易,它能提供文件记录、程序库、标头,以及适用各类驱动程序的即时定制源代码。

6)附加内核服务

由于微内核实时操作系统是为满足嵌入式系统的需求专门设计的,因此 QNX Neutrino 还提供了标准 Linux 或实时 Linux 软件开发平台无法提供的服务。这些服务包括:

a) 面向多核处理器的高级多重处理支持

QNX Neutrino 实时操作系统在研制伊始就考虑到多重处理。QNX 于 1997 年首次将对称多重处理 (SMP) 技术投入市场,并在过去十年中对这一功能进行改进和提高。例如,公司最近又引入混合多重处理 (BMP) 技术,这项创新技术允许未修改的继承程序在多核处理器上运行,同时又能确保并行程序以真正的 SMP 模式运行,以实现最大限度的可扩展性。利用BMP 技术,您能将继承程序与其所有的线程限制到单一核上,以确保程序正确运行,即使其使用的线程同步方法不适用于多核运行。

基于 Eclipse 的 QNX Momentics® 集成开发环境 (IDE) 也开发了多重处理功能,并提供了用于分析、调试和优化多核系统的可视化工具;参见图 3。与传统工具不同,这些工具可提供多核运行的全系统视图,从而确保软件开发人员识别实现并行运行的机会,减少了内核间不必要的线程迁移,消除了内核间过度的进程间通信 (IPC),并隔离了多核设计中常常出现的复杂的资源竞争问题。这些工具提供的系统级分析加上 QNX Neutrino 的高级多重处理功能,能显著减少从单处理器向多核运行环境迁移的麻烦。

b) 提高安全性与可用性的 CPU 使用保证

目前,许多嵌入式系统都是能使用不可信任的外加应用程序和内容进行扩展的网络连接设备。如果设计中不采取适当的措施,就会损害系统的安全性和可用性。例如,流氓软件能使关键系统功能的 CPU 时间枯竭,从而阻止其正常运行。

为解决这一问题,QNX Neutrino 支持自适应分区功能,它允许用户在应用程序组周围建立安全的隔断,并为每个隔断分配有保证的内存预算和 CPU 时间。利用这种技术,关键进程就能保证获得内存和 CPU 周期,即使在系统处理负载过大或遭到拒绝服务攻击时也是如此。

而且,QNX 自适应分区还能将空闲分区中的 CPU 周期以动态方式重新分配到可受益于额外处理时间的分区——只有当 CPU 满载时,分区预算才会执行。因此,系统就能应对高峰需求并使利用率达到 100%,同时又能继续享受资源保证带来的安全性。与之相比,传统的分区调度程序会浪费这些未使用的周期,迫使系统设计人员使用更昂贵的 CPU。

c) 更可靠的运行模式

作为一种单处理器操作系统,Linux 将大部分的应用程序、文件系统和协议栈都混合到操作系统内核中。因此,这些组件中的任何一个出现编程错误的话,都会导致严重的内核故障。在 QNX Neutrino 中,这些组件都能在分离的内存受保护的地址空间内运行,因此它们很难引起内核故障或互相影响。因此,QNX Neutrino 为实时、任务关键型应用提供了一种本质上比 Linux 更稳定的运行环境——当然,它比双内核模式中使用的无保护的实时内核更稳定可靠。

d)系统服务的动态可升级性

在微内核操作系统中,实际上任何组件(如设备驱动程序、网络协议栈或应用程序)都能在系统的其他部分运行时进行动态升级。因此很容易就能到达 99.999% 或更高的可用性。实际上,即使使用新程序和操作系统组件对其进行定期更新,基于 QNX 的系统连续运行 5 至10 年也是很正常的。

e) 透明分布式处理

QNX Neutrino 提供了一项被称为透明分布式处理 (TDP) 的操作系统服务,它允许应用程序以透明方式访问设备驱动程序、网络协议栈和在其他网络节点上运行的其他操作系统服务。在获得许可的条件下,任何进程都能访问几乎所有的远程资源,就好像资源是在本地处理器上运行一样。

这种位置透明性简化了容错、负载平衡系统的设计。例如,有一台设备通过网络为客户应用程序提供计算服务。如果该设备出现故障而由备用设备接管,就不必通知客户应用程序正在处理器请求的是新设备,它们也无需特殊编程来确定新设备的位置。它们发送的任何信息都能自动地被转到新目标中。

QNX 分布式处理还能减少硬件成本。例如,在车载资讯娱乐网络中,如果一个设备具有蓝牙连接,其他设备就无需自己单独的蓝牙协议栈和收发芯片;它们使用同一个蓝牙连接即可。

f) 容错网络

通过 QNX 分布式处理提供的网络提取功能,应用程序可通过冗余网络链接实现透明通信:如果一个链接失败,操作系统会自动在其余链接中更改流量的路线。您还能通过所有可用链接使网络流量实现负载平衡,从而提高系统的吞吐量。应用程序能再次利用这种服务,无需任何特殊的网络代码。

g) 减少内存占用空间

由于其微内核架构的精确的可扩展性,QNX Neutrino 实时操作系统提供的运行环境比 Linux 小得多——这在大容量设备(如多媒体设备和车载远程信息处理系统)中是一种关键优势,哪怕单位内存成本减少 2 美元都能获得几百万美元的利润。实际上,针对 QNX Neutrino 的本地视窗系统 QNX Photon® microGUI® 也使用了微内核架构,因此设计人员能轻松“去除”内存有限的设备不需要的图形用户界面 (GUI) 服务。

h) 经实地检测性能始终如一的内核

与能在嵌入式系统之间更改的 Linux 宏内核不同,QNX 微内核无需修改就能在范围广泛的各种产品中使用。实际上,针对支持的每一系列的 CPU 只存在一种 QNX 微内核二进制。开发人员确信他们使用的是经 QNX 软件系统公司实验室检测和在其他客户设备上经实地检测的同一个微内核。

7) 授权许可问题

控制操作系统的使用和传播的授权许可对制造嵌入式设备的企业有深远的影响。例如,Linux 受GNU 通用公共许可 (GPL) v2——一种“保护性”授权许可的控制,它确保对原始程序的修改也会对公众发布。

在此授权许可下,衍生作品必须按照与原始作品相同的授权条款免费发布。换言之,如果您编写的专有代码是对原始作品的修改或是源于原始作品的,您必须向公众发布所有代码。因此,您的竞争对手就能并且将会从您的专有开发成果中获益。

在编写此文时,免费软件基金 (FSF) 正对 GPL v3 进行审查。GPL v3 是一种比 v2 更严格的授权许可,尽管其整体影响还未可知,但它可能迫使更多公司对外公布其作品,如果他们使用了受该授权许可保护的软件。

QNX 软件系统公司非常注意保护其客户免受这些问题的困扰。实际上,QNX 提供了可用源代码的许多优势,而且不会产生与开源软件(受保护性授权许可的控制)有关的风险。

保护您的知识产权是当今嵌入式市场的一种合理要求。但是,与侵犯其他公司知识产权有关的风险却常常被忽视。

开源软件不会保护用户免受专利侵权。例如,Linux是个人作品,开发者可能有(也可能没有)这种办法或意愿,以确保其开发的代码不会侵犯已有专利或申请中的专利。因为开源授权许可不提供豁免责任条款,其产品中包含开源代码的企业需对潜在的专利侵权负责。

确定开源代码的出处和其明晰程度的重担就落在使用这些代码的企业的肩上。因此,使用代码不仅会带来风险,还会产生直接成本:暴露风险是直接来自有问题的代码数量的,成本是由确保代码明晰所需进行的法律和技术尽职调查产生的。

在嵌入式产品中组合开源软件也会导致侵权风险。两个或更多个作品本身可能不会侵犯专利。但一旦组合,它们可能就构成侵权。

QNX 软件系统公司会不断投资以维护其知识产权的明晰,因此用户无需再花费时间和金钱来应对这些问题。它不会在其任何运行组件中使用受 GNU 通用公共许可控制的代码。此外,QNX 对其所有的核心代码负责,无论其是在内部编写的,还是根据开源代码改写的。

8) 协同合作

虽然 QNX Neutrino 实时操作系统为实时应用程序的运行提供了绝佳的平台,但在它和 Linux 之间进行选择并非是一种互斥和皆可的主张。实际上,使用 POSIX 应用程序接口 (API) 的软件开发人员能将其用于最合适的地方,同时以这两种操作系统为目标。为将大部分的 Linux 程序或开源程序植入 QNX Neutrino,软件开发人员只需使用 QNX Neutrino 程式库重新编译源码并重新链接即可。

但与 Linux 不同,QNX Neutrino 从一开始就是针对实时功能设计的,因此避免了实时扩展的成本和复杂性。软件开发人员可利用 POSIX 访问开源软件,同时又能从始终如一并经实用证明的实时运行环境中受益。

当然,QNX也有它的缺点,那就是价格昂贵:开发过程的License费用、咨询维护费用、按产品件数收取的费用等。而使用开源的Linux操作系统则基本不会产生License相关的费用,因此对于成本控制比较严格的小公司来说,面对动辄上百万的License及维护费用,Linux也许是一个更好的选择。

你可能感兴趣的:(Linux or QNX ?)