我们用一组简单的数学公式来描述操作系统的组成要素:
操作系统 = 内核 + 系统程序
系统程序 = 编译环境 + API + AUI
编译环境 = 编译程序+连接程序 + 装载程序
API = 系统调用 + 语言库函数( C,C++,Java,etc )
AUI = shell + 系统服务例程(如 x 服务器等) + 应用程序 ( 浏览器,字处理,编辑器 )
操作系统最底层的组件是内核,其上层搭建了许多系统软件。系统程序包括三个部分。这三个部分分别是:编译环境、应用程序接口和用户接口。编译环境包含汇编, C 等低高级语言编译程序,连接程序和装载程序,这些程序负责将文本格式的程序语言转变为机器能识别和装载的机器代码;应用程序接口( API )包含内核提供的系统调用接口和语言库,系统调用是为了能让应用程序使用内核服务,语言库函数则是为了方便应用程序开发,所以将一些常用的基础功能预先编译以供使用,比如对 C 语言来说常用的 C 库有 gun C 等;用户接口 (AUI) 包括我们熟悉的 shell( 关于 shell 应该专门写一个教程 ) 、系统服务程序和常用的应用程序。
这些部分并非所有的操作系统都必须一个不少的包含,不过其中大多数功能都应该提供,尤其内核,系统调用, shell 这些基本组件,它们都属于操作系统必备组件,其它组件是否包含需要根据具体系统的要求和应用环境决定,你也可以将其归为操作系统之外的附加部分。
操作系统最核心,最基础的组件就要属内核了——内核和操作系统的其它系统软件或应用程序本质的区别在于内核运行在高特权级,和硬件直接交互,操作权限几乎不收任何限制,因此内核程序编写也要求格外谨慎,必须保证效率和可靠。
内核作为操作系统的核心,运行级别最高。其它系统程序都必须通过它才可以使用系统资源,获取系统服务。所以内核使用最为频繁,一切系统行为无论巨细都要通过内核参与。
因此内核运行效率和正确性对整个系统的运行效率和可靠性至观重要,如果内核效率稍微下降,那么在应用程序中就必然造成层层放大。
内核要求高效率,所以它必须自系统运行起就要载入内存,并且在运行期间一直驻留在内存中,直到系统关闭。这是内核与其它应用程序或系统程序的另一个显著区别。虽然说内存今天已经不再是天价了,但是毕竟内存容量有限,所以内核大小不能过大( Linux 内核只有几 M 或十几 M ,甚至可以裁减得更小),因此内核只应该包含最基础和核心的功能,其它附加功能应该尽量提到用户空间完成。
那么到底有那些功能是操作系统使用最频繁,最需要在内核中实现的呢?内核直接架构于硬件资源之上,因此首先要做的就是对硬件的资源管理。因此内核必须负责:内存管理,进程和进程调度(对 CPU 的管理),文件系统管理, I/O 处理等任务。
我们的杂志核心就是在解释内核原理的基础上,带领大家学习内核级别的开发,也就是说进行核心开发。本期仅仅给大家一个概念上的说明,描述内核设计需要完成的主要任务,至于具体内核各部分的详细讨论在后续期刊中将逐步展开。
内核至少需要包含如下几个模块。
进程管理 : 进程是操作系统中的执行代码,是任务在系统内的动态化身。内核必须负责将任务抽象为进程,而且必须能将进程执行,能为进程分配资源,维护进程的执行状态, 提供进程间通讯方法。更进一步讲,进程管理还必须保证进程运行的可靠性,因此需要提供进程同步,互斥,防死锁等等服务,另外进程调度也是进程管理中的重要 任务。
内存管理 :计算机存储部件由快到慢、由小到大分为缓存、内存和磁盘。其中最主要和必须是内存,内存管理包括内存的分配和释放,以及访问保护等。另外对使用虚拟内存的系统,内存管理还包含虚拟内存管理,磁盘交换管理,内存影射等等。
文件系统 :文件是多数系统中用户使用和管理数据的主要方式,文件系统需要负责用户文件访问,访问权限控制,文件格式转换,数据传输等一系列问题。
设备管理 :除了存储设备外,系统还有大量外设需要操作系统管理,比如时钟,网卡,键盘,磁盘等等,设备管理需要负责驱动这些设备为上层调用服务。
I/O 管理 : 操作系统中 I/O 管理负责处理复杂的 I/O 操作,其中包括 I/O 缓冲和磁盘调度等。
另外中断管理 也是操作系统内核应该实现的功能。
以上是操作系统内核设计要考虑的主要问题,其中各种模块彼此相互交错、相互利用。不过这些模块的划分并不是绝对的,在实际系统中可能有不同的组合或更细致地划分,因此我们不必追究模块的具体内容,需要关注的是内核究竟需要完成那些功能。
内核模块大致也有层次之分,我们可以这样理解层次含义:直接和硬件作用的是硬件抽象层 ,和用户更靠近的属于逻辑抽象层 。
所谓硬件抽象层,是指管理硬件设备的模块,比如存储管理、设备管理这些模块将硬件功能抽象为内核数据结构和接口函数,以供上层使用。比如磁盘设备驱动,需要将磁盘设备功能抽象为打开 open ,写入 (write) ,读取( read )等接口函数;内存管理需要将内存抽象为页、段等结构体。然后分配、合并、释放等工作都是通过操作这些抽象得来的结构体,再由这些结构影射到内存的物理实体上去的完成实际操作的。
所谓逻辑抽象层最主要的目的是为了贴近用户需求,最重要的逻辑抽象模块就是文件系统,文件系统的存在完全是从用户角度出发设计的,因为用户最能接受以用文件形式包装的信息,所以文件系统属于逻辑上的抽象,因为物理设备中没有对应文件的实体。
对于进程管理来说,其中进程执行和调度要和处理器打交道,应该说属于硬件抽象层,但其中进程状态维护,进程通讯等更接近用户使用,因此可以归结到逻辑抽象层。
另外 I/O 管理和中断管理些模块,在内核中属于为其它模块服务的借用力量,它们主要被文件系统或设备管理模块使用,但总之是面向硬件的,所以也可以将其归为硬件逻辑层。