QNX中微子RTOS的主要目标是以一种健壮的、可伸缩的形式交付开放系统POSIX API,这种形式适用于广泛的系统——从小型的资源受限的嵌入式系统到高端的分布式计算环境。该操作系统支持多个处理器家族,包括x86和ARM。对于任务关键型应用程序,健壮的体系结构也是基础,因此OS灵活而完整地使用了MMU硬件。当然,仅仅制定这些目标并不能保证结果。我们邀请您通读本系统架构指南,以了解我们的实现方法和为实现这些目标所选择的设计折衷。当您读完本指南时,我们认为您会同意QNX Neutrino是第一个真正实现了开放系统标准,并具有广泛的可伸缩性和高可靠性的操作系统产品。
根据一个流行的神话,如果您使用POSIX操作系统,您会发现有UNIX也在其列! POSIX操作系统太大,不适合嵌入式系统。 然而,事实是POSIX不是UNIX。尽管POSIX标准植根于现有的UNIX实践,但POSIX工作组明确地以“接口而不是实现”的方式定义了这些标准。
感谢POSIX精确的规范,以及高可用性的POSIX 测试套件,让非传统的操作系统体系结构可以提供POSIX API,而不需要采用传统的UNIX内核。
比较任意两个POSIX系统,它们看起来非常相似——它们有许多相同的功能、实用程序等等。但在性能或可靠性方面,它们可能有天壤之别,而架构决定了这些不同。尽管QNX中微子的体系结构肯定不是unix的,但它实现了这个标准POSIX API。通过采用微内核体系结构,QNX操作系统是以一种易于按比例缩小或者根据需要按比例增加的实时嵌入式系统的形式来交付这个API。
由于只需包含或省略提供所需功能的特定进程,就可以轻松地扩展微内核操作系统,因此可以将单个微内核操作系统用于比实时执行更广泛的用途。
产品开发通常采取创建“产品线”的形式,连续的模型提供更强大的功能。通过添加文件系统、网络、图形用户界面和其他技术,使用微内核操作系统的开发人员可以根据需要轻松地扩展系统,而不必为产品的每个版本都强制更改操作系统。这种可扩展的方法的一些优点包括:
realtime应用程序开发的一个常见问题是,每个realtime OS都倾向于配备自己的专用API。在缺乏行业标准的情况下,竞争激烈的市场演变成这种状态并不罕见,因为对实时市场的调查经常显示大量使用内部专有操作系统。POSIX的出现,代表一个统一这个市场的机会的出现。在众多POSIX标准中,嵌入式系统开发人员最感兴趣的是:
操作系统的主要职责是管理计算机的资源。系统中的所有活动,包括调度应用程序、将文件写入磁盘、通过网络发送数据等等,都应该尽可能无缝、透明地协同工作。有些环境需要比其他环境更严格的资源管理和调度。例如,实时应用程序依赖于操作系统来处理多个事件,并确保系统在可预测的时间限制内响应这些事件。操作系统的响应越快,实时应用程序必须在最后期限前完成的时间就越多。QNX中微子RTOS是嵌入式实时应用程序的理想选择。
它可以扩展到非常小的规模,并提供多任务处理、线程、优先级驱动的抢占式调度和快速上下文切换,这些都是嵌入式实时系统的基本组成部分。此外,OS通过posix标准API提供了这些功能;没有必要为了实现一个小系统而放弃标准。QNX中微子也非常灵活。开发人员可以轻松地定制操作系统来满足他们的应用程序的需求。从只有几个小模块的最基本的微内核配置,到为数百个用户提供服务的成熟的网络系统,您可以自由地设置您的系统,只使用您需要的资源来处理手头的工作。QNX中微子通过两个基本原理实现了其独特的效率、模块化和简单性。
流行语有时流行,有时不流行。供应商倾向于热情地将当今的流行语应用到他们的产品上,不管这些术语是否真的适用。术语“微内核”已经变得流行。尽管许多新的操作系统被认为是微内核(甚至是纳米级),但是如果没有一个明确的定义,这个术语可能就没有什么意义了。我们来定义一下这
个术语。微内核操作系统的结构是一个很小的内核,它提供可选的协作进程团队所使用的最小服务,而这些进程又提供更高级别的操作系统功能。微内核本身缺乏文件系统和许多其他操作系统通常需要的服务;这些服务由可选流程提供。设计一个微内核操作系统的真正目标不是简单地让它变小。微内核操作系统体现了交付操作系统功能的方法的根本变化。模块化是关键,大小只是一个副作用。仅仅因为一个内核很小就称它为微内核是完全没有意义的。由于微内核提供的IPC服务用于将操作系统本身粘合在一起,所以这些服务的性能和灵活性决定了最终操作系统的性能。除了那些IPC服务之外,微内核在提供的服务和它们的实时性能方面与实时执行程序大致相当。
微内核与executive的不同之处在于如何使用IPC服务来扩展内核的功能,并提供额外的服务流程。由于操作系统是作为一组由微内核管理的协作进程实现的,所以用户编写的进程既可以作为应用程序,也可以作为扩展特定于行业的应用程序的底层操作系统功能的进程。操作系统本身变得开放且易于扩展。此外,用户编写的操作系统扩展不会影响核心操作系统的基本可靠性。许多实时执行人员实现POSIX 1003.1标准的一个困难是,他们的运行时环境通常是一个单进程、多线程模型,线程之间没有保护内存。这样的环境只是POSIX假设的多进程模型的一个子集;它不能支持fork()函数。相反,QNX中微子充分利用MMU在受保护的环境中提供完整的POSIX过程模型。如下图所示,真正的微内核不仅为用户应用程序,而且为操作系统组件(设备驱动程序、文件系统等)提供完整的内存保护。
QNX操作系统的第一个版本在1981年发布。在每一次后续的产品修订中,我们都将以前产品的经验应用到最新的版本中,这是我们迄今为止最强大、可伸缩的操作系统。我们相信,正是这种经过时间考验的经验使QNX中微子RTOS能够利用它所消耗的有限资源来交付它所做的功能。
QNX中微子RTOS由小微核组成,管理一组相互协作的进程。如下图所示,该结构看起来更像一个团队,而不是一个个层级,像几个等级相同的“玩家”之间通过微内核进行互动。
QNX中微子作为一种“软件总线”,可以让你根据需要动态地插入/出操作系统模块
内核是任何操作系统的核心。在某些系统中,“内核”包含如此多的功能,以至于它实际上就是整个操作系统!但是我们的微内核是真正的内核。
首先,就像实时执行的内核一样,它非常小。其次,它只提供一些基本服务:
除了托管微内核的/进程管理器模块(procnto)提供的服务外,所有OS服务都是通过标准进程处理的。一个配置丰富的系统可以包括以下内容:
系统进程本质上与任何用户编写的程序没有什么区别,它们使用的公共API和内核服务对任何(适当特权的)用户进程都是可用的。正是这种架构赋予了QNX中微子RTOS无与伦比的扩展性。由于大多数操作系统服务是由标准的系统流程提供的,所以扩展操作系统本身非常简单:只需编写新程序来提供新的操作系统服务。实际上,操作系统和应用程序之间的边界可能变得非常模糊。系统服务和应用程序之间的惟一真正区别是,OS服务为客户管理资源。假设您已经编写了一个数据库服务器,那么应该如何对这样的进程进行分类呢?正如文件系统接受打开文件和读写数据的请求(通过消息)一样,数据库服务器也会接受请求。尽管对数据库服务器的请求可能更加复杂,但这两个服务器在提供API(由消息实现)方面非常相似,客户机可以使用该API访问资源。它们都是独立的流程,可以由最终用户编写,并根据需要启动和停止。一个数据库服务器在一个安装时可能被认为是一个系统进程,而在另一个安装时则被认为是一个应用程序。真的没关系!重要的一点是,操作系统允许干净地实现这些过程,而不需要修改操作系统本身的标准组件。对于创建自定
义嵌入式系统的开发人员来说,这提供了灵活性,可以将操作系统扩展到对他们的应用程序特别有用的方向,而不需要访问操作系统源代码。
设备驱动程序允许操作系统和应用程序以通用的方式使用底层硬件(例如,磁盘驱动器、网络接口)。虽然大多数OS要求设备驱动程序与操作系统本身紧密绑定,但QNX中微子的设备驱动程序可以作为标准进程启动和停止。因此,添加设备驱动程序不会影响os驱动程序的任何其他部分,可以像其他应用程序一样开发和调试。
当多个线程同时运行时,就像在典型的实时多任务环境中一样,操作系统必须提供允许它们彼此通信的机制。进程间通信(IPC)是将应用程序设计为一组协作进程的关键,其中每个进程处理整体中定义良好的一部分。该操作系统提供了一组简单但功能强大的IPC功能,极大地简化了由协作流程组成的应用程序的开发工作。有关更多信息,请参见进程间通信(IPC)一章。
QNX中微子是第一个利用消息传递作为IPC基本手段的商业操作系统。操作系统的强大、简单和优雅在很大程度上归功于整个系统中消息传递方法的完整集成。在QNX中微子中,消息是一个字节包,从一个进程传递到另一个进程。操作系统对消息的内容没有特殊的意义,消息中的数据对消息的发送方和接收方都有意义,但对其他任何人都没有意义。消息传递不仅允许进程彼此传递数据,而且还提供了同步多个进程执行的方法。在发送、接收和回复消息时,进程会经历各种状态变化,这些变化会影响它们的运行时间和持续时间。知道它们的状态和优先级后,微内核就可以尽可能高效地调度所有进程,从而最大限度地利用可用的CPU资源。因此,这种单一的、一致的方法消息传递在整个系统中都是持续有效的。Realtime和其他任务关键型应用程序通常需要一种可靠的IPC形式,因为组成这些应用程序的过程是紧密相关的。QNX中微子传递信息的设计原则有助于为应用程序带来秩序和更大的可靠性。
最简单的形式是,局域网提供了一种在几个相互连接的计算机之间共享文件和外围设备的机制。QNX中微子远远超出了这个简单的概念,它将整个网络集成到一个单一的、同质的资源集合中。网络中任何机器上的任何线程都可以直接使用任何其他机器上的任何资源。从应用程序的角度来看,本地资源和远程资源之间没有区别,不需要在应用程序中构建特殊的设施来允许它们使用远程资源。用户可以在网络上的任何地方访问文件,利用任何外围设备,并在网络上的任何机器上运行应用程序(只要他们具有适当的权限)。进程可以在整个网络的任何地方以相同的方式进行通信。同样,操作系统无处不在的消息传
递IPC解释了这种流动的、透明的网络。
QNX中微子被设计成一个网络范围的操作系统。在某些方面,一个本地的QNX中微子网络更像是一台大型计算机,而不是一组单独的微处理器。用户只知道可供任何应用程序使用的大量资源。但是与大型机不同,QNX中微子提供了一个高度响应的环境,因为可以在每个节点上提供适当数量的计算能力来满足每个用户的需求。例如,在任务关键型环境中,控制实时I/O设备的应用程序可能比其他不太关键的应用程序(如web浏览器)要求更高的性能。网络的响应能力足以同时支持这两种类型的应用程序,操作系统允许您在需要的地方和需要的时候将计算能力集中在硬实时系统中的设备上,而不会牺牲与桌面的并发连接。此外,实时计算的关键方面,如优先级继承,可以在QNX中微子网络上无缝运行,而不管使用的物理介质是什么(交换结构、串行等)。
QNX中微子网络可以使用各种硬件和行业标准协议组合在一起。由于这些对于应用程序和用户是完全透明的,所以可以在任何时候引入新的网络体系结构,而不会影响操作系统。网络中的每个节点都被分配一个唯一的名称作为其标识符。此名称是确定操作系统是作为网络运行还是作为独立操作系统运行的
惟一可见方法。
这种程度的透明性是QNX中微子消息传递架构的独特功能的又一个例子。在许多系统中,诸如网络、IPC甚至消息传递等重要功能都构建在操作系统之上,而不是直接集成到其核心中。结果往往是一个笨拙、低效的双重标准接口,进程之间的通信是一回事,而穿透神秘的单片内核的私有接口则完全是另一回事。与单片系统相比,QNX中微子的基础是有效的通讯是有效运作的关键。因此,消息传递形成了我们的微内核体系结构的基石,并提高了整个系统中所有进程之间的所有事务的效率,无论是跨PC底板还是跨一英里长的双绞线。