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

QNX简介

关于QNX名子的来历有一则轶事:GordonBell和DanDodge在1980年创立了QuantumSoftwareSystems公司,她们按照学院时代的一些构想写出了一个能在IBMPC上运行的名叫QUNIX(QuickUNIX)的系统,直至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让嵌入式系统的设计人员深陷两难窘境。一方面,Linux容许设计人员借助大批软件开发人员、丰富的历史源代码和行业标准的POSIX应用程序插口(API)。但同时,标准Linux内核未能提供“硬”实时性能,比如有保证的响应时间和毫秒级延后——而那些都是许多嵌入式设备所须要的。

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

以进程调度为例。Linux不会像实时操作系统那样采用基于可占领优先级的调度程序,相反,它采用一种“公平”策略,为此每位进程都有合理的机会运行。这样,优先级高、时间要求严格的进程就难以随时立即访问CPU。实际上,操作系统有时会中断优先级高的进程,便于优先级低的进程共享CPU时间。据悉,当驱动程序或其他系统服务(一般在内核调用中运行)以顾客端线程的名义执行时,操作系统常常会遗失所有优先级信息。这些系统行为会造成难以预想的延后,并且会阻碍关键运行按量完成。

须要提醒的是,假如觉得这些调度模式是Linux的缺陷那可就错了。模式本身运行良好,比如在实现桌面和服务器程序所需的较高的总吞吐量时。并且,当被迫步入不符合其设计用途的确定环境(比如网路路由器、医疗器械、工厂机器人和车辆应用)中时,它才会显现不足。

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

嵌入型操作系统_系统交换分区是作为系统_linux作为嵌入式操作系统的优势

在Linux外部应用的实时功能

比如,有些供应商企图在一个实时内核上以任务的形式运行Linux,以提供“实时Linux”(参见图1)。任何须要确定性调度的任务就会在这些占领式内核中运行,但其优先级要低于Linux的优先级。为此,只要这种任务须要运行,它们能够占据Linux,并且只有在其工作完成后,才能向Linux释放CPU。

linux作为嵌入式操作系统的优势_嵌入型操作系统_系统交换分区是作为系统

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

1)代码移植的麻烦

在实时内核中运行的任务未能充分借助现有的Linux系统服务——如文件系统、网络服务等。实际上,假如实时任务向Linux恳求任何服务,它会面临同样的占领问题,这会制止Linux进程以确定形式运行。

为此,必须针对实时内核创建新的驱动程序和系统服务,虽然Linux中已存在相同的服务。因为这种可用的现成驱动程序不多,所以,Linux系统开发人员一般必须使用不熟悉的应用程序插口(API)从头编撰。

2)脆弱的运行环境

Linux是基于宏内核构架的。这样,应用程序会在用户空间运行并受惠于显存保护。并且,Linux为一般的非实时进程提供的受显存管理单元(MMU)保护的可靠环境却未能造福实时内核中运行的任务。相反,它们会在无保护的内核空间运行。为此,任何富含公共编码错误(如受损的C表针)的实时任务就会轻易造成内核出现严重故障。这的确是一个问题,由于须要实时功能的大部份系统同样须要极高的可靠性。

3)有限的可移植性

应用双内核方式后,实时任务不再是Linux进程了百度网盘LINUX,而是基于POSIX应用程序插口(API)一小部分子集的线程和讯号处理程序,或则在某种情况下,是一种非标准应用程序插口(API)。将既存的Linux代码和应用程序移植到实时环境中显得非常困难。

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

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

因为Linux进程不会在实时内核中运行,因而其运行具有不确定性。相反,系统会依照Linux的公正算法继续调度它们。

5)设计选项有限

系统交换分区是作为系统_linux作为嵌入式操作系统的优势_嵌入型操作系统

如上所述,实时内核支持的应用程序插口(API)仅提供标准POSIX和Linux应用程序插口(API)提供的服务的子集。为此linux基础教程,与借助Linux或成熟的实时操作系统相比,软件开发人员的设计选项十分有限。

针对以上Linux在实时性上的窘境,我们看一下QNX如何应对。

1)混和软件模式的精华

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

2)兼容内核

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

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

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

3)统一的运行环境

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

4)针对故障宣泄与订制操作系统的内在开放性

然而,假若实时操作系统不能说明为什么大部份软件开发人员会首先考虑Linux:即开源模式的优势,这么Linux的兼容性仍会使人蒙蔽。软件开发人员能借助开源模式剖析操作系统构架,以更好地集成自己的代码,使操作系统组件适应程序的特定要求并节约大量的故障宣泄时间——不仅在其自己的程序出现问题时,并且在底层操作系统代码出现难以预想的问题时。其实,软件开发人员未能通过许多商用操作系统的“黑盒”模式实现一定程度的厂商无关性和自给自足,虽然以维护自己的操作系统为代价。

系统交换分区是作为系统_嵌入型操作系统_linux作为嵌入式操作系统的优势

图2——在QNXNeutrino实时操作系统中,微内核只包含最基本的操作系统服务。所有更中级的服务(包括驱动程序和合同栈)都是以可选择的用户空间进程运行的。为此,软件开发人员能轻松借助行业相关或程序特定的服务扩充操作系统,无需进行复杂的内核编程和调试。

QNXNeutrino实时操作系统以两种形式提供这种优势:

通过使用内在可扩充的微内核构架;通过向驱动程序、函数库、网络服务和板级支持包(BSP),包括经证明的适用各类设备的驱动程序开发工具包(DDK)提供源代码。

linux作为嵌入式操作系统的优势_系统交换分区是作为系统_嵌入型操作系统

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

5)降低复制的麻烦

如上所述,双内核方式会促使软件开发人员使用不熟悉的应用程序插口(API)编撰订制驱动程序。在多数操作系统环境中,开发这种驱动程序都须要内核调试工具(无法使用)、内核重建(花费时间)和内核程序员(成本高昂)。

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

6)附加内核服务

因为微内核实时操作系统是为满足嵌入式系统的需求专门设计的,因而QNXNeutrino还提供了标准Linux或实时Linux软件开发平台未能提供的服务。这种服务包括:

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

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

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

嵌入型操作系统_linux作为嵌入式操作系统的优势_系统交换分区是作为系统

图3——软件开发人员使用QNXMomentics系统分析器能使复杂的多核运行实现可视化,并能将精力集中到最大限度推动并行运行和增强系统性能的领域。

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

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

为解决这一问题,QNXNeutrino支持自适应分区功能,它容许用户在应用程序组周围完善安全的隔断,并为每位隔断分配有保证的显存预算和CPU时间。借助这些技术,关键进程能够保证获得显存和CPU周期,虽然在系统处理负载过大或受到拒绝服务功击时也是这么。

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

系统交换分区是作为系统_linux作为嵌入式操作系统的优势_嵌入型操作系统

嵌入型操作系统_系统交换分区是作为系统_linux作为嵌入式操作系统的优势

图4——利用QNX自适应分区技术,每位软件子系统都能获得有保证的最少CPU时间,虽然在CPU满载时。

c)更可靠的运行模式

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

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

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

e)透明分布式处理

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

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

QNX分布式处理能够降低硬件成本。比如,在车载资讯娱乐网路中,假如一个设备具有蓝牙联接,其他设备就无需自己单独的蓝牙合同栈和收发芯片;它们使用同一个蓝牙联接即可。

linux作为嵌入式操作系统的优势_系统交换分区是作为系统_嵌入型操作系统

图5——QNX透明分布式处理将一组独立系统集成到单独的逻辑机中。为此,在一个节点上运行的程序能访问其他任何节点上的资源(网路合同栈、文件系统、USB端口等),无需进行特殊的软件编程。

f)容错网路

通过QNX分布式处理提供的网路提取功能,应用程序可通过冗余网路链接实现透明通讯:假如一个链接失败,操作系统会手动在其余链接中修改流量的路线。您能够通过所有可用链接使网路流量实现负载平衡,进而提升系统的吞吐量。应用程序能再度借助这些服务,无需任何特殊的网路代码。

g)降低显存占用空间

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

h)经实地检查性能仍然如一的内核

linux作为嵌入式操作系统的优势_嵌入型操作系统_系统交换分区是作为系统

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

7)授权许可问题

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

在此授权许可下,衍生作品必须依照与原始作品相同的授权条款免费发布。换言之,倘若您编撰的专有代码是对原始作品的更改或是始于原始作品的,您必须向公众发布所有代码。为此,您的竞争对手才能而且将会从您的专有开发成果中受益。

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

QNX软件系统公司特别注意保护其顾客免受这种问题的困惑。实际上,QNX提供了可用源代码的许多优势,但是不会形成与开源软件(受保护性授权许可的控制)有关的风险。

保护您的知识产权是现今嵌入式市场的一种合理要求。并且,与侵害其他公司知识产权有关的风险却往往被忽略。

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

确定开源代码的出处和其明确程度的重任就落在使用这种代码的企业的肩上。因而,使用代码除了会带来风险,就会形成直接成本:曝露风险是直接来自有问题的代码数目的,成本是由确保代码明确所需进行的法律和技术尽职调查形成的。

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

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

8)协同合作

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

但与Linux不同,QNXNeutrino从一开始就是针对实时功能设计的,因而避开了实时扩充的成本和复杂性。软件开发人员可借助POSIX访问开源软件,同时又能从仍然如一并经实用证明的实时运行环境中获益。

其实,QNX也有它的缺点,那就是价位高昂:开发过程的License费用、咨询维护费用、按产品件数缴纳的费用等。而使用开源的Linux操作系统则基本不会形成License相关的费用linux作为嵌入式操作系统的优势,因而对于成本控制比较严格的小公司来说,面对动辄上百万的License及维护费用,Linux似乎是一个更好的选择。

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复