操作系统课程(二)—— 操作系统的硬件环境与系统调用

课程:北京大学软件与微电子学院《操作系统》 讲师:陈向群 学期:2008-2009 第一学期 对应教材章节:第二章 操作系统的硬件环境 + 第三章 用户接口与作业管理(前半) 关联笔记:操作系统课程(一)—— 绪论与操作系统概述


一、本章定位

操作系统是硬件功能的第一层软件延伸,OS 设计者必须深刻理解计算机基本结构。硬件环境以分散的形式同各种 OS 管理功能相结合。

本章讨论六个核心硬件机制:

  1. 中央处理器(CPU) —— 特权级、状态切换
  2. 存储系统 —— 层次结构、保护、地址转换
  3. 中断机制 —— OS 的”驱动齿轮”,事件驱动的基础
  4. I/O 系统 —— 程序控制 / 中断驱动 / DMA / 通道
  5. 时钟与时钟队列 —— 多道系统的”心跳”
  6. 缓冲技术 —— 解决速度不匹配

二、中央处理器(CPU)

2.1 CPU 构成

  • 运算器:算术逻辑运算,计算的核心
  • 控制器:取指令、维护 CPU 状态、CPU 与内存交互
  • 寄存器 + 高速缓存

2.2 两类寄存器

类型用户可见典型寄存器作用
用户可见寄存器✅ 机器语言直接引用数据寄存器(通用)、地址寄存器(index/segment/stack pointer)、条件码寄存器编译器分配,减少访存次数
控制和状态寄存器⚠️ 大部分不可见,特权模式访问PC(程序计数器)、IR(指令寄存器)、PSW(程序状态字)控制处理器操作,由 OS 特权代码使用

2.3 特权指令与非特权指令

  • 特权指令:只能由 OS 使用的指令(如 I/O 指令、关中断、设置时钟、加载 MMU 等)
  • 为什么要区分? 多道程序设计必须隔离 OS 和用户程序,实现保护和控制
  • 特权指令一般引起处理器状态切换

2.4 CPU 的两种状态(管态 vs 目态)

维度管态(内核态 / 特权态)目态(用户态)
权限可执行全部指令,访问所有资源只能执行非特权指令
程序操作系统内核用户程序

Pentium 的 PSW 关键标志位:

  • CF / ZF / SF / OF —— 标准条件位(进位/零/符号/溢出)
  • TF —— 陷阱标志(单步调试)
  • IF —— 中断允许标志
  • IOPL —— I/O 特权级别
  • VIF / VIP —— 虚拟中断相关

2.5 CPU 状态转换

目态 ────中断(广义)────→ 管态
管态 ────设置 PSW ────→ 目态
  • 目态→管态的唯一途径:中断(包括系统调用的访管指令 INT / TRAP / SYSCALL)
  • 管态→目态的途径:设置程序状态字(一条特殊指令)

访管指令:供用户调用操作系统功能的特殊指令(INT、TRAP、SYSCALL)。


三、存储系统

3.1 存储器层次结构

三个核心问题:容量、速度、成本 —— 三者互相制约。

寄存器   ← 最快,最小,最贵
高速缓存
主存(内存)
辅存(外存) ← 最慢,最大,最便宜

存储访问局部性原理 —— 存储器层次结构能工作的根本原因:

  • 时间局部性:循环、子程序调用 → 重复存取相同指令集合
  • 空间局部性:数据存取在短时间内稳定在局部区域
  • 处理器主要和存储器的局部打交道

3.2 存储分块

  • 最小单位:二进位(bit)
  • 最小编址单位:字节(byte)
  • 为简化分配管理,存储器分成物理页(Page)
  • 块大小:512B / 1KB / 4KB / 8KB / … / 4MB / 16MB

3.3 存储保护设施

多道系统中,必须保护各进程的内存区域不被互相侵犯。

两种硬件支持机制:

(1)界地址寄存器(界限寄存器)

  • 设置一对下限/上限寄存器(或基址+限长寄存器),存放作业地址范围
  • 每次访存时硬件自动比较,越界则产生越界中断
  • 实现简单,但只支持连续分配

(2)存储键

  • 每个存储块有一个保护键(若干位)
  • OS 给每个作业分配唯一键号,对应块的存储键也置成该号
  • PSW 中有”钥匙”域,每次访存比较块键与钥匙
  • 匹配 → 允许访问;不匹配 → 拒绝并报警

3.4 地址转换机制

虚拟地址(逻辑地址) ──MMU──→ 物理地址
  • 虚拟地址:处理器生成的指令/数据地址
  • MMU(内存管理单元):专用硬件,完成地址转换
  • 转换由软硬件结合完成

分页机制是地址转换的典型实现(x86 有 PDE/PTE 两级页表)。


四、中断技术

中断对于操作系统的重要性,就像机器中的驱动齿轮一样。 —— 操作系统是由”中断驱动”的

作用:

  • 及时处理设备中断请求
  • 捕获用户程序的系统功能调用
  • 防止用户程序的破坏性活动
  • ……

4.1 中断的概念

CPU 对系统中某个事件作出的反应:

  1. 暂停正在执行的程序
  2. 保留现场
  3. 自动转去执行相应事件的处理程序
  4. 处理完成后返回断点,继续执行

三大特点:

  • 随机发生
  • 可恢复
  • 自动处理

4.2 中断的分类

按中断源划分:

类型引发者典型例子
I/O 中断设备控制器磁盘读写完成、键盘输入
时钟中断定时器时间片到、定时任务
硬件故障中断硬件异常电源掉电、内存校验错
程序性中断(异常)指令执行出错除零、越界、非法指令、页故障
系统服务请求(访管中断)访管指令系统调用(int $0x80, syscall)

4.3 中断向量与中断向量表

  • 中断向量:存放中断处理程序入口地址(段地址+偏移)的一组数据
  • 中断向量表:一张表,每个表项对应一个中断号,包含中断向量
  • 中断响应:CPU 收到中断请求 → 查中断向量表 → 跳转处理程序

4.4 中断优先级与中断屏蔽

  • 每个中断源有一个优先级
  • 高级中断可以打断低级中断处理程序 → 中断嵌套
  • 中断屏蔽:PSW 中的中断允许位可以关闭某些中断
    • 可屏蔽中断 vs 不可屏蔽中断(NMI,如电源故障)

4.5 中断处理的一般过程(8 步)

硬件阶段:                          软件阶段:
(1) 中断源发中断请求          (5) 查中断向量表,跳转处理程序
(2) 处理器判优、响应            (6) 中断处理程序工作
(3) 关中断、保存断点             (7) 中断返回指令
(4) 保存上下文、切换到管态      (8) 恢复上下文、恢复 PSW

硬件完成: 15(中断请求到跳转入口) 软件完成: 68(处理程序主体到返回)

4.6 五类典型中断处理

(1)I/O 中断

  • 正常结束 → 唤醒等待进程,继续下一步操作
  • I/O 异常 → 重试,超过上限判定硬件故障

(2)时钟中断——系统的”心跳”

  • 维护软件时钟(定时任务、时间配额)
  • 处理器调度(时间片到 → 调度新进程)
  • 控制系统定时任务(死锁监测、记账、审计)
  • 实时处理

(3)硬件故障中断

  • 保存现场、告警、诊断
  • 高可靠系统尝试恢复
  • 蓝屏、内存转储(故障快照)

(4)程序性中断

  • 系统扩展功能处理(如页故障 → 虚存换入)
  • 用户程序自行处理(如算术错误,OS 提供”绿色通道”)
  • 调试断点/单步跟踪

(5)系统服务请求(访管中断)

  • 由处理器专用指令激发(INT / SYSCALL)
  • 现代 OS 通过 API 封装,不直接暴露系统调用指令

4.7 IA32 (x86) 的中断机制

基本概念辨析

  • 中断:硬件信号引发,可屏蔽/不可屏蔽
  • 异常:指令执行引发(如除零),约 20 种,部分带硬件出错码
  • 系统调用:异常的一种(int $0x80),用户态→内核态唯一入口

中断描述符表 IDT(三种门描述符)

门类型特点
任务门任务切换用(Linux 未使用)
中断门进入后自动关中断(IF=0)
陷阱门进入后不关中断(系统调用用)

硬件处理过程(7 步)

  1. 确定中断/异常向量 i
  2. 读 IDTR → 取第 i 个中断描述符
  3. 读 GDTR → 取段描述符(得处理程序基址)
  4. 特权级检查(CPL ≤ 段描述符 DPL,CPL ≤ 门描述符 DPL)
  5. 特权级变化 → 切换栈(TSS)
  6. 硬件压栈保存上下文(含出错码)
  7. 通过段基址 + 段内偏移 → 跳转处理程序入口

五、I/O 技术

四种控制方式,CPU 介入程度递减:

方式机制CPU 参与度适用场景
程序控制 I/O(轮询)CPU 不断查询 I/O 状态寄存器极高(忙等)简单低速设备
中断驱动 I/OI/O 准备好后发中断通知 CPU中(每次中断)中速字符设备
DMA(直接存储器访问)DMA 控制器自动成块传送,完成后才中断极低(只在开始和结束)块设备大量数据
通道(Channel)专用 I/O 处理器执行通道程序几乎为零大型机、高端系统

5.1 程序控制 I/O

  • 三类指令:控制指令、状态指令、数据传送指令
  • 致命缺陷:CPU 必须轮询,耗费大量时间,严重降低性能

5.2 中断驱动 I/O

  • I/O 设备准备好时通过中断通知 CPU
  • 让 CPU 从轮询中解放,I/O 和计算并行
  • 但每次数据传送仍需 CPU 介入,大量数据时中断开销大

5.3 DMA(直接存储器访问)

  • DMA 控制器独立控制成块数据在内存和 I/O 间传输
  • CPU 只在开始时设置 DMA 参数,结束时被中断
  • 传输过程中 CPU 可以做其他计算
  • 解决”中断仍要 CPU 介入数据传送”的问题

5.4 通道

  • 更彻底的 offloading:专用的 I/O 处理器
  • 执行通道程序,控制多台设备
  • 常见于大型机(IBM 大型机传统)

六、时钟与时钟队列

6.1 时钟的作用

  • 维护系统时间(日时钟)
  • 进程调度(时间片轮转)
  • 定时任务唤醒
  • 统计和计费
  • 实时系统的 Deadline 管理

6.2 三种定时器硬件

定时器特点
TSC(时间戳计数器)Pentium+ 64-bit,每个时钟周期+1,rdtsc 读取,ns 级精度
PIT(可编程间隔定时器)固定频率周期中断(IRQ0),系统”心跳”。Linux 约 10ms/节拍(Tick)
本地 APIC 定时器SMP 系统中,每个 CPU 自己的局部定时器,32-bit

七、缓冲技术

7.1 缓冲的本质

解决部件之间速度不匹配的问题。

三种用途:

  • 处理器 ↔ 内存(高速缓存 Cache)
  • 处理器 ↔ 外部设备(硬件缓冲区)
  • 设备 ↔ 设备(内存中缓冲)

7.2 单缓冲 vs 多缓冲

  • 单缓冲:设备输入装满后必须等 CPU 取完才能继续,设备利用率低
  • 多缓冲(Cache):多级缓存(L1/L2 Cache → 内存),CPU 先在最近的 Cache 找,没有再往下找

本质上,整个存储器层次结构就是一套多级缓冲系统。


八、用户接口与系统调用

8.1 用户与 OS 的两类接口

接口级别面向形式
作业级接口用户(人)联机(交互式命令)/ 脱机(JCL)
程序级接口程序(代码)系统调用(一组 OS 子功能)

8.2 系统调用的本质

系统调用是用户程序调用 OS 子功能的手段,是编程人员能使用的 OS 唯一接口。

特点:

  • 特殊的过程调用,由访管指令实现
  • 执行时系统状态从目态转入管态
  • 低级过程,只能由汇编直接访问(高级语言通过库函数封装)
  • 用于动态请求/释放资源、完成硬件相关工作、控制程序执行
  • 每个 OS 提供几百个系统调用

8.3 系统调用的处理过程

用户程序                    陷入机制                   系统子程序
   │                           │                           │
   │  (1) 系统调用指令          │                           │
   ├──────────────────────────►│                           │
   │                           │  (2) 保护现场              │
   │                           │                           │
   │                           │  取功能号 → 查入口地址表    │
   │                           │                           │
   │                           │  (3) 跳转子程序            │
   │                           ├──────────────────────────►│
   │                           │                           │
   │                           │  (4) 返回                  │
   │◄──────────────────────────┤◄──────────────────────────┤
   │                           │  恢复现场                  │

三步骤:

  1. 保护现场(保存在系统堆栈或特定区域)
  2. 取功能号 + 查入口地址表 + 跳转执行
  3. 返回 + 恢复现场

8.4 参数传递的三种方法

方法原理局限
陷入指令自带参数指令中直接带参数指令长度有限,只能带少量参数
通用寄存器传递用寄存器传参寄存器数量有限
内存专用堆栈传递在堆栈区传参最灵活,支持大量参数

8.5 系统调用分类

五大类:

  1. 进程控制类 —— 创建/终止/等待/调度
  2. 文件操作类 —— 打开/关闭/读写/定位
  3. 进程通信类 —— 消息/管道/共享内存
  4. 设备管理类 —— 申请/释放/读写
  5. 信息维护类 —— 时间/系统信息

8.6 Linux 的系统调用实现(x86)

  • 入口指令:int $0x80(软件中断 128 号)
  • 门类型:陷阱门(不影响硬件中断)
  • 门描述符配置:
    • 段选择符 = 内核代码段
    • 偏移量 → system_call()
    • 类型 = 15(陷阱门)
    • DPL = 3(用户级,允许用户进程使用)
  • 寄存器约定:
    • EAX = 系统调用号
    • EBX / ECX / EDX / ESI / EDI = 参数 1-5
  • 特权级切换:用户栈 → 内核栈(从 TSS 取新栈指针),压入用户态 SS/ESP/CS/EIP/EFLAGS

8.7 Win32 API

  • Windows 提供的应用程序接口(以千计)
  • 无法区分哪些是系统调用(内核执行)、哪些是用户空间库调用
  • 不同 Windows 版本间可能变化
  • 图形子系统如果在内核中运行,也算系统调用

九、关键概念速查表

概念一句话理解
管态 / 目态CPU 的两种运行级别,隔离 OS 和用户程序
PSW程序状态字,记录 CPU 运行模式和标志
访管指令用户调用 OS 功能的特殊指令,触发从目态到管态的切换
存储局部性程序只访问内存的一小部分局部区域,是缓存体系的基础
界地址寄存器最简单的存储保护硬件,上下限+比较
存储键每个存储块有”锁”,PSW 有”钥匙”,匹配才允许访问
MMU内存管理单元,虚拟地址→物理地址的硬件
中断向量中断处理程序的入口地址(段+偏移)
中断向量表中断号 → 中断处理程序 的映射表
中断门 / 陷阱门进入中断门自动关中断,陷阱门不关
时钟节拍(Tick)PIT 两次中断的间隔(Linux ~10ms)
系统调用OS 提供给程序的功能接口,通过访管指令实现
int $0x80Linux x86 的 32 位系统调用指令

十、与其他知识的关联

  • 本章的中断机制是后续 操作系统课程(一)—— 绪论与操作系统概述 中”五大功能”的底层支撑
  • 存储保护 + 地址转换 → 后续内存管理章节(分页、分段、虚拟内存)的硬件基础
  • CPU 特权级 + 状态切换 → 进程管理的基本机制
  • 系统调用 → 用户程序与 OS 交互的唯一途径,贯穿文件系统、进程管理、设备管理所有章节
  • 时钟中断 → 进程调度(时间片轮转)的硬件动力
  • DMA 和通道 → I/O 系统章节的核心概念

十一、作业题(思考)

  1. 为了在程序一级提供操作系统服务,系统(软硬件)必须提供哪些支持?
  2. 系统调用的作用是什么?阐述系统调用的工作原理和实现过程。
  3. 画出中断处理的一般过程,标出哪些由硬件完成,哪些由软件完成。
  4. 操作系统是如何利用中断机制的?