Article

操作系统-CH1.3-操作系统的运行环境

操作系统-CH1.3-操作系统的运行环境,待补充摘要。

June 11, 2026 修考 26 min read

image-20260611101937897

操作系统运行环境(深度通关笔记)

知识导图与起承转合

操作系统的运行环境是连接“计算机硬件”与“上层应用”的桥梁。理解它的关键在于一条核心主线

  1. 上电启动:计算机如何通过OS引导,将常驻内存的OS内核运行起来?
  2. 空间隔离:内核常驻主存后,如何划分内核空间用户空间以实现隔离?
  3. 硬件支撑:硬件上通过PSW寄存器的模式位建立CPU双重工作模式,并区分特权指令与非特权指令
  4. 安全跨越:处于用户态的进程如何安全地跨越屏障获取内核服务?答案是系统调用中断/异常处理(通过 Trap 变态进入,通过 IRET 变态返回)。 612

一、 操作系统的引导 (OS Bootstrapping)

操作系统的引导是指从计算机启动电源进入操作系统、完成初始化并常驻主存的完整过程。

1. 引导的 SOP (标准作业程序)

为了方便记忆,我们可以将引导过程高度概括为一句话:

电源自检BIOS初始化MBR定位PBRPBR加载内核\text{电源自检} \longrightarrow \text{BIOS初始化} \longrightarrow \text{MBR定位PBR} \longrightarrow \text{PBR加载内核}

ChatGPT Image 2026年6月11日 10_57_51

2. 核心概念辨析:MBR vs PBR

在你的手写笔记中,你提到了“不知道 MBR”。这里为你进行最精准的解析:

  • MBR (Master Boot Record,主引导记录)
    • 位置:整个磁盘的 00 号扇区(即最开始的第一个扇区,一般为 512 Bytes512\text{ Bytes})。
    • 组成:包含磁盘引导程序分区表信息 (Partition Table)
    • 作用:分区表记录了磁盘上每个分区的盘符(如 C、D)、起始地址和状态。MBR 的引导程序会读取分区表,找出其中的活动分区(主分区/系统分区),并把控制权转交给该分区的引导程序。
  • PBR (Partition Boot Record,分区引导记录)
    • 位置:每个系统分区(活动分区)的 00 号扇区
    • 作用:存放操作引导程序。当 MBR 找到活动分区(例如 C 盘)后,就会调入该分区的 PBR,由 PBR 中的引导程序去定位并加载该分区中操作系统的内核代码。

3. 完整的引导四步法

  1. 电源自检 (POST): 计算机开机,电源送电,CPU 硬件重置。首先进行硬件自检,确保 CPU、主板、内存等关键硬件设备无物理故障并准备就绪。

  2. 激活 BIOS: CPU 去执行主板 ROM 芯片中的 BIOS (Basic Input/Output System) 程序。BIOS 负责初始化基础硬件,并进一步对外部设备进行自检。

    ⚠️ 考研/期末避坑指南:主存通常由 RAM(随机存取存储器)和 ROM(只读存储器)共同组成。存放 BIOS 程序的 ROM 也是主存的一部分。因此在回答“主存由什么组成”时,若选项中同时存在“RAM”和“RAM + ROM”,应当选择后者。

  3. 读取 MBR: BIOS 自检完成后,按照预设的启动顺序(如硬盘、U盘),读取启动硬盘的 00 号扇区 —— MBR。MBR 中的磁盘引导程序被调入内存执行,开始解析分区表。

  4. 读取 PBR 并加载内核: 根据分区表找到操作系统的系统分区(活动分区,如 C 盘),读取该分区的 00 号扇区 —— PBR。PBR 中的操作引导程序执行,定位到操作系统内核在磁盘中的位置,将其加载到主存的内核空间中,并使其常驻主存。引导过程宣告结束。

4. 经典例题

【例题 1】(多系统引导)某计算机中安装了 Windows 和 Linux 双系统。当用户在开机选择菜单中选择启动 Windows 时,计算机接下来进行的操作是( )。

A. 激活主板 ROM 中的 BIOS 程序

B. 读取磁盘 00 号扇区的 MBR

C. 将 C 盘的 00 号扇区(PBR)调入主存执行

D. 直接执行主存中常驻的 Windows 内核代码

  • 【深度解析】: 开机选择菜单出现时,说明 BIOS 已经运行完毕,且 MBR 中的引导程序已经读取了分区表并呈现了多系统选项。当用户选择了 Windows(假设在 C 盘),MBR 的磁盘引导程序将根据分区表找到 C 盘的起始地址,读取其 00 号扇区(即 PBR)调入主存执行,进而由 PBR 引导程序加载 Windows 的内核。
    • 【答案】C

二、 操作系统内核 (OS Kernel)

操作系统的引导结束后,内核便驻留在主存中。

1. 内核的定义与空间划分

  • OS内核:是操作系统中与硬件紧密相关、最核心、最基础的模块。它负责管理和协调系统的各种软硬件资源。
  • 空间隔离: 为了保证系统的稳定,主存被逻辑上划分为两个区域:
    • 内核空间 (Kernel Space):存放操作系统内核代码和数据的区域,常驻内存。
    • 用户空间 (User Space):存放普通用户进程的代码和数据的区域,按需加载和调出。

2. 深度探讨:内核空间与用户空间的划分,仅仅是“空间隔离”吗?

💬 针对你手写笔记中的红字提问“在 MIT 的 6.S081 课程中,我记得 kernel space 与 user space 的区分主要是为了 safety,可以隔离权限,这里的说法似乎只是空间的隔离,真的对吗?”

你是完全正确的!课件中的“空间隔离”只是一种物理/表面的呈现方式,其底层和本质目的就是“安全 (Safety)”与“权限隔离 (Privilege Isolation)”。

  1. 硬件级强制安全(硬件盾牌): 如果单纯只是“空间划分”,用户进程完全可以通过物理地址指针直接读写内核地址空间(例如恶意修改页表或读取其他进程密码)。 为了防止这种崩溃,CPU 必须配合硬件机制(如 MMU 内存管理单元页表特权级位,即 RISC-V 中的 U/S 属性,x86 中的 Supervisor 标志位)来进行强制隔离。
  2. 两级防御体系
    • 当 CPU 处于用户态时,MMU 会在硬件层面拒绝任何对“内核地址空间”的访问,并触发硬件异常(Page Fault)。
    • 只有当 CPU 通过安全受控的通道(如系统调用、Trap)切换到内核态时,才能访问内核空间。

因此,“空间隔离”是表象,“安全与权限防卫”是本质目的。

3. 内核的核心架构与支撑功能

内核通常由以下两大类模块组成:

+-------------------------------------------------------------+
|                         OS 内核                             |
|  +-------------------------------------------------------+  |
|  |             资源管理功能 (大内核/宏内核)              |  |
|  |     [ 进程管理 ]     [ 存储器管理 ]     [ 设备管理 ]  |  |
|  +-------------------------------------------------------+  |
|  |                     支撑基础功能                      |  |
|  |     [ 原语 (不可中断) ]  [ 中断处理 ]  [ 时钟管理 ]   |  |
|  +-------------------------------------------------------+  |
+-------------------------------------------------------------+

A. 资源管理功能(传统的宏内核核心)

  1. 进程管理:负责进程的创建、撤销、同步与调度(如 Linux 中的进程调度算法)。
  2. 存储器管理:负责物理内存与虚拟内存的管理、页表建立、地址映射等。
  3. 设备管理:提供各种硬件设备的驱动程序,处理 I/O 请求。

B. 支撑基础功能(内核最底层的基石)

  1. 原语 (Primitive)
    • 定义:处于操作系统最低层,由若干条指令组成的程序段。
    • 核心特性原子性(Atomic)。原语的执行是一气呵成、不可被打断的(通常在单核 CPU 上通过关中断实现)。
    • 应用:运行时间短、调用频繁。Linux 中常见的操作如 fork()exec()wait()open() 的底层关键步骤均为原语。
  2. 中断处理: 整个现代操作系统都是“中断驱动”的。系统调用、设备输入(键盘、鼠标)、时钟滴答等都依赖中断处理机制。
  3. 时钟管理: 利用硬件时钟产生高频的“时钟滴答/中断”(Tick),用于:
    • 实现多路复用中的“时间片轮转调度”。
    • 维护系统时间和各种定时器。

4. 经典例题

【例题 2】(原语特性)下列关于“原语”的说法中,正确的是( )。

A. 原语是由多条非特权指令构成的,因此可以在用户态下执行

B. 原语在执行过程中如果遇到外部中断,会立刻暂停并转去执行中断处理程序

C. 原语的原子性是为了防止多进程并发导致系统核心数据结构不一致

D. 原语的执行时间通常很长,因此不常驻内存

  • 【深度解析】
    • A 错:原语涉及内核数据结构的操作,必须在内核态下执行。
    • B 错:原语执行期间是不可被打断的,硬件会屏蔽外部中断,直到原语执行完毕。
    • C 对:原语的原子性正是为了确保对内核关键共享资源(如进程控制块 PCB 链表、内存分配表)的修改不会因进程切换或中断导致不一致。
    • D 错:原语必须常驻内存,且因为不可被打断,其运行时间必须非常短暂,否则会严重拖慢系统的实时响应。
    • 【答案】C

三、 CPU 的双重工作模式与 PSW 寄存器

由于内核空间与用户空间的存在,CPU 必须具备不同的工作模式,以决定当前能访问哪些内存、执行哪些指令。

1. 双重模式对比

根据 CPU 运行时的特权级,主要分为以下两种状态:

维度用户态 (User Mode / 目态)内核态 (Kernel/Supervisor Mode / 管态)
模式位的值Mode Bit=1\text{Mode Bit} = 1Mode Bit=0\text{Mode Bit} = 0
可访问的内存仅限于用户空间用户空间内核空间 均可访问
可执行的指令只能执行非特权指令可以执行所有指令(包括特权指令)
硬件代表普通的用户进程(App)操作系统内核(OS Kernel)

2. 深度剖析:程序状态字 (PSW) 寄存器与模式位

💬 针对你手写笔记中的红字提问“PSW:状态字 register,模式位。这个 register 我不熟悉。”

没关系,我们用最直观的方式来揭开它的面纱。

A. 什么是 PSW?

PSW (Program Status Word,程序状态字) 并不是指某一个特定的寄存器名称,而是指一类用来保存当前 CPU 运行状态和控制信息的硬件寄存器组合

  • x86 架构中:它对应的是 EFLAGS (32位) 或 RFLAGS (64位) 寄存器。
  • RISC-V 架构中:它对应的是 mstatus (Machine Status)、sstatus (Supervisor Status) 等寄存器。

B. PSW 寄存器里装了什么?

PSW 寄存器在硬件层面上由很多“位 (Bit)”组成,主要分为三大类信息:

  1. 状态标志 (State Flags):记录上一次算术或逻辑运算的结果。
    • ZF (Zero Flag):结果是否为 0。
    • SF (Sign Flag):结果是否为负。
    • CF (Carry Flag):是否有进位/借位。
  2. 控制标志 (Control Flags):控制 CPU 的行为。
    • IF (Interrupt Enable Flag):是否允许响应外部中断(开中断/关中断)。
  3. 特权级/模式位 (Privilege/Mode Bits)这是理解工作模式的关键!
    • 在 x86 中,使用 2 Bits2\text{ Bits} 记录 CPL (Current Privilege Level),范围是 030 \sim 3。其中 00 代表特权级最高(内核态),33 代表特权级最低(用户态)。
    • 在 RISC-V 中,使用 2 Bits2\text{ Bits} 记录当前的模式(1111 Machine, 0101 Supervisor, 0000 User)。

C. 工作原理是什么?

每次 CPU 译码并准备执行一条指令时,CPU 内部的硬件控制逻辑会自动读取 PSW 寄存器中的模式位

  • 若模式位显示为“用户态”,而指令寄存器里存放的是“特权指令”(如修改页表基址寄存器的指令),CPU 硬件会立刻拒绝执行,并强制抛出一个异常(General Protection Fault / 保护性故障),将其交给内核处理。

3. 经典例题

【例题 3】(408真题变形)下列选项中,会导致 CPU 从用户态切换到内核态的是( )。

I. 编写的程序中调用了系统级 API(如 printf

II. 正在运行的进程中发生了一次“整数除以0”的运算错误

III. 外部键盘被按下,产生了一个按键信号

IV. 执行了一条修改 PSW 中控制标志位的特权指令

A. 仅 I, II, III

B. 仅 I, III

C. 仅 II, IV

D. I, II, III, IV

  • 【深度解析】
    • I 正确:调用 printf 底层需要发起 write() 系统调用,执行陷阱指令,引发自陷异常进入内核态。
    • II 正确:发生了严重的计算错误,CPU 会自动触发“除以0异常”(故障),强制切换到内核态由 OS 处理(通常是终止该进程)。
    • III 正确:外部设备硬件中断产生,CPU 会在当前指令执行完毕后检测并响应,进入内核态的中断处理程序。
    • IV 错误:用户态下无法成功执行修改 PSW 的特权指令。如果用户程序敢执行该指令,会被 CPU 硬件拦截并报错(报异常),这也是因为发生了异常才进入内核态,而不是因为“成功执行了该特权指令”才切换的。
    • 【答案】A

四、 特权指令与非特权指令

基于 CPU 的双重工作模式,计算机指令集被严格分为了两类。

1. 定义与指令分类

                       计算机指令集 (Instruction Set)
                                  |
         +------------------------+------------------------+
         |                                                 |
  特权指令 (Privileged)                            非特权指令 (Non-privileged)
  - 只能在内核态执行 ($\text{Mode}=0$)              - 可以在任何状态下执行 ($\text{Mode}=1$ 或 $0$)
  - 涉及系统底层资源修改                            - 安全、局部、不影响整体系统的指令
  - 常见指令:                                      - 常见指令:
    * 关中断/开中断 (CLI/STI)                         * 算术运算 (ADD, SUB)
    * 修改页表寄存器 (CR3/satp)                       * 逻辑运算 (AND, OR)
    * 启动 I/O 设备                                   * 分支跳转 (JMP, BEQ)
    * 停机 (HLT)                                     * 访存读写 (限用户空间)

2. 违规执行特权指令的后果

如果一个普通用户程序(处于用户态)试图执行特权指令(例如直接通过汇编执行 CLI 关闭中断),硬件和 OS 的联动反应如下:

用户程序试图执行特权指令CPU 硬件检测到 Mode Bit = 1拒绝执行并触发“非法指令异常”\text{用户程序试图执行特权指令} \longrightarrow \text{CPU 硬件检测到 Mode Bit = 1} \longrightarrow \text{拒绝执行并触发“非法指令异常”}

\downarrow

操作系统捕获该异常(转为内核态)跳转到异常处理程序报错、强行杀死该进程\text{操作系统捕获该异常(转为内核态)} \longleftarrow \text{跳转到异常处理程序} \longleftarrow \text{报错、强行杀死该进程}

3. 经典例题

【例题 4】(指令判断)下列指令中,不属于特权指令的是( )。

A. 清内存指令

B. 停机指令(HLT)

C. 关中断指令(CLI)

D. 算术移位指令(SAR)

  • 【深度解析】
    • A、B、C 均涉及对整机状态、硬件运行、以及全局内存的控制,属于特权指令。
    • D “算术移位”只是纯粹的寄存器数据处理,完全不影响其他进程和硬件的安全,属于普通的非特权指令。
    • 【答案】D

五、 系统调用 (System Call)

当用户程序需要用到操作系统提供的高级服务(如读写文件、创建进程、收发网络包)时,由于隔离,它无法直接调用内核函数。这时,系统调用便充当了安全通道。

1. 系统调用的分类

常见系统调用接口在 Unix/Linux 体系下的分类:

  1. 文件操作open()read()write()close()lseek()
  2. 进程控制fork()(复制并创建新进程)、execve()(加载新映像)、exit()(退出)、wait()(等待子进程)
  3. 进程间通信pipe()(管道)、shmget()(共享内存)

2. 深度剖析:xv6 视角下的系统调用全景流程

💬 针对你手写笔记中的红字提问“我记得自己在写 xv6 的 OS 时,好像要通过 trap 才能进入内核,使用特权指令吧。”

还有:“我记得在 xv6 中,read 要在一个中断中调用一个固定地址的代码运行才能实现。read 操作后,由内核执行 IRET 指令,设置 CPU 模式位为1,返回用户态。”

你的记忆非常精准,并且直击现代操作系统的底层设计灵魂! 我们把 xv6 中 read() 的完整生命周期画成下面这张三层全景图

ChatGPT Image 2026年6月11日 10_55_49

关键技术内幕解析:

  1. “自陷/陷入 (Trap)”并不是指某一条具体的指令,而是一种“现象”和“机制”
    • 真正由用户代码发出的指令是:软中断指令/陷阱指令(如 x86 中的 int 0x80 / syscall,RISC-V 中的 ecall)。
    • 由于执行了这条指令,CPU 硬件被迫产生了一个自陷异常(Trap),导致 CPU 模式位瞬间变为了 00(进入内核态)。
  2. “固定地址代码”: 为了保证内核的安全,用户程序绝对不允许指定内核的任意代码地址去跳转(否则会产生严重的安全漏洞)。 CPU 硬件强制规定:触发 Trap 时,只能跳转到内核预先在寄存器中配置好的、唯一的、固定入口地址(在 RISC-V 中由 stvec 寄存器保存,在 xv6 中对应 trampoline 页面的固定虚拟首地址)。这个固定入口也就是内核保护的第一道大门。
  3. “IRET 指令的魔法”: 当内核完成了 read 的服务后,内核不能直接用常规的 JMP 返回用户态(因为用户态下模式位为 1,常规指令无法把模式位改回去)。 内核必须执行一条特殊的特权返回指令:IRET (Interrupt Return) 或 RISC-V 中的 sret。该指令执行时,硬件会原子地(不可分割地)完成两件事:
    • 把 PSW 中的模式位恢复为 11
    • 把程序计数器 PC 恢复为之前保存的用户态断点,从而顺利回归用户世界。

3. 典型真题

【例题 5】(系统调用与函数调用)下列关于系统调用的说法中,错误的是( )。

A. 系统调用的执行过程涉及从用户态到内核态的转换,其开销远大于普通的函数调用

B. 用户程序可以通过在代码中直接写内核函数的物理地址来直接发起系统调用

C. 系统调用的参数传递通常通过寄存器进行,以便在不同的工作模式之间共享数据

D. 在系统调用返回时,内核使用特殊的特权指令(如 IRET)恢复用户的运行上下文并切回用户态

  • 【深度解析】
    • A 正确:系统调用涉及特权级切换、寄存器上下文保存、内核栈切换以及查表分发,开销极大。普通函数调用(如 C 语言中的 foo())只涉及栈帧移动和 call 指令,速度极快。
    • B 错误:处于安全防卫,用户程序绝不能直接写内核函数的任何物理或虚拟地址。只能通过寄存器放置调用号,依靠硬件强制的固定入口(Trap 向量)进入内核。
    • C 正确:模式切换时,栈会发生切换(从用户栈切换到内核栈),因此通过通用寄存器(如 a0a1 等)传递参数是最直接和高效的。
    • D 正确:内核通过 IRET/sret 实现原子级的状态回归。
    • 【答案】B

六、 中断和异常的处理 (Interrupt & Exception)

前面我们提到过:“现代操作系统是由中断驱动的”。那么,究竟什么是中断,它和异常有什么本质区别?

1. 中断 vs 异常的黄金分类体系

很多同学在考试时经常把中断(外中断)和异常(内中断)搞混。我们可以用一个最核心的区别来划分:

  • 信号源自 CPU 外部 \Longrightarrow 中断 (Interrupt / 外中断 / 硬件中断)
  • 信号源自 CPU 内部(因执行指令引发) \Longrightarrow 异常 (Exception / 内中断 / 软件中断)
                                  中断与异常的分野
                                         |
         +-------------------------------+-------------------------------+
         |                                                               |
    外中断 (中断)                                                   内中断 (异常)
  - 信号源自 CPU 外部硬件                                        - 信号源自 CPU 内部指令执行
  - 与当前执行的指令无关 (异步)                                   - 与当前执行的指令有关 (同步)
  - 常见类型:                                                   - 常见类型:
    * 键盘输入、鼠标移动                                           * 故障 (Fault):可修复,如缺页
    * 磁盘 I/O 读写完成信号                                        * 自陷 (Trap):故意为之,如系统调用
    * 时钟滴答信号 (Tick)                                          * 终止 (Abort):崩溃,如除0、非法指令

异常的三大细分类型:

  1. 故障 (Fault)
    • 特点:因执行某指令出现问题引起,但可能被修复
    • 断点位置指向当前指令。如果修复成功(如缺页异常装入页面后),CPU 会重新执行该指令。
  2. 自陷 (Trap)
    • 特点:程序员故意设置的异常事件,用于主动请求 OS 服务。
    • 断点位置指向下一条指令。处理完后,CPU 接着往后运行。
  3. 终止 (Abort)
    • 特点:发生了致命的硬件错误或不可恢复的软件崩溃。
    • 断点位置:无。程序直接被强行终止。

2. 异常与中断的处理生命周期

ChatGPT Image 2026年6月11日 11_00_17

⚠️ 考研高频考点:断点(返回地址)保存在哪里?

  1. 对于用户态程序:发生中断/异常的一瞬间,硬件会自动将当前的断点(PC)和运行状态(PSW)保存在内核栈(Kernel Stack)中或专用的硬件寄存器(如 RISC-V 的 sepc)中。
  2. 中断处理程序的最后一步:在将寄存器恢复后,由 IRET / sret 将其从保存位置弹回 CPU,恢复现场。

3. 典型真题

**【例题 6】**在支持虚拟存储器的计算机中,当执行一条访存指令发生“缺页”时,系统将引发( );

而当时钟中断发生时,系统将引发( )。

处理完后,前者的返回地址是( ),后者的返回地址是( )。

A. 异常,中断,当前指令地址,下一条指令地址

B. 中断,异常,下一条指令地址,当前指令地址

C. 异常,中断,下一条指令地址,下一条指令地址

D. 中断,异常,当前指令地址,当前指令地址

  • 【深度解析】
    • “缺页”是由于执行访存指令发现页面不在内存,是由 CPU 内部执行指令引发的,属于异常(内中断/故障)。缺页异常处理完(页面调入)后,必须重新执行刚才那条发生缺页的访存指令,因此返回地址是当前指令地址
    • “时钟中断”源自外部硬件定时器,属于中断(外中断)。外部中断由于与指令执行无关,是在当前指令执行完毕后被检测到的,因此返回地址是下一条指令地址
    • 【答案】A

💡 本章通关复习法宝

在复习“操作系统的运行环境”这一章时,牢记这四句话:

  1. 引导重在逻辑:BIOS 读 MBR \rightarrow 引导程序查分区表 \rightarrow 读取活动分区的 PBR \rightarrow 把内核加载进主存。
  2. 内核在于防卫:划分内核和用户空间,硬件通过 MMU 和 PSW 的模式位进行强制安全防线(隔离)。
  3. 两态切换靠 Trap 和 IRET
    • 用户态 \rightarrow 内核态:通过中断/异常/Trap,硬件强制将 Mode Bit=0\text{Mode Bit} = 0,并跳转至固定地址。
    • 内核态 \rightarrow 用户态:通过特权返回指令 IRET/sret,硬件原子地将 Mode Bit=1\text{Mode Bit} = 1,返回断点。
  4. 中断区分内外源:信号源自 CPU 外部是中断,源自 CPU 内部是异常。故障重执当前,自陷、外中断直奔下一。