QNX neutrino 实时操作系统的原理

QNX_1_实时操作系统原理 (译)

  QNX中微子RTOS的主要目标是以一种健壮的、可伸缩的形式交付开放系统POSIX API,这种形式适用于广泛的系统——从小型的资源受限的嵌入式系统到高端的分布式计算环境。该操作系统支持多个处理器家族,包括x86和ARM。对于任务关键型应用程序,健壮的体系结构也是基础,因此OS灵活而完整地使用了MMU硬件。当然,仅仅制定这些目标并不能保证结果。我们邀请您通读本系统架构指南,以了解我们的实现方法和为实现这些目标所选择的设计折衷。当您读完本指南时,我们认为您会同意QNX Neutrino是第一个真正实现了开放系统标准,并具有广泛的可伸缩性和高可靠性的操作系统产品。

嵌入式POSIX操作系统?

  根据一个流行的神话,如果您使用POSIX操作系统,您会发现有UNIX也在其列! POSIX操作系统太大,不适合嵌入式系统。 然而,事实是POSIX不是UNIX。尽管POSIX标准植根于现有的UNIX实践,但POSIX工作组明确地以“接口而不是实现”的方式定义了这些标准。
  感谢POSIX精确的规范,以及高可用性的POSIX 测试套件,让非传统的操作系统体系结构可以提供POSIX API,而不需要采用传统的UNIX内核。
  比较任意两个POSIX系统,它们看起来非常相似——它们有许多相同的功能、实用程序等等。但在性能或可靠性方面,它们可能有天壤之别,而架构决定了这些不同。尽管QNX中微子的体系结构肯定不是unix的,但它实现了这个标准POSIX API。通过采用微内核体系结构,QNX操作系统是以一种易于按比例缩小或者根据需要按比例增加的实时嵌入式系统的形式来交付这个API。

产品扩展

  由于只需包含或省略提供所需功能的特定进程,就可以轻松地扩展微内核操作系统,因此可以将单个微内核操作系统用于比实时执行更广泛的用途。
  产品开发通常采取创建“产品线”的形式,连续的模型提供更强大的功能。通过添加文件系统、网络、图形用户界面和其他技术,使用微内核操作系统的开发人员可以根据需要轻松地扩展系统,而不必为产品的每个版本都强制更改操作系统。这种可扩展的方法的一些优点包括:

  • 可移植应用代码(在产品线内)
  • 用于开发整个产品线的通用工具
  • 可移植的开发人员技能
  • 减少投入市场的时间

为什么是用于嵌入式的POSIX系统?

  realtime应用程序开发的一个常见问题是,每个realtime OS都倾向于配备自己的专用API。在缺乏行业标准的情况下,竞争激烈的市场演变成这种状态并不罕见,因为对实时市场的调查经常显示大量使用内部专有操作系统。POSIX的出现,代表一个统一这个市场的机会的出现。在众多POSIX标准中,嵌入式系统开发人员最感兴趣的是:

  • 1003.1 -定义用于进程管理、设备I/O、文件系统I/O和基本IPC的API。这包含了UNIX操作系统的基本功能,可以作为许多应用程序的有用标准。从C语言编程的角度来看,ANSI X3J11 C被假定为一个起点,然后管理进程、文件和tty设备的各个方面被详细描述,超出了ANSI C所指定的范围。
  • Realtime扩展–定义一组对基础1003.1标准的实时扩展。这些扩展包括信号量、按优先级排序的进程调度、信号的实时扩展、高分辨率计时器控制、增强的IPC原语、同步和异步I/O,以及对实时连续文件支持的建议。
  • 线程——进一步扩展POSIX环境,包括在给定地址空间内创建和管理多个执行线程。
  • 额外的实时扩展——定义对实时标准的进一步扩展。描述了附加中断处理程序等功能。
  • 应用程序环境概要—定义了几个AEP(实时AEP,嵌入式系统AEP等)的POSIX环境,以适应不同的嵌入式能力集。这些配置文件表示带有/不带有文件系统和其他功能的嵌入式操作系统。
    除了采用行业标准的“从众”动机之外,将POSIX标准应用于嵌入式实时市场还有几个特定的优势:
  • Multiple OS sources:
      硬件制造商不愿意选择单一来源的硬件组件,因为如果该来源中断生产,可能会带来风险。出于同样的原因,制造商不应该仅仅因为他们的应用程序源代码不能移植到其他操作系统上,就被限制在一个单一来源的、专有的操作系统上。
    通过按照POSIX标准构建应用程序,开发人员可以使用来自多个供应商的OS。只要开发人员避免使用特定于OS的扩展,应用程序源代码可以很容易地从一个平台移植到另一个平台,从一个操作系统移植到另一个操作系统。
  • Portability of development staff:
      使用嵌入式开发的通用API,拥有一个realtime操作系统经验的程序员可以直接将他们的技能应用到涉及其他处理器和操作系统的其他项目中。此外,具有UNIX或POSIX经验的程序员可以很容易地在嵌入式实时系统上工作,因为实时操作系统的API的非实时部分已经很熟悉了。
  • Development environment:
      即使在跨主机的开发环境中,API在本质上也与在嵌入式系统中相同。不考虑特定的主机(Linux, Windows,…)或目标(x86, ARM),程序员不需要担心特定于平台的字节序、对齐或I/O问题。

为什么说QNX neutrino是嵌入式操作系统?

   操作系统的主要职责是管理计算机的资源。系统中的所有活动,包括调度应用程序、将文件写入磁盘、通过网络发送数据等等,都应该尽可能无缝、透明地协同工作。有些环境需要比其他环境更严格的资源管理和调度。例如,实时应用程序依赖于操作系统来处理多个事件,并确保系统在可预测的时间限制内响应这些事件。操作系统的响应越快,实时应用程序必须在最后期限前完成的时间就越多。QNX中微子RTOS是嵌入式实时应用程序的理想选择。
  它可以扩展到非常小的规模,并提供多任务处理、线程、优先级驱动的抢占式调度和快速上下文切换,这些都是嵌入式实时系统的基本组成部分。此外,OS通过posix标准API提供了这些功能;没有必要为了实现一个小系统而放弃标准。QNX中微子也非常灵活。开发人员可以轻松地定制操作系统来满足他们的应用程序的需求。从只有几个小模块的最基本的微内核配置,到为数百个用户提供服务的成熟的网络系统,您可以自由地设置您的系统,只使用您需要的资源来处理手头的工作。QNX中微子通过两个基本原理实现了其独特的效率、模块化和简单性。

  • 微内核
  • 基于消息的进程间通信

微内核架构

  流行语有时流行,有时不流行。供应商倾向于热情地将当今的流行语应用到他们的产品上,不管这些术语是否真的适用。术语“微内核”已经变得流行。尽管许多新的操作系统被认为是微内核(甚至是纳米级),但是如果没有一个明确的定义,这个术语可能就没有什么意义了。我们来定义一下这
个术语。微内核操作系统的结构是一个很小的内核,它提供可选的协作进程团队所使用的最小服务,而这些进程又提供更高级别的操作系统功能。微内核本身缺乏文件系统和许多其他操作系统通常需要的服务;这些服务由可选流程提供。设计一个微内核操作系统的真正目标不是简单地让它变小。微内核操作系统体现了交付操作系统功能的方法的根本变化。模块化是关键,大小只是一个副作用。仅仅因为一个内核很小就称它为微内核是完全没有意义的。由于微内核提供的IPC服务用于将操作系统本身粘合在一起,所以这些服务的性能和灵活性决定了最终操作系统的性能。除了那些IPC服务之外,微内核在提供的服务和它们的实时性能方面与实时执行程序大致相当。
  微内核与executive的不同之处在于如何使用IPC服务来扩展内核的功能,并提供额外的服务流程。由于操作系统是作为一组由微内核管理的协作进程实现的,所以用户编写的进程既可以作为应用程序,也可以作为扩展特定于行业的应用程序的底层操作系统功能的进程。操作系统本身变得开放且易于扩展。此外,用户编写的操作系统扩展不会影响核心操作系统的基本可靠性。许多实时执行人员实现POSIX 1003.1标准的一个困难是,他们的运行时环境通常是一个单进程、多线程模型,线程之间没有保护内存。这样的环境只是POSIX假设的多进程模型的一个子集;它不能支持fork()函数。相反,QNX中微子充分利用MMU在受保护的环境中提供完整的POSIX过程模型。如下图所示,真正的微内核不仅为用户应用程序,而且为操作系统组件(设备驱动程序、文件系统等)提供完整的内存保护。
QNX neutrino 实时操作系统的原理_第1张图片
QNX neutrino 实时操作系统的原理_第2张图片
QNX neutrino 实时操作系统的原理_第3张图片

  QNX操作系统的第一个版本在1981年发布。在每一次后续的产品修订中,我们都将以前产品的经验应用到最新的版本中,这是我们迄今为止最强大、可伸缩的操作系统。我们相信,正是这种经过时间考验的经验使QNX中微子RTOS能够利用它所消耗的有限资源来交付它所做的功能。

The OS as a team of processes

  QNX中微子RTOS由小微核组成,管理一组相互协作的进程。如下图所示,该结构看起来更像一个团队,而不是一个个层级,像几个等级相同的“玩家”之间通过微内核进行互动。
QNX neutrino 实时操作系统的原理_第4张图片
QNX中微子作为一种“软件总线”,可以让你根据需要动态地插入/出操作系统模块

A true kernel

  内核是任何操作系统的核心。在某些系统中,“内核”包含如此多的功能,以至于它实际上就是整个操作系统!但是我们的微内核是真正的内核。
  首先,就像实时执行的内核一样,它非常小。其次,它只提供一些基本服务:

  • thread services 通过POSIX线程创建原语实现
  • signal services 通过POSIX signal 原语实现
  • message-passing services :微内核处理整个系统中所有线程之间的所有消息的路由。
  • synchronization services 通过POSIX线程同步原语。
  • scheduling services:微内核使用各种POSIX实时调度策略执行线程调度。
  • timer services :微内核提供了丰富的POSIX定时器服务集。
  • process management services:微内核和进程管理器一起组成一个单元(称为procnto)。进程管理器部分负责管理进程、内存和路径名空间。与线程不同的是,微内核本身从来不调度执行。处理器仅在显式内核调用、异常或响应硬件中断时才执行微内核中的代码。

系统进程

  除了托管微内核的/进程管理器模块(procnto)提供的服务外,所有OS服务都是通过标准进程处理的。一个配置丰富的系统可以包括以下内容:

  • 文件系统管理filesystem managers
  • 字符设备管理charactor device managers
  • 本地网络管理native network managers
  • TCP/IP

系统进程 vs 用户自定义进程

  系统进程本质上与任何用户编写的程序没有什么区别,它们使用的公共API和内核服务对任何(适当特权的)用户进程都是可用的。正是这种架构赋予了QNX中微子RTOS无与伦比的扩展性。由于大多数操作系统服务是由标准的系统流程提供的,所以扩展操作系统本身非常简单:只需编写新程序来提供新的操作系统服务。实际上,操作系统和应用程序之间的边界可能变得非常模糊。系统服务和应用程序之间的惟一真正区别是,OS服务为客户管理资源。假设您已经编写了一个数据库服务器,那么应该如何对这样的进程进行分类呢?正如文件系统接受打开文件和读写数据的请求(通过消息)一样,数据库服务器也会接受请求。尽管对数据库服务器的请求可能更加复杂,但这两个服务器在提供API(由消息实现)方面非常相似,客户机可以使用该API访问资源。它们都是独立的流程,可以由最终用户编写,并根据需要启动和停止。一个数据库服务器在一个安装时可能被认为是一个系统进程,而在另一个安装时则被认为是一个应用程序。真的没关系!重要的一点是,操作系统允许干净地实现这些过程,而不需要修改操作系统本身的标准组件。对于创建自定
义嵌入式系统的开发人员来说,这提供了灵活性,可以将操作系统扩展到对他们的应用程序特别有用的方向,而不需要访问操作系统源代码。

设备驱动

  设备驱动程序允许操作系统和应用程序以通用的方式使用底层硬件(例如,磁盘驱动器、网络接口)。虽然大多数OS要求设备驱动程序与操作系统本身紧密绑定,但QNX中微子的设备驱动程序可以作为标准进程启动和停止。因此,添加设备驱动程序不会影响os驱动程序的任何其他部分,可以像其他应用程序一样开发和调试。

进程间通信

  当多个线程同时运行时,就像在典型的实时多任务环境中一样,操作系统必须提供允许它们彼此通信的机制。进程间通信(IPC)是将应用程序设计为一组协作进程的关键,其中每个进程处理整体中定义良好的一部分。该操作系统提供了一组简单但功能强大的IPC功能,极大地简化了由协作流程组成的应用程序的开发工作。有关更多信息,请参见进程间通信(IPC)一章。

QNX Neutino作为一个消息传递操作系统

  QNX中微子是第一个利用消息传递作为IPC基本手段的商业操作系统。操作系统的强大、简单和优雅在很大程度上归功于整个系统中消息传递方法的完整集成。在QNX中微子中,消息是一个字节包,从一个进程传递到另一个进程。操作系统对消息的内容没有特殊的意义,消息中的数据对消息的发送方和接收方都有意义,但对其他任何人都没有意义。消息传递不仅允许进程彼此传递数据,而且还提供了同步多个进程执行的方法。在发送、接收和回复消息时,进程会经历各种状态变化,这些变化会影响它们的运行时间和持续时间。知道它们的状态和优先级后,微内核就可以尽可能高效地调度所有进程,从而最大限度地利用可用的CPU资源。因此,这种单一的、一致的方法消息传递在整个系统中都是持续有效的。Realtime和其他任务关键型应用程序通常需要一种可靠的IPC形式,因为组成这些应用程序的过程是紧密相关的。QNX中微子传递信息的设计原则有助于为应用程序带来秩序和更大的可靠性。

网络分布式内核

  最简单的形式是,局域网提供了一种在几个相互连接的计算机之间共享文件和外围设备的机制。QNX中微子远远超出了这个简单的概念,它将整个网络集成到一个单一的、同质的资源集合中。网络中任何机器上的任何线程都可以直接使用任何其他机器上的任何资源。从应用程序的角度来看,本地资源和远程资源之间没有区别,不需要在应用程序中构建特殊的设施来允许它们使用远程资源。用户可以在网络上的任何地方访问文件,利用任何外围设备,并在网络上的任何机器上运行应用程序(只要他们具有适当的权限)。进程可以在整个网络的任何地方以相同的方式进行通信。同样,操作系统无处不在的消息传
递IPC解释了这种流动的、透明的网络。

Single-computer model

  QNX中微子被设计成一个网络范围的操作系统。在某些方面,一个本地的QNX中微子网络更像是一台大型计算机,而不是一组单独的微处理器。用户只知道可供任何应用程序使用的大量资源。但是与大型机不同,QNX中微子提供了一个高度响应的环境,因为可以在每个节点上提供适当数量的计算能力来满足每个用户的需求。例如,在任务关键型环境中,控制实时I/O设备的应用程序可能比其他不太关键的应用程序(如web浏览器)要求更高的性能。网络的响应能力足以同时支持这两种类型的应用程序,操作系统允许您在需要的地方和需要的时候将计算能力集中在硬实时系统中的设备上,而不会牺牲与桌面的并发连接。此外,实时计算的关键方面,如优先级继承,可以在QNX中微子网络上无缝运行,而不管使用的物理介质是什么(交换结构、串行等)。

弹性网络

  QNX中微子网络可以使用各种硬件和行业标准协议组合在一起。由于这些对于应用程序和用户是完全透明的,所以可以在任何时候引入新的网络体系结构,而不会影响操作系统。网络中的每个节点都被分配一个唯一的名称作为其标识符。此名称是确定操作系统是作为网络运行还是作为独立操作系统运行的
惟一可见方法。
  这种程度的透明性是QNX中微子消息传递架构的独特功能的又一个例子。在许多系统中,诸如网络、IPC甚至消息传递等重要功能都构建在操作系统之上,而不是直接集成到其核心中。结果往往是一个笨拙、低效的双重标准接口,进程之间的通信是一回事,而穿透神秘的单片内核的私有接口则完全是另一回事。与单片系统相比,QNX中微子的基础是有效的通讯是有效运作的关键。因此,消息传递形成了我们的微内核体系结构的基石,并提高了整个系统中所有进程之间的所有事务的效率,无论是跨PC底板还是跨一英里长的双绞线。

你可能感兴趣的:(QNX)