### 计算机系统

完整的计算机由硬件和软件两部分组成

计算机硬件是指计算机系统中由电子、机械、光电组件组成的各种计算机部件和设备

计算机软件是指计算机系统中的程序、数据和有关的文档。

根据软件的作业可以将其分为系统软件、支撑软件和应用软件三类。

操作系统：操作系统是一组控制和管理计算机硬件和软件资源，合理地对各类作业进行调度、以及方便用户使用计算机**的程序的集合** ；操作系统也是软件。

任务：管理计算机的资源

操作系统的目标：

方便性

有效性

#### OS 的作用

- OS 是用户与计算机硬件之间的接口；  
- OS 是计算机系统资源的管理者；  
- OS 是扩充裸机功能的软件，它实现了对计算机资源的抽象；  
- OS 是计算机系统工作流程的组织者

#### 计算机硬件

中央处理器、存储器、各种输入设备。

#### 计算机软件

系统软件、应用软件和支撑软件三类 。

系统软件支持和管理硬件你，它创立的是一个平台，如编译程序、装配程序、操作系统

应用软件是某个特定应用领域专用的软件

支撑软件是支撑其他软件的编址和维护，如中间件

计算机系统自上而下可分为四部分：硬件、操作系统、应用程序和用户。操作系统管理计算机硬件，为应用程序提供基础

### 操作系统的发展与分类

**手工操作**

**单道批处理**

**多道批处理**

1. 多道  
2. 宏观上并行  
3. 微观上串行

$\blacktriangle$ 批处理首先考虑资源利用率和系统吞吐量，分时系统首先考虑交互能力和响应时间，实时系统首先考虑实时性和可靠性。  
$\blacktriangle$ 批处理系统的特点：资源利用率高，系统吞吐量大

无交互能力，作业平均周转时间长

$\blacktriangle$ 多道程序设计技术：多道程序同时装入内存，允许他们并发运行。优点：提高 CPU、存储器、设备的资源利用率，增加系统吞吐量。

**分时操作**

按照时间片轮流将处理器分配给各联机作业使用。

1. 同时性  
2. 交互性  
3. 独立性  
4. 及时性

分时系统的关键问题：人机交互

作业提交直接进入内存，引入时间片分时共享 CPU

响应时间 $\approx$ 进程数目 $\times$ 时间片大小

分时系统和实时系统的特征比较

交互能力:分时系统强于实时系统

实时性:实时系统优于分时系统

可靠性:实时系统优于分时系统

实时操作系统

必须在决定的时间内完成该事件的处理

**微机操作系统**

**网络操作系统**

**分布式操作系统**

**嵌入式操作系统**

### **操作系统的特性**

**并发性**

两个或多个事件在同一时间间隔内同时发生，宏观上由多个程序在同时执行，微观上在单处理机系统中这多个程序时交替运行的。

并行性是同时刻发生的。

**并发与并行的区别**

并发性：指两个或多个事件在同一时间间隔内发生。如单处理器中的两个进程（宏观上同时，微观上交替）（只并发，但不并行）

并行性：两个或多个事件在同一时刻发生。如计算机中的 CPU 与 I/O 设备、I/O设备与 I/O 设备的工作

一个程序的一次运行过程，每个进程设置一个PCB，存放下一条要执行的指令地址。

**共享性**

**虚拟性**

**异步性**

### 操作系统的功能

处理器管理

即进程管理，对处理器进行分配调度

存储器管理

设备管理

文件管理

作业管理

提供用户接口

命令接口（联机命令、脱机命令）

应用程序接口（即系统调用，是 OS 提供的一组实现特殊功能的子程序，以供应用程序 取得 OS 的服务）。

### 操作系统的内核结构

<table><tr><td></td><td>特性、思想</td><td>优点</td><td>缺点</td></tr><tr><td rowspan="2">分层结构</td><td rowspan="2">内核分多层,每层可单向调用更低一层提供的接口</td><td>1.便于调试和验证,自底向上逐层调试验证</td><td>1.仅可调用相邻低层,难以合理定义各层的边界</td></tr><tr><td>2.易扩充和易维护,各层之间调用接口清晰固定</td><td>2.效率低,不可跨层调用,系统调用执行时间长</td></tr><tr><td rowspan="4">模块化</td><td rowspan="4">将内核划分为多个模块,各模块之间相互协作。内核=主模块+可加载内核模块主模块:只负责核心功能,如进程调度、内存管理可加载内核模块:可以动态加载新模块到内核,而无需重新编译整个内核</td><td>1.模块间逻辑清晰易于维护,确定模块间接口后即可多模块同时开发</td><td rowspan="2">1.模块间的接口定义未必合理、实用</td></tr><tr><td rowspan="2">2.支持动态加载新的内核模块(如:安装设备驱动程序、安装新的文件系统模块到内核),增强OS适应性</td></tr><tr><td rowspan="2">2.模块间相互依赖,更难调试和验证</td></tr><tr><td>3.任何模块都可以直接调用其他模块,无需采用消息传递进行通信,效率高</td></tr><tr><td rowspan="2">宏内核(大内核，整体结构)</td><td rowspan="2">所有的系统功能都放在内核里(大内核结构的OS通常也采用了“模块化”的设计思想)</td><td rowspan="2">1.性能高,内核内部各种功能都可以直接相互调用</td><td>1.内核庞大功能复杂,难以维护</td></tr><tr><td>2.大内核中某个功能模块出错,就可能导致整个系统崩溃</td></tr><tr><td rowspan="2">微内核</td><td rowspan="2">只把中断、原语、进程通信等最核心的功能放入内核。进程管理、文件管理、设备管理等功能以用户进程的形式运行在用户态</td><td>1.内核小功能少、易于维护,内核可靠性高</td><td>1.性能低,需要频繁的切换 用户态/核心态。用户态下的各功能模块不可以直接相互调用,只能通过内核的“消息传递”来间接通信</td></tr><tr><td>2.内核外的某个功能模块出错不会导致整个系统崩溃</td><td>2.用户态下的各功能模块不可以直接相互调用,只能通过内核的“消息传递”来间接通信</td></tr><tr><td rowspan="3">外核(exokernel)</td><td rowspan="3">内核负责进程调度、进程通信等功能,外核负责为用户进程分配未经抽象的硬件资源,且由外核负责保证资源使用安全</td><td rowspan="2">1.外核可直接给用户进程分配“不虚拟、不抽象”的硬件资源,使用户进程可以更灵活的使用硬件资源</td><td>1.降低了系统的一致性</td></tr><tr><td rowspan="2">2.使系统变得更复杂</td></tr><tr><td>2.减少了虚拟硬件资源的“映射层”,提升效率</td></tr></table>

整体结构

（宏内核、单体结构模型、五结构模型）

模块结构

内核 :主模块+可加载内核模块

(2）模块化

模块化是将操作系统按功能划分为若干个具有一定独立性的模块。每个模块具有某方面的管理功能，并规定好各个模块之间的接口，使各模块之间能通过接口进行通信，还可以进一步将各个模块细分为若干个具有一定功能的子模块，同样也规定好各子模块之间的接口。把这种设计方法称为模块-接口法，图1.3所示为由模块、子模块等组成的模块化操作系统结构。

```mermaid
graph TD
	A["操作系统"]
    subgraph Module["模块"]
    	direction LR
    	M1["进程管理"]
    	M2["存储器管理"]
    	M3["文件管理"]
    end
    A --- M1
    A --- M2
    A --- M3
    subgraph Submodule["子模块"]
    	direction LR
    	S1["进程控制"]
    	S2["进程调度"]
    	S3["内存分配"]
    	S4["内存保护"]
    	S5["磁盘管理"]
    	S6["目录管理"]
    end
    M1 -->S1
    M1 -->S2
    M2 -->S3
    M2 -->S4
    M3 -->S5
    M3 -->S6
    
```

层次结构

```mermaid
graph TD
	A["用户接口层,第3层"] --> B["c2"]
	B -->C["1c"]
	C -->D[0层硬件]
```



最底层是硬件，最高层是用户接口；每层可调用更低一层。

微内核结构

（Client/Server 模型 ）

宏内核结构

![](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/6e2d51ead79a58653df6b25e0c7b4a490d7e20c8c221d4d7e189140182ec8603.jpg)

**OS 的其他分类方法**

- 用户数量：单用户 OS，多用户 OS

- 任务数量：单任务 OS，多任务 OS

单用户单任务 OS，单用户多任务 OS，多用户多任务 OS

- 计算机体系结构：微机 OS，网络 OS，多处理机 OS，分布式 OS 等

### 操作系统的硬件基础

#### 处理器

**处理器指令**

计算机的所有操作都是由处理器指令（机器指令或计算机指令）所决定的

每条处理器指令包含处理器执行所需的信息：操作码、源操作数、目的操作数和下一条指令地址

寻址方式：指令寻址和数据寻址

##### 寄存器

CPU的控制部件中，包含的寄存器有指令寄存器IR和程序计数器PC、算术逻辑单元有累加器ACC。包括通用寄存器、专用寄存器和控制寄存器。

**处理器特权级**

计算机系统中运行的程序可以分为两大类：操作系统的管理程序和用户程序。

即，CPU 上会运行两种程序，一种是操作系统内核程序，一种是应用程序。

多数系统将处理器特权级划分为管态和目态。

管态又称为系统态、核心态等，是操作系统管理程序运行时处理器所处状态。

所谓特权指令（清内存、外部设备输入输出、修改特殊寄存器、改变机器状态等）。使用系统中所有资源等等权限。

目态又称为用户态，时用户程序执行时处理器其所处的状态。

#### 存储器

磁盘的工作原理。

1. 盘面。每个盘片有两个盘面。每一个这样的有效盘面都由一个盘面号，按顺序从上至下、从0开始依次编号。磁面号又叫磁头号，因为每一个有效盘面都有对应的读写磁头。

2. 磁道。磁盘在低级格式化时被划分成许多同心圆。这些痛惜暖的轨迹叫做磁道。信息以脉冲串的形式记录再写轨迹中。磁道由外向内，从0开始顺序编号。每条磁道不是连续记录数据，而是划分成一段段圆弧。这些圆弧的角速度一样，线速度不一样。每一段圆弧叫做一个删去，删去从 1 开始编号。每个删去中断数据作为一个单元读出或写入。

3. 柱面。所有盘面上的同一磁道构成一个圆柱，称作柱面。每个援助上的磁头由上而下从0开始编号 。数据的读写按柱面进行，即从0磁头开始进行从左。只有同一柱面上所有磁头全部读写完毕后，磁头才转移到下一柱面。选取磁头只需通过电子切换，但是柱面必须通过急切切换。所以数据的读写按柱面进行，而不是盘面进行。

4. 扇区。操作系统一扇区的形式将新抄袭存储在硬磁盘上。每个扇区包含两个主要部分：扇区标识符和存储数据的数据段。每个扇区有512B。扇区标识符，又称为扇区头标，包括组成扇区三维地址的三个数字：1、盘面号 2、柱面号3、扇区号，也叫做块号

​	还有其余字段

CPU——进程

内存（主存）——存储器

磁盘/硬盘——文件系统

![](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/259250d3ec3eb138fab880fb1fa77f031ae6e877c4cae498908c44e44622d37b.jpg)

### 中断和时钟

作用：中断会使得 CPU 由用户态变为内核态，使操作系统重新夺回对 CPU 控制权。

用户态-> 内核态：由中断（包括外部中断、异常、访管指令等）引发，硬件自动完成变态过程，硬件自动将当前进程的 **PC、PSW、SS、ESP** 以及**通用寄存器**压入**主存**中的内核栈。触发中断信号意味着操作系统夺取CPU的使用权。

内核态->用户态，执行一条特权指令修改 PSW（程序状态字寄存器）的标志位为用户态，并从主存中恢复之前保存的现场（PC、ESP等）。这个动作意味着操作系统将主动让出 CPU。

当CPU响应中断时，从用户态切到内核态时，必须保存当前进程的“现场”，以便后续恢复。保存地点是**主存（内存）**。

1. **硬件上下文**：
   - **PC**（程序计数器）：下一条要执行的指令的地址。
   - **PS**（或 PSW，程序状态字）：记录当前的运行状态。
2. **通用寄存器**：所有正在使用的通用寄存器的值。
3. **中断/异常相关信息**：
   - **错误码**：如果是异常，记录出错的具体原因。
   - **中断向量号**：用于识别是哪个中断。
   - 中断/异常处理程序
4. **栈信息**（针对堆栈切换）：
   - **SS**（堆栈段寄存器）：内核栈的段地址。
   - **ESP**（堆栈指针寄存器）：内核栈的栈顶偏移量。

按中断功能分类

 | 分类                | 别称/说明                    | 典型例子                                                     |
   | :------------------ | :--------------------------- | :----------------------------------------------------------- |
   | **1. 输入输出中断** | I/O 中断                     | 磁盘读写完成、打印机缺纸、网卡数据包到达、传输出错           |
   | **2. 外中断**       | 外部中断 (区别于CPU内部异常) | **时钟中断**（时间片轮转的基础）、操作员控制中断（如Ctrl+Alt+Del）、通信中断 |
   | **3. 机器故障中断** | 硬件故障中断                 | **电源故障**、内存读写错误（主存取指令时出错）、总线错误     |
   | **4. 程序性中断**   | 内部异常 (Exception)         | **溢出**、除零错误、**用户态下试图执行核心态（内核态）指令**（非法操作码）、缺页异常 |
   | **5. 访管中断**     | 系统调用 (System Call)       | 用户程序主动请求操作系统服务（如申请内存、打开文件）。这是一种**主动**进入内核态的方式。 |



**用户模式/内核模式**

要么是执行用户态中的代码——用户模式

要么执行核心态的代码——内核模式

```mermaid
graph LR
    A["用户模式<br/>(用户态/目态)"] -->|"1.触发中断/异常<br>2.硬件自动完成模式切换<br>3.保存现场"| B["内核模式<br/>(内核态/核心态/特权态/管态)"]
    B -->|"1.中断/异常处理完毕<br>2.执行特权指令修改PSW<br>3.恢复现场"| A
    
    style A fill:#e1f5fe
    style B fill:#fff3e0
	
```



**用户程序与操作系统的接口：系统调用**

用户程序在**用户态**运行，无法直接操作硬件或执行特权指令（如读写硬盘、申请内存）。当用户程序需要这些服务时，必须请求操作系统帮忙。

- 在**用户态**执行
- 执行后**硬件自动**切换 CPU 到**内核态**
- 它是**用户态 → 内核态**的唯一主动途径

用陷入指令（访管指令）

**操作系统的启动**

1. 初始状态：刚开机时

- CPU 的 **CS（代码段寄存器）和 RIP（指令指针寄存器）** 被硬件**复位**到固定值
- 此时内存**是空的**，操作系统存储在硬盘上，操作系统从硬盘加载到内存里去运行
- CPU 需要找到第一条指令

2. CPU 执行的第一条指令来自哪里？

**答案：来自 ROM（只读存储器）中的 BIOS 程序**

为什么是 ROM？

- **ROM 的特性**：断电不丢失，出厂时写死
- **RAM（内存）的特性**：断电清空，刚开机时是空的

如果第一条指令来自空的 RAM，CPU 就会无所适从。

3. BIOS（基本输入输出系统）的作用

- **位置**：存储在主板上的 ROM 芯片中

- **执行的时机**：CPU 复位后，CS:RIP 指向 BIOS 的第一条指令

- **主要工作**：

  - 将 CS 和 RIP 复位

    从 ROM（BIOS 程序）中读取 basic input/output system

  - **硬件自检**（POST，Power-On Self-Test）：检查内存、键盘、硬盘等是否正常

  - **初始化硬件**：设置中断向量表等

  - **加载引导程序**：从硬盘的**主引导记录（MBR）** 读取 512 字节到内存

  - **跳转执行**：把控制权交给引导程序

> ┌────────────────────────────────────────────────────────┐
> │ 1. 开机 → CPU 复位 → CS:RIP 指向 ROM 中的 BIOS 入口     │
> └────────────────────────────────────────────────────────┘
>                               ↓
> ┌────────────────────────────────────────────────────────┐
> │ 2. BIOS 执行硬件自检，初始化硬件                         │
> └────────────────────────────────────────────────────────┘
>                               ↓
> ┌────────────────────────────────────────────────────────┐
> │ 3. BIOS 从硬盘读取主引导记录（MBR）到内存                │
> └────────────────────────────────────────────────────────┘
>                               ↓
> ┌────────────────────────────────────────────────────────┐
> │ 4. 引导程序从硬盘分区加载操作系统内核到内存               │
> └────────────────────────────────────────────────────────┘
>                               ↓
> ┌────────────────────────────────────────────────────────┐
> │ 5. 操作系统内核初始化（建立中断向量表、内存管理等）       │
> └────────────────────────────────────────────────────────┘
>                               ↓
> ┌────────────────────────────────────────────────────────┐
> │ 6. 操作系统加载第一个用户程序（如 shell）并切回用户态     │
> └────────────────────────────────────────────────────────┘

CPU执行的第一条指令来自哪里？





```mermaid
graph LR
	A["特殊的硬件电路"] -->|reset| B["CPU CS<br />RIP(PC) <br />芯片引脚"]
	B -->|0xFFFFFFF0|C["只读内存(ROM) <br /> BIOS程序"]
```

**BIOS启动**

1. 上电自检(POST，Power-on Self-Test)   

2. 初始化硬件设备  

3. 搜索一个操作系统来启动。例如：硬盘、U盘、光盘  

   找到有效的设备后，把第一个扇区的内容拷贝到内存中起始地址是0x00007c00，然后跳转到这个地址处

**硬盘启动**

扇区，磁盘基本的读写单位，通常一个扇区大小是512个字节5B

- 硬盘的第一个扇区称为主引导记录（MBR，Master Boot Record）
  - 引导程序（bootloader），大小446 Byte
  - 分区表，大小64Byte（早期16Byte描述一个分区）



**引导程序（boot loader）**

根据分区表的信息，寻找操作系统所在的具体分区，加载操作系统

由于空间的限制，引导程序一般需要两步

- 第一步，加载分区引导程序
- 第二步，分区引导程序执行内核的加载

```mermaid
graph LR
	A[BIOS<br />主板ROM]  --> B["boot loader(stage1)<br \>磁盘(MBR)"]
	B-->C["boot loader(stage2) <br \>磁盘分区扇区"]  -->D["kernel"]
```



中断一般是异步的，由硬件随机产生，中断信号来自 CPU 外部。

异常一般是同步的，在特殊的或出错指令执行时由 CPU控制单元产生，中断信号来源于CPU内部，内中断。

中断进一步可分为屏蔽中断和非屏蔽中断。可屏蔽中断是由程序控制器屏蔽行的中断，处

于屏蔽状态时，处理器忽略该类中断信号。

非屏蔽中断，不能由程序控制其屏蔽性。

异常又包括：

1、处理器异常

故障

陷阱

异常终止

2、编程异常

屏蔽中断

对于单处理器系统，最简单的方法就是每个进程刚刚进入临界区后，立即屏蔽所有中断，在离开之前再打开中断。

CPU只有发生时钟中断或者其他中断时，才会进行进程切换。

对于多核处理器，屏蔽中断只对执行屏蔽指令的CPU有效

对于内核来说，当使用几条指令更新变量时，将中断屏蔽是很方便的

屏蔽中断对于操作系统是一种很有用的奇数，但对于用户进程不是一种合适的通用互斥机制。

用户获得中断的权限会有系统风险。一个进程禁止中断后，一直没有开放中断，会影响系统的正常运行。

中断/异常混淆的概念

- 操作系统启动时，分配和初始化一个跳转表 

​	这个叫做中断向量表、异常表、陷入表

- 中断来自处理器芯片外部， 异常源自处理器内部

- 异常包括：陷阱和系统调用、故障、终止

  例如：缺页故障、缺页异常、缺页表示同一含义

  

  主义关于部分资料混用中断和异常的问题  
  Intel手册中将中断分为内中断和外中断，内中断与异常表示同一含义

  | Class     | Cause                         | Async/sync | Return Behaviour        |
  | --------- | ----------------------------- | ---------- | ----------------------- |
  | Interrupt | Signal fromI I/O device       | Async      | Always return to next   |
  | Trap      | Intentional exception         | Sync       | Always return to next   |
  | Fault     | Potentially recoverable error | Sync       | Might return to current |
  | Abort     | Nonrecoverable error          | Sync       | Never returns           |
  |           |                               |            |                         |

  

中断

当前 CPU 执行完指令，中断引脚电压变高说明有中断

然后去响应中断

时钟中断

I/O中断请求

不同中断信号

中断向量表

中断处理程序处于内核态

![](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/dfc01753df0f69c7b2be3aaf2ac24667df63af7b54165d5495774ccc83b32e15.jpg)

陷阱

![](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/b78e84d58dc676643c80c101240c825e813e9e9047cf52b9742db6689be3753d.jpg)

故障

缺页故障、缺页异常——地址不在内存中

保护异常——地址不合法

因此需要再次取一次故障指令

![](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/47e683f97cfcb1e83fd0f5380803eae1066353b0d0b847f7b75dd6b2e0db8779.jpg)

中止

![](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/4a31576b14a791537c99077ff350c866216ba52927e7321a2fa4f99fbff197d1.jpg)

异常表

存储在内存中

异常号相当于偏移量

找到异常处理程序

![](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/8c1cdb8de23cdc4bf55f3d3ee93d37ff2f4bc25332daeb2d15e48f53afcb64ff.jpg)

![](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/3e8b269fca3357d31be03b7a3ce82320dbe231c6298538f573b31b85ae00d202.jpg)

图8-9x86-64系统中的异常示例  

<table><tr><td>异常号</td><td>描述</td><td>异常类别</td></tr><tr><td>0</td><td>除法错误</td><td>故障</td></tr><tr><td>13</td><td>一般保护故障</td><td>故障</td></tr><tr><td>14</td><td>缺页</td><td>故障</td></tr><tr><td>18</td><td>机器检查</td><td>终止</td></tr><tr><td>32~255</td><td>操作系统定义的异常</td><td>中断或陷阱</td></tr></table>

陷阱和系统调用

系统调用

操作系统作为用户和计算机硬件之间的接口，为方便用户调用这些内核服务功能需要提供一些简单易用的服务。主要包括命令接口和程序接口，其中程序接口由一组系统调用组成

用户态和核心（内核）态

用户不能直接访问磁盘

只能通过操作系统提供的接口

操作系统替用户访问磁盘

执行系统调用（请求操作系统内核的服务），程序必须执行特殊的陷阱指令（syscall x86）

可以理解为一种可供程序调用的特殊函数，应用程序可以通过系统调用来获得操作系统内核的服务

<table><tr><td>普通应用程序</td><td>可直接进行系统调用，也可使用库函数。有的库函数涉及系统调用，有的不涉及</td></tr><tr><td>编程语言</td><td>向上提供库函数。有时会将系统调用封装成库函数，以隐藏系统调用的一些细节，使程序员编程更加方便。</td></tr><tr><td>操作系统</td><td>向上提供系统调用，使得上层程序能请求内核的服务</td></tr><tr><td>裸机</td><td></td></tr></table>

![](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/23b678a97c5812bdc937a6dc92b48374e1ad9c2c4b7ad25dc8f45d764b201265.jpg)

系统调用（按功能分类） ：



由于应用程序运行在用户态，而系统调用服务例程运行在内核态，因此应用程序布恩那个直接调用内核发服务例程，而是通过执行一条叫做“访管指令”（陷入指令/trap指令）的机器指令来实现调用的，这条指令的功能时引发一个编程异常，促使 CPU从用户态切换到内核态，即系统调用入口程序

根据向量号查找中断描述表，得到该异常的中断处理程序入口地址

执行 system_call()函数，找到这个系统调用服务例程的入口地址

程序的特权级从用户模型提升至内核级

一旦进入内核，系统可以执行任何需要的特权操作

当系统完成后，执行从陷阱返回（return-from-trap）指令

因此陷阱指令是用户使用系统调用的窗口。

用户->read->访问磁盘

![](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/f541eaa76f03a3c47a4acbdfad91f50ea73e023de24545084f09bfe81f8b870d.jpg)

Sys_call 是在内核态

系统调用函数在内核态

执行哪一个系统调用？ 系统调用号

![](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/340325887d6ef29dce84caf31271f6e50e64721467c65932bf5bd69766d384e9.jpg)

<table><tr><td>编号</td><td>名字</td><td>描述</td><td>编号</td><td>名字</td><td>描述</td></tr><tr><td>0</td><td>read</td><td>读文件</td><td>33</td><td>pause</td><td>挂起进程直到信号到达</td></tr><tr><td>1</td><td>write</td><td>写文件</td><td>37</td><td>alarm</td><td>调度告警信号的传送</td></tr><tr><td>2</td><td>open</td><td>打开文件</td><td>39</td><td>getpid</td><td>获得进程ID</td></tr><tr><td>3</td><td>close</td><td>关闭文件</td><td>57</td><td>fork</td><td>创建进程</td></tr><tr><td>4</td><td>stat</td><td>获得文件信息</td><td>59</td><td>execve</td><td>执行一个程序</td></tr><tr><td>9</td><td>mmap</td><td>将内存页映射到文件</td><td>60</td><td>exit</td><td>终止进程</td></tr><tr><td>12</td><td>brk</td><td>重置堆顶</td><td>61</td><td>halt4</td><td>等待一个进程终止</td></tr><tr><td>32</td><td>dup2</td><td>复制文件描述符</td><td>62</td><td>kill</td><td>发送信号到一个进程</td></tr></table>

Linux x86-64系统中常用的系统调用示例

控制寄存器有一位记录了当前模式是用户模式还是内核模式

为什么需要划分成用户模式和内核模式？

>- 进程在用户模式下不运行执行特权指令/操作  
>
> 例如：停止处理器，发起一个I/O操作，关中断
>
>- 不允许在用户模式下直接引用内核区域的代码和数据
>
>- 用户模式->内核模式通过中断、故障或者陷入系统调用的方式

![](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/6df2c8106dd4fe2552e1c66a682d466406fbe481810f4e6b4594199d20da974c.jpg)

![](https://chenalna.oss-cn-hangzhou.aliyuncs.com/img/309bb212126a35535f1ad1913041d8a152f86709dc8e47401d52a42c162f064c.jpg)
