Professordeng's Blog

操作系统的工作是:

  1. 将计算机的资源在多个程序间共享,并且给程序提供一系列比硬件本身更有用的服务。
  2. 管理并抽象底层硬件,举例来说,一个文字处理软件(比如 word)不用去关心自己使用的是何种硬盘。
  3. 多路复用硬件,使得多个程序可以(至少看起来是)同时运行的。
  4. 最后,给程序间提供一种受控的交互方式,使得程序之间可以共享数据、共同工作。

操作系统通过接口向用户程序提供服务。设计一个好的接口实际上是很难的。一方面我们希望接口设计得简单和精准,使其易于正确地实现;另一方面,我们可能忍不住想为应用提供一些更加复杂的功能。解决这种矛盾的办法是让接口的设计依赖于少量的 “机制” (mechanism),而通过这些机制的组合提供强大、通用的功能。

本书通过 XV6 操作系统来阐述操作系统的概念,它提供 Unix 操作系统中的基本接口,同时模仿 Unix 的内部设计。Unix 里机制结合良好的窄接口提供了令人吃惊的通用性。这样的接口设计非常成功,使得包括 BSD,Linux,Mac OS X,Solaris (甚至 Microsoft Windows 在某种程度上)都有类似 Unix 的接口。理解 XV6 是理解这些操作系统的一个良好起点。

0-1

figure0-1

如图 0-1 所示,XV6 使用了传统的 “内核” 概念, 一个向其他运行中程序提供服务的特殊程序。每一个运行中程序(称之为 “进程”)都拥有包含指令、数据、栈的内存空间。指令实现了程序的运算,数据是用于运算过程的变量,栈管理了程序的过程调用。

进程通过 “系统调用” 使用内核服务。系统调用会进入内核,让内核执行服务然后返回。所以进程总是在用户空间和内核空间之间交替运行。

内核使用了 CPU 的硬件保护机制来保证用户进程只能访问自己的内存空间。内核拥有实现保护机制所需的硬件权限(hardware privileges),而用户程序没有这些权限。当一个用户程序进行一次系统调用时,硬件会提升特权级并且开始执行一些内核中预定义的功能。

内核提供的一系列系统调用就是用户程序可见的操作系统接口,XV6 内核提供了 Unix 传统系统调用的一部分,均在 user.h 中定义,用户使用系统调用必须包含此头文件。

接下来几节将说明 XV6 系统服务的概貌,如进程,内存,文件描述符,管道和文件系统,为了描述他们,我们给出了代码和一些讨论。这些系统调用在 shell 上的应用阐述了他们的设计是多么独具匠心。

shell 是一个普通的程序,它接受用户输入的命令并且执行它们,它也是传统 Unix 系统中最基本的用户界面。shell 作为一个普通程序,而不是内核的一部分,充分说明了系统调用接口的强大:shell 并不是一个特别的用户程序。这也意味着 shell 是很容易被替代的,实际上这导致了现代 Unix 系统有着各种各样的 shell,每一个都有着自己的用户界面和脚本特性。XV6 shell 本质上是一个 Unix Bourne shell 的简单实现。