QNX简介
系统简介
QNX
是一个分布式、可扩展、遵从POSIX
规范的类Unix
硬实时操作系统。
QNX
为微内核的架构,微内核只提供进程调度、进程间通信、底层网络通信和中断处理四种服务。驱动程序、协议栈、文件系统、应用程序等都在微内核之外内存受保护的安全的用户空间内运行,组件之间能避免相互影响,在遇到故障时也能重启。
QNX Neutrino通过两个基本的原则,达到了独一无二的有效性、模块化和简洁性:
- 微内核架构
- 基于消息的进程间通信
微内核架构
在微内核OS中,内核精简,只实现OS最基本的核心部分并提供相应的服务,基于这些服务可以扩展完整的OS功能。设计一个微内核OS的目标是模块化,而并非最小化。
微内核提供的IPC服务用于将操作系统本身“粘合”在一起,这些服务的性能和灵活性决定了系统最终的性能。可以使用IPC服务和其他附加的服务来扩展内核的功能。 用户编写的进程既可以作为应用程序,也可以作为底层OS功能来支持行业特定的应用程序。 操作系统本身变得“开放”并且易于扩展。 此外,用户编写的OS扩展也不会影响核心OS的基本可靠性。
QNX内存保护
对许多依照POSIX1.003.1标准实现的实时执行程序来说,它们的运行时环境通常是单进程、多线程的模型,线程之间没法做到内存保护,而这样的环境只是POSIX假设的多进程模型的一个子集,它不支持fork()
函数。相比之下,QNX Neutrino利用MMU,在受保护的环境中实现了POSIX的线程模型。
一个真正的微内核会提供完整的内存保护,这个不仅适用于用户程序,也适用于OS组件,比如驱动程序、文件系统等。
针对内存保护,有以下几种情况:
-
不提供内存保护:所有程序位于同一个地址空间,应用程序可以访问所有空间,效率较高,但是程序指针错误可能造成内核崩溃,典型的比如Nuttx平板模式。
平板模式 -
单内核OS提供部分内存保护:用户层和系统层进行了隔离,内核和各种驱动、协议栈在同一个地址空间,应用程序在单独空间。内核模块处于一个保护空间,效率较高,应用程序无法访问,系统的稳定性也得到提高。由于内核模块处于保护空间,调试会比较困难。比如Linux系统。
单内核模式 -
微内核OS提供完整的内存保护:内核处于一个被保护的地址空间,驱动程序、网络协议及应用程序等处于程序空间中。
微内核模式
QNX Neutrino微内核
内核是操作系统的核心,在有些操作系统中,内核包含了很多功能,导致内核像是个完整的操作系统。而QNX的微内核是一个真正的内核,它非常小,并且只提供基本的服务:
- 通过POSIX线程创建原语提供的线程服务;
- 通过POSIX信号原语提供的信号服务;
- 消息传递服务,微内核处理整个系统中所有线程之间的消息路由;
- 通过POSIX线程同步原语提供的同步服务;
- 调度服务,微内核使用各种POSIX实时调度策略来调度线程执行;
- 定时器服务,微内核提供了丰富的POSIX定时器服务集;
- 进程管理服务,微内核与进程管理器一起组成一个叫
procnto
的单元,进程管理器部分负责管理进程、内存,还有路径名空间。
与线程不同,微内核本身不会被调度执行。处理器只在微内核中执行系统调用、异常、硬件中断响应等。
QNX Neutrino操作系统的微内核,管理一组协作的进程,如下图所示,这种结构不是一种层级的组织,更像是一个团队,因为不同的进程可以通过内核来协调交互。QNX Neutrino充当一个“软件总线”的角色,可以在需要的时候动态的插入和移除系统模块。
QNX Neutrino架构
进程及进程间通信
除了procnto
单元提供的服务外,所有的系统服务都是通过标准的进程来处理的。一个配置丰富的QNX系统应该包括以下功能:
- 文件系统管理器
- 字符设备管理器
- 图形用户界面
- 本地网络管理器
- TCP/IP
系统进程 vs 用户进程
系统进程与任何用户编写的进程本质上是不可区分的,它们使用相同的公共API和内核服务。正是这种架构也让QNX具备了无与伦比的可扩展性。由于大多数的操作系统服务由标准的系统进程提供,因此增强操作系统本身变得非常简单:只需编写新的程序来提供新的操作系统服务。实际上,操作系统和应用程序之间的界限可能会变得非常模糊,系统服务和应用程序之间唯一真正的区别是操作系统服务为客户管理资源。
假如你需要写一个数据库的服务器,这样一个进程怎么分类?
正如文件系统接受请求(通过消息)来打开文件和读写数据一样,数据库服务器也需要接受请求,尽管数据库服务器的请求可能更复杂,但是两者非常相似,需要提供API(由消息实现)给客户端进行资源访问。此外,它们都是独立的进程,可以由终端用户来编写,并且根据需要来进行启动和停止。
数据库服务器可能在某个任务中充当系统进程,而在另外的任务中充当应用户进程,但是这都不重要,重要的是QNX操作系统可以在不修改操作系统本身的标准组件的情况下,允许用户实现这样的进程,对于嵌入式开发人员来说,提供了很大的灵活性。
设备驱动程序允许操作系统和应用程序以通用的方式去访问低层的硬件(例如磁盘设备驱动器、网络接口)。虽然大多数的OS要求设备驱动程序与OS本身紧密绑定,但是QNX Neutrino的驱动程序能被当成一个标准的进程被启动和停止。因此,添加设备驱动程序不会影响OS的其他部分,可以像应用程序一样开发和调试驱动。
进程间通信
IPC(Interprocess Communication)进程间通信,是将应用程序设计成一组进程的关键,确保每个进程处理整体中的某一部分。QNX是第一个将消息传递作为IPC基本手段的商业操作系统,操作系统的强大、简单和优雅,在很大程度上归功于消息传递在整个系统中的完整集成。
在QNX Neutrino中,消息是从一个进程传递给另一个进程的字节包,消息的内容只对发送者和接收者有意义。
消息传递不仅允许进程相互传递数据,而且还提供了一种同步多个进程执行的方法。当进程发送、接收、回复消息时,它们会经历各种“状态变化”,这些“状态变化”,会影响它们的执行时间和时间长度。了解它们的优先级和状态,微内核可以尽可能有效的调度所有进程,最大限度来利用CPU资源。消息传递在整个系统中不断的起作用。
实时或关键任务,通常需要一套可靠的IPC机制,因为组成这些任务的进程之间关联很紧密。QNX Neutrino的消息传递设计所强加的规则,给应用程序带来了秩序和可靠性。