3.2 嵌入式操作系统的体系结构
设计一个嵌入式操作系统,必须先定义好其体系结构,对整体结构做一个规划。同时,嵌入式操作系统体系结构也是一个操作系统的整体脉络,了解了这个脉络,整个操作系统的理解和使用也就有了着手点。
3.2.1 整体型
整体型其实就是无结构。任何过程都可以随意调用其他过程,因此没有信息隐藏的概念。这类结构中过程代码接口需要精心设计,以方便其他过程调用。
在这种类型的嵌入式操作系统中,当然也可以有一点结构的概念,如图3.1中把所有处理分成三个层次,使设计显得比较有条理。其与分层结构的不同在于上下层处理都不隐藏信息,都可以互相调用。例如,最早的DOS系统就是一个整体型结构,模块之间可以相互调用。
图3.1 嵌入式操作系统整体型体系结构
3.2.2 层次型
层次型是最简单和自然的划分方法,也就是把整个设计按照离硬件的远近层次来划分。层次型设计一般来说每层都会对相邻层隐藏一些信息,非相邻层完全不能够互相调用。
用这种结构设计一个新系统时必须小心地安排各个层的功能。最底层是最靠近硬件的,主要目的是对上层隐藏硬件细节。紧挨着的上一层就可以设计成处理中断、上下文切换、内存管理等。再往上的层次就跟硬件完全无关了。例如,第三层可以设计成管理多任务、多线程,第四层可以设计一些任务之间的通信等。这样的设计可以简化I/O处理的结构。当I/O中断产生后,可以利用进程间通信,由调度程序关掉使用该中断需要的资源的线程,使中断处理程序处于获得所有资源的状态。MINIX就采用这种方式,但是UNIX、Linux和Windows都没有使用这样主动处理中断的方式。其实操作系统中最复杂的部分就是I/O的处理了,任何可以简化操作的技术都是可取的。
例如,图3.2中虚内存管理放在文件系统之下层是为了能够完成文件读/写时高速缓存的换入、换出操作。
图3.2 嵌入式操作系统层次型体系结构
又如,Linux就是一个层次型体系结构,如图3.3所示。
图3.3 Linux的结构
3.2.3 微内核
与层次型划分的流派相反的是,一些人认为没有必要由嵌入式操作系统完成那么多功能,必须把一部分开发的自由交给编程者,使他们可以根据自己的需要为嵌入式操作系统做自己的功能扩展。为此,他们主张采用微内核的方式设计嵌入式操作系统,也就是只提供一个基本的嵌入式操作系统内核,完成如硬件的屏蔽、任务调度等,其余的如网络支持或者文件支持设计成可选模块,交给编程者来决定使用或者做拓展。嵌入式操作系统微内核体系结构如图3.4所示。
图3.4 嵌入式操作系统微内核体系结构
3.2.4 客户-服务器
客户-服务器结构是针对网络环境的,在不同功能的计算机上装不同的嵌入式操作系统。在客户端用轻负载的嵌入式操作系统,一般其功能就是收集数据;在服务器端则装比较大的操作系统,支持更复杂的任务和更复杂的硬件。图3.5的结构中可以看出,客户-服务器类型的嵌入式操作系统同时也是具有核的嵌入式操作系统,支持不同的应用程序,核部分主要完成网络通信功能。
图3.5 嵌入式操作系统客户-服务器体系结构
如图3.6所示是QNX4.25的体系结构,这就是一种客户-服务器的体系结构。2011年底RIM整合黑莓与QNX发布BBX系统,也说明了这种体系结构是具有优势的。QNX具备一个很小的内核,同时也是微内核体系结构的操作系统。QNX的内核一般只有几十KB,整个操作系统可根据需要定制模块。不同的客户应用可以选择不同的模块,但是都必须选择微内核部分。服务器包含微内核和更多的模块部分。
图3.6 QNX4.25的体系结构
当然,以上几种体系结构是可以混合运用的。