第二章 操作系统组织(xv6 2021版)

本文翻译自MT xv6 | Chapter 2 | Operating system organization

对于一个操作系统而言,一个关键性要求就是能够在同一时间支持多个活动(activities)。比如通过调用第一章中提到的系统调用接口fork,一个进程可以启动一个新的进程。操作系统必须给进程分时地共享这些计算机资源。举个例子,即使当前进程的数量大于硬件CPU的数量,操作系统也必须保证所有的进程都能得到机会来运行。操作系统同样也必须安排好进程间的隔离。也就是说,如果一个进程有bug并失灵,它不应该影响其他无关进程。完全地隔离性,某种程度来说要求又有点过了,因为进程之前有时也有交互的意愿,比如说进程之间通过pipe来通信。因此操作系统必须要满足三个要求:复用性(multiplexing),隔离性(isolation)和交互性(interaction)。

本章概述了如何组织操作系统来实现这三个要求。实现这三个要求有好多种路径,但本文专注在以宏内核(monolithic kernel)为核心的主流设计上,这种设计被很多Unix类的操作系统所采用。本章还概述了xv6的进程(在xv6中进程是隔离性的基础),以及在xv6启动时0号进程(第一个用户态进程)的创建过程。

 xv6运行在一个多核(multi-core)的RISC-V微处理器上,并且它的许多底层功能(比如它的进程实现)是专门基于RISC-V架构的。RISC-V是一个64位的CPU,而xv6是基于“LP64 C”编写的,这意味着C编程语言中的长整型(L)和指针(P)都是64位的,但整型(int)是32位的。本书假设读者在某些体系结构下有过一些底层开发经验,同时也会在遇到RISC-V相关的知识时进行介绍。这里推荐一本RISC-V非常有用的参考,“The RISC-V Reader: An Open Architecture Atlas”。其中用户级ISA和特权级架构都是官方规范。

在一个完整的计算机里,CPU周围充斥着各种支撑硬件,这些硬件大多以I/O接口的形式存在。xv6支持的硬件是通过qemu “-machine vir”模拟(simulate)实现的。这其中包括RAM,ROM(包含启动代码),串行用户键盘/屏幕和存储硬盘。

2.1 抽象的物理资源

2.2 用户模式,监督者模式以及系统调用

2.3 内核组织结构

2.4 代码解析: xv6组织结构

2.5 进程概述

2.6 代码解析: xv6启动,0号进程的创建以及系统调用

2.7 安全模型

2.8 现实世界

大多数操作系统都会采用进程的概念,其中大多数进程和xv6的看起来类似。现代操作系统支持在同一进程的多线程,进而允许单个进程可以使用(exploit)多个CPU。在一个进程中支持多线程需要涉及相当多的机制,其中不少机制xv6没有实现,包括潜在接口的更改(例如,Linux的clone,一种fork的变体实现),以便控制进程的哪些方面需要在线程中共享。

2.9 练习

 给xv6添加一个系统调用,该系统调用返回值为可用空闲内存的大小。

posted @ 2023-01-07 14:49  低调的LEO  阅读(76)  评论(0编辑  收藏  举报