2.1 The services and functions provided by an operating system can be divided into two main categories. Briefly describe the two categories and discuss how they differ.

《操作系统设计与实现》的观点:

操作系统的两大任务:

  1. 作为底层机器的扩展。实现对底层硬件复杂操作的抽象。
  2. 作为资源管理器。实现对硬件资源进行规划和调度

《操作系统概念》的观点:

  1. 为用户提供操作接口。如 UI、程序执行、IO、文件系统操作
  2. 确保系统自身的运行。如资源调度分配,安全保护,审计等

2.3 Describe three general methods for passing parameters to the operating system.

SYSCALL 的过程

我们以 read 系统调用为例。

       #include <unistd.h>

       ssize_t read(int fd, void *buf, size_t nbytes);

对于用户而言,调用的是一个 C 函数。此时操作系统处于用户态。操作系统依次将 nbytes, buf, fd 压栈,然后调用系统的 read 库。read 实现由库提供:首先把 read 的代码放在寄存器中,然后 TRAP 入内核,在内核的一个固定地址开始执行,这些指令会检查系统调用编号(通过一个表完成),运行相应 SYSCALL Handler,完成之后,将数据返回到库中 read 的 procedure,然后此 procedure 返回到用户程序。

2.7 What is the purpose of the command interpreter? Why is it usually separate from the kernel? Would it be possible for the user to develop a new command interpreter using the system-call interface provided by the operating system?

命令解释器用于用户与操作系统上的程序进行交互。之所以设计在内核之外,是因为考虑到扩展性:用户可以自己创建新的命令。另外也可以避免 CLI 崩溃造成内核的连带崩溃。

2.11 It is sometimes difficult to achieve a layered approach if two components of the operating system are dependent on each other. Identify a scenario in which it is unclear how to layer two system components that require tight coupling of their functionalities.

两层组件紧耦合的情况很常见。比如分页内存管理,需要内存与硬盘的耦合。内存管理系统需要读写硬盘写入 pagefile,而硬盘上的文件操作也需要内存系统进行中介。

2.12 What is the main advantage of the microkernel approach to system design? How do user programs and system services interact in a microkernel architecture? What are the disadvantages of using the microkernel approach?

微内核和单内核的主要区别在于内核的各种模块是运行在内核态还是用户态。微内核的特点是内核服务进程运行在不同的地址空间,各个服务可以独立运行,通过 IPC 交换数据,即使单个服务崩溃也不会造成系统立即崩溃。

缺点是性能较差,模块之间通信比较复杂和困难。

2.13 In what ways is the modular kernel approach similar to the layered approach? In what ways does it differ from the layered approach?

分层和模块化的最终目的都是便于管理复杂度。分层架构的特点是简单,通信仅仅存在于上下层之间,因而损失一定的灵活性,但也降低了开发的难度。