操作系统课程(二)—— 操作系统的硬件环境与系统调用
课程:北京大学软件与微电子学院《操作系统》 讲师:陈向群 学期:2008-2009 第一学期 对应教材章节:第二章 操作系统的硬件环境 + 第三章 用户接口与作业管理(前半) 关联笔记:操作系统课程(一)—— 绪论与操作系统概述
一、本章定位
操作系统是硬件功能的第一层软件延伸,OS 设计者必须深刻理解计算机基本结构。硬件环境以分散的形式同各种 OS 管理功能相结合。
本章讨论六个核心硬件机制:
- 中央处理器(CPU) —— 特权级、状态切换
- 存储系统 —— 层次结构、保护、地址转换
- 中断机制 —— OS 的”驱动齿轮”,事件驱动的基础
- I/O 系统 —— 程序控制 / 中断驱动 / DMA / 通道
- 时钟与时钟队列 —— 多道系统的”心跳”
- 缓冲技术 —— 解决速度不匹配
二、中央处理器(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 对系统中某个事件作出的反应:
- 暂停正在执行的程序
- 保留现场
- 自动转去执行相应事件的处理程序
- 处理完成后返回断点,继续执行
三大特点:
- 随机发生
- 可恢复
- 自动处理
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 步)
- 确定中断/异常向量 i
- 读 IDTR → 取第 i 个中断描述符
- 读 GDTR → 取段描述符(得处理程序基址)
- 特权级检查(CPL ≤ 段描述符 DPL,CPL ≤ 门描述符 DPL)
- 特权级变化 → 切换栈(TSS)
- 硬件压栈保存上下文(含出错码)
- 通过段基址 + 段内偏移 → 跳转处理程序入口
五、I/O 技术
四种控制方式,CPU 介入程度递减:
| 方式 | 机制 | CPU 参与度 | 适用场景 |
|---|---|---|---|
| 程序控制 I/O(轮询) | CPU 不断查询 I/O 状态寄存器 | 极高(忙等) | 简单低速设备 |
| 中断驱动 I/O | I/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) 返回 │
│◄──────────────────────────┤◄──────────────────────────┤
│ │ 恢复现场 │
三步骤:
- 保护现场(保存在系统堆栈或特定区域)
- 取功能号 + 查入口地址表 + 跳转执行
- 返回 + 恢复现场
8.4 参数传递的三种方法
| 方法 | 原理 | 局限 |
|---|---|---|
| 陷入指令自带参数 | 指令中直接带参数 | 指令长度有限,只能带少量参数 |
| 通用寄存器传递 | 用寄存器传参 | 寄存器数量有限 |
| 内存专用堆栈传递 | 在堆栈区传参 | 最灵活,支持大量参数 |
8.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 $0x80 | Linux x86 的 32 位系统调用指令 |
十、与其他知识的关联
- 本章的中断机制是后续 操作系统课程(一)—— 绪论与操作系统概述 中”五大功能”的底层支撑
- 存储保护 + 地址转换 → 后续内存管理章节(分页、分段、虚拟内存)的硬件基础
- CPU 特权级 + 状态切换 → 进程管理的基本机制
- 系统调用 → 用户程序与 OS 交互的唯一途径,贯穿文件系统、进程管理、设备管理所有章节
- 时钟中断 → 进程调度(时间片轮转)的硬件动力
- DMA 和通道 → I/O 系统章节的核心概念
十一、作业题(思考)
- 为了在程序一级提供操作系统服务,系统(软硬件)必须提供哪些支持?
- 系统调用的作用是什么?阐述系统调用的工作原理和实现过程。
- 画出中断处理的一般过程,标出哪些由硬件完成,哪些由软件完成。
- 操作系统是如何利用中断机制的?