“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”
这句话几乎概括了计算机系统软件体系结构的设计要点,整个体系结构从上到下都是按照严格的层次结构设计的。不仅是计算机系统软件整个体系是这样的,体系里面的每个组件比如操作系统本身,很多应用程序、软件系统甚至很多硬件结构都是按照这种层次的结构组织和设计的。系统软件体系结构中,各种软件的位置如图所示。
每个层次之间都要相互通信,既然需要通信就必须有一个通信协议,我们一般将其称为接口(Interface),接口的下面那层是借口的提供者,由它定义接口;接口的上面那层是接口的使用者,它使用接口来实现所需要的功能。在层次体系中,接口是被精心设计过的,尽量保持稳定不变,那么理论上层次之间只要遵循这个接口,任何一个层都可以被修改或是替换。除了硬件和应用程序,其他都是所谓的中间层,每个中间层都是对它下面的那层的包装和扩展。使得应用程序和硬件之间保持相对的独立,比如硬件和操作系统都在日新月异的发展,但是最初为80386芯片和DOS系统设计的软件在最新的多核处理器Windows Vista下还是能够运行的,这方面硬件和操作系统本身保持了向后兼容性,另一方面不得不归功于这种层次结构的设计方式。
最近流行的虚拟机技术更是在硬件和操作系统之间增加了一层虚拟层,使得一个计算机上可以同时运行多个操作系统。这也是层次结构带来的好处,在尽可能少改变甚至不改变其他层的情况下,新增加一个层次就可以提供前所未有的功能。
我们的软件体系中,位于最上层的是应用程序,比如我们平时用的网络浏览器、Email客户端、多媒体播放器、图片浏览器等。从整个层次结构上来看,开发工具与应用程序是属于同一个层次的,因为它们都是用一个接口,那就是操作系统应用程序编程接口(API)。应用程序接口的提供者是运行库,什么样的运行库提供什么样的API,比如Linux下的Glibc库提供的POSIX的API;Windows的运行库提供的Windows API。
运行库使用操作系统提供的系统调用接口(System call Interface),系统调用接口在实现中往往以软件中断的方式提供,比如Linux使用0x80号中断作为系统调用接口,Windows使用0x2E号中断作为系统调用接口。
操作系统内核层对硬件层来是硬件接口的使用者,而硬件是接口的定义者,硬件的接口定义决定了操作系统内核,具体来讲就是驱动程序如何操作硬件,如何与硬件进行通信。这种接口往往叫做硬件规格,硬件的厂商提供硬件规格,操作系统和驱动程序的开发者通过阅读硬件规格文档所规定的各种硬件编程接口标准来编写操作系统和驱动程序。