1.5: Real world

Unix 将“标准”文件描述符、管道和方便的 shell 语法结合起来,这对编写通用、可重用的程序是一次重大的进步。这一思想激发了“软件工具”的文化,并且为 Unix 的强大功能和流行奠定了基础,而 shell 也成为了第一个所谓的“脚本语言”。Unix 的系统调用接口至今仍在 BSD、Linux 和 macOS 等系统中得到广泛使用。

Unix 的系统调用接口已经通过便携操作系统接口(POSIX)标准化。然而,xv6 并不符合 POSIX 标准:它缺少许多系统调用(包括一些基本的系统调用,比如lseek),并且它提供的许多系统调用与标准有所不同。我们在设计xv6时的主要目标是简洁和清晰,同时提供一个简单的类Unix系统调用接口。虽然一些人已经为xv6扩展了更多的系统调用和一个简单的C库,以便运行基本的Unix程序,但现代内核提供的系统调用要比 xv6 多得多,且包含更多种类的内核服务。例如,现代内核支持网络、窗口系统、用户级线程、许多设备的驱动程序等。现代内核不断快速演化,并提供超出 POSIX 的许多功能。

Unix 通过统一的文件名和文件描述符接口来访问多种类型的资源(文件、目录和设备)。这一思想可以扩展到更多种类的资源,一个很好的例子是Plan 9,它将“资源即文件”的概念应用于网络、图形等领域。然而,大多数Unix衍生的操作系统并没有沿着这一路线发展。

文件系统和文件描述符作为抽象模型非常强大。尽管如此,还有其他的操作系统接口模型。MulticsUnix 的前身,它将文件存储抽象化,使其看起来像内存,从而产生了一种非常不同的接口风格。Multics 设计的复杂性对 Unix 设计者产生了直接影响,他们的目标是构建一个更简单的系统。

xv6 不提供用户的概念,也没有保护一个用户不受另一个用户影响的机制;用 Unix 的术语来说,所有 xv6 进程都作为 root 用户运行。

本书将探讨xv6 如何实现其类 Unix 接口,但这些思想和概念不仅仅适用于 Unix。任何操作系统都必须将进程多路复用到底层硬件上,隔离进程之间的相互影响,并提供受控的进程间通信机制。在学习完 xv6 后,您应该能够看到其他更复杂的操作系统中也包含了 xv6 所基于的概念。