xv6-一个精巧操作系统(10)

387 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情


原文链接 xv6-riscv文档


2.1 抽象物理资源

当面对操作系统时我们要问的第一个问题是我们究竟为什么需要操纵系统呢?毕竟我们可以通过把系统调用作为库的方式给应用程序做调用。在这种方式下,应用程序甚至可以拥有满足它需求的独特的库。应用可以直接和硬件资源交互并且直接使用资源是对应用最好的方式,尤其是我们需要实现一些高表现或者可预计表现时(译者注:例如直接写一段汇编代码放在CPU上执行,跑就完事了,就像过去的小纸条的方式)。一些实时嵌入式操作系统就以这样的方式实现。

这种库方法的缺点在于,如果在机器上有超过一个应用程序在跑,这些程序都需要高效运转。例如,每一个程序需要周期性的放弃CPU来给其他的应用程序运行。如果所有的应用程序可以互相信任彼此且都没有bug的话,那么这样一个协作时分复用的模式是可以的。然而更通常的情况是应用程序并不互相信任并且有很多的bug,所以比起这样的协作模式,应用程序更喜欢一个强大的隔离机制。

禁止应用程序直接访问敏感的硬件资源,并且将硬件资源抽象成为设备对实现强大的隔离机制是很有裨益的。例如,Unix应用程序通过文件系统的openreadwriteclose系统调用来和存储交互而不是直接读和写磁盘。这种方式给应用程序提供了路径名的便利,并且其需要作为接口实现者的操作系统来管理磁盘。即使隔离不是重要的事情,程序也更可能发现文件系统比起直接使用磁盘是一种更方便的抽象。

相似的,Unix显然的切换CPU硬件提供给进程,必要时保存和重载寄存器状态,所以应用程序并不需要担心分时复用的问题。显然这也允许操作系统分享CPU资源即使一些应用程序在无限循环中。

作为另一个例子,Unix进程通过exec系统调用来构建他们的存储镜像,而不是直接的和物理内存做交互。这允许操作系统决定在内存的何处放置一个进程,如果内存紧张的话,操作系统甚至可以将部分进程数据存储到磁盘上。exec也提供给用户一个方便的文件系统来存储可执行文件。

Unix中许多形式的进程交互通过文件描述符的方式出现。不仅仅是因为文件描述符抽象了许多的细节,它们同时也定义了一种简化交互的方式。例如,如果一个应用程序在管道连接中失败了,内核会在管道连接的另一端生成一个eof信号。(译者注,我们考虑|的两段,左边右边形成管道,如果左边失败,那么只需要给右边输出eof即可)。

系统调用被谨慎的设计来实现用户便捷性和强大隔离可能性。Unix接口不是抽象资源的唯一方式,但是它被证明是一种非常好的方式。


回顾发展历史是学习的一种很有趣的方式,如果我们问自己为什么要有操作系统的话,我们会理所当然的得到很多的回答;同样的,当我们问自己为什么会有某某事物的出现时,我们就需要去思考其中的为什么。

感谢阅读。