第十一章 输入输出系统
11.1 I/O系统概述
11.1.1 I/O系统的重要性
基本概念: 输入输出(I/O)系统是计算机与外部世界进行信息交换的桥梁。外部世界包括用户、其他计算机、各种传感器和执行机构等。
I/O系统的特点:
多样性: I/O设备种类繁多,包括: - 字符设备:键盘、鼠标、打印机 - 块设备:磁盘、SSD、U盘 - 网络设备:网卡、调制解调器 - 多媒体设备:声卡、显卡、摄像头 - 人机交互设备:显示器、触摸屏
复杂性: 不同设备的工作原理、数据格式、传输速率差异很大,需要复杂的控制机制。
异步性: I/O设备通常独立于CPU运行,需要处理异步事件和中断。
低速性: 相对于CPU和内存,I/O设备通常较慢,需要速度匹配机制。
11.1.2 I/O系统的功能
主要功能:
设备控制: 向设备发送控制命令,控制设备的启动、停止、读写等操作。
数据传输: 在CPU/内存与I/O设备之间传输数据,包括输入(设备→内存)和输出(内存→设备)。
数据缓冲: 使用缓冲区解决速度不匹配问题,提高系统效率。
数据格式转换: 进行串行/并行转换、编码转换、电平转换等。
错误检测: 检测传输错误和设备故障,进行错误恢复。
设备管理: 管理多个设备,进行设备分配、调度和共享。
11.1.3 I/O系统的组成
硬件组成:
I/O设备: 完成具体的输入输出功能,如键盘输入字符、显示器输出图像。
设备控制器: 控制I/O设备工作的硬件电路,包括: - 控制寄存器:接收CPU命令 - 状态寄存器:反映设备状态 - 数据寄存器:暂存传输数据 - 控制逻辑:产生设备控制信号
I/O接口: 连接设备控制器与总线的电路,完成信号转换和协议转换。
软件组成:
I/O指令: CPU直接执行的I/O操作指令,如IN/OUT指令。
通道程序: 在通道处理器上执行的专用I/O程序。
设备驱动程序: 操作系统内核中的软件模块,负责具体设备的控制。
设备管理软件: 操作系统中的通用I/O管理软件,包括设备分配、缓冲管理、虚拟设备等。
11.2 I/O接口与端口
11.2.1 I/O接口的功能
基本功能:
寻址功能: 识别I/O端口地址,选择特定的设备进行通信。
数据缓冲: 使用缓冲寄存器暂存数据,解决速度差异。
数据格式转换: - 串行/并行转换 - 数字/模拟转换 - 电平转换 - 码制转换
控制功能: 接收CPU控制命令,产生设备控制信号。
状态监测: 检测设备状态,向CPU报告设备是否就绪、是否出错等。
中断管理: 管理中断请求,包括中断产生、屏蔽和优先级处理。
11.2.2 I/O端口的编址方式
独立编址方式:
特点: I/O端口地址与内存地址分开编址,使用独立的地址空间。
优点: - I/O指令简短,执行速度快 - I/O程序清晰,易于区分I/O操作和内存操作 - 不影响内存地址空间
缺点: - 需要专门的I/O指令(如IN/OUT) - 指令系统复杂
典型应用: Intel x86架构采用独立编址,I/O地址空间为64KB(0-65535)。
统一编址方式(存储器映射I/O):
特点: I/O端口与内存单元统一编址,占用内存地址空间。
优点: - 不需要专门的I/O指令,使用访存指令即可 - 指令系统简单 - 可使用丰富的访存指令 - 可直接对I/O设备进行算术逻辑运算
缺点: - 占用内存地址空间 - I/O操作速度可能较慢 - 程序可读性稍差
典型应用: Motorola 68000系列、ARM架构采用统一编址。
比较:
| 特性 | 独立编址 | 统一编址 |
| —– | ——— | ——— |
| 指令系统 | 需要专门I/O指令 | 使用访存指令 |
| 地址空间 | 独立 | 占用内存空间 |
| 程序清晰度 | 高 | 较低 |
| 指令灵活性 | 低 | 高 |
| 典型应用 | x86 | ARM、MIPS |
11.2.3 I/O端口地址译码
地址译码方法:
线选法: 使用地址线直接选择设备,简单但地址空间利用率低。
全译码法: 使用全部地址线译码,地址空间利用率高,不会产生地址重叠。
部分译码法: 使用部分地址线译码,介于两者之间。
例题: 某系统使用独立I/O编址,地址总线A15-A0,现要设计一个译码电路,为8个I/O设备分配地址空间,每个设备256个端口。
解答: - 每个设备256个端口,需要低8位地址线(A7-A0) - 8个设备需要3位地址线译码(A10-A8) - 地址范围:
- 设备0:0000H-00FFH(A10-A8 = 000)
- 设备1:0100H-01FFH(A10-A8 = 001)
- …
- 设备7:0700H-07FFH(A10-A8 = 111)
11.3 I/O控制方式
11.3.1 程序查询方式
工作原理: CPU主动查询设备状态,当设备就绪时进行数据传输。
基本流程: ``` 1. CPU向设备发送命令 2. CPU循环读取设备状态 3. 如果设备未就绪,继续查询 4. 如果设备就绪,进行数据传输 5. 传输完成后,进行下一步处理 ```
程序实现: ``` ; 输出一个字符到打印机 OUTPUT_CHAR:
IN AL, STATUS_PORT ; 读状态端口 TEST AL, READY_BIT ; 测试就绪位 JZ OUTPUT_CHAR ; 未就绪,继续查询 MOV AL, CHAR ; 准备数据 OUT DATA_PORT, AL ; 输出到数据端口 RET
```
优点: - 硬件简单,成本低 - 软件控制灵活 - 实现简单
缺点: - CPU效率极低,需要不断轮询 - 实时性差,可能丢失数据 - 不适合高速设备
适用场合: CPU负担不重、数据传输速率低、实时性要求不高的场合。
11.3.2 程序中断方式
工作原理: CPU启动设备后,继续执行原程序。当设备就绪时,主动向CPU发出中断请求,CPU响应后暂停当前程序,转去执行中断服务程序,完成数据传输后再返回原程序。
工作流程: ``` 1. CPU启动设备,设置中断允许 2. CPU继续执行主程序 3. 设备就绪,发出中断请求 4. CPU响应中断,保存现场 5. 执行中断服务程序,完成I/O 6. 恢复现场,返回主程序 ```
中断处理过程:
中断请求: 设备通过中断请求线(INTR)向CPU发出请求信号。
中断判优: 当多个设备同时请求中断时,需要确定优先级。可以通过软件查询或硬件排队电路实现。
中断响应: CPU在满足以下条件时响应中断: - 有中断请求 - 中断允许标志为1(开中断) - 当前指令执行完毕 - 优先级高于当前程序
中断服务: CPU响应中断后,执行以下操作: 1. 关中断(防止嵌套混乱) 2. 保存现场(PC、寄存器等) 3. 转入中断服务程序 4. 执行I/O操作 5. 恢复现场 6. 开中断 7. 返回主程序
中断向量: 存放中断服务程序入口地址的存储单元。CPU根据中断源获取对应的中断向量,快速定位服务程序。
优点: - CPU效率高,不需要轮询 - 实时性好,能及时处理设备请求 - 适合中低速设备
缺点: - 中断处理有开销(保存/恢复现场) - 每传输一个数据都要中断一次,不适合高速设备 - 硬件复杂度增加
适用场合: 键盘、鼠标、打印机、串口等中低速设备。
11.3.3 DMA方式
工作原理: DMA(Direct Memory Access,直接存储器访问)方式下,I/O设备与内存之间直接传输数据,不需要CPU干预,仅在开始和结束时需要CPU参与。
DMA工作流程: ``` 1. CPU设置DMA控制器参数(内存地址、传输长度等) 2. CPU启动DMA传输 3. DMA控制器接管总线 4. 设备与内存直接传输数据 5. 传输完成,DMA发出中断通知CPU ```
DMA控制器结构:
地址寄存器: 存放内存地址,自动递增或递减。
字计数器: 存放传输数据字数,每传输一个数据减1,为0时结束传输。
数据缓冲寄存器: 暂存传输的数据。
控制/状态寄存器: 存放控制命令和设备状态。
DMA请求触发器: 接收设备的DMA请求信号。
控制逻辑: 产生控制信号,管理DMA操作。
DMA传送方式:
CPU停止法(成组传送): DMA传输期间,CPU完全放弃总线控制权,直到传输完成。适合高速设备大批量传输。
周期挪用(周期窃取): DMA在CPU不使用总线的周期(如CPU内部操作期间)窃取总线周期进行传输。适合中速设备。
交替分时访问: 将CPU周期分为两部分,一部分给CPU,一部分给DMA。不需要总线仲裁,但需要硬件支持。
DMA与中断的比较:
| 特性 | 中断方式 | DMA方式 |
| —– | ——— | ——— |
| 数据通路 | 设备→CPU→内存 | 设备↔内存(直接) |
| CPU参与 | 每次传输都参与 | 仅开始和结束参与 |
| 响应时间 | 指令执行结束 | 每个总线周期结束 |
| 适用设备 | 低速设备 | 高速设备 |
| 额外开销 | 保存/恢复现场 | 总线控制切换 |
| 数据单位 | 字节/字 | 数据块 |
11.3.4 通道方式
工作原理: 通道是具有特殊功能的处理器,专门负责I/O操作。CPU只需发送I/O命令给通道,通道独立执行通道程序,完成整个I/O操作,然后向CPU报告。
通道类型:
字节多路通道: 连接多个低速字符设备,以字节为单位交叉传输。 ``` 设备A:A1 A2 A3 … 设备B: B1 B2 B3 … 设备C: C1 C2 C3 … 时间轴:A1 B1 C1 A2 B2 C2 A3 B3 C3 … ```
选择通道: 连接高速设备,一次只服务一个设备,以成组方式传输。 ``` 设备A:A1 A2 A3 … An(传输完成)→ 设备B:B1 B2 … ```
数组多路通道: 结合前两者优点,连接多个高速设备,以数据块为单位交叉传输。
通道程序: 通道执行的专用程序,由一系列通道指令(通道控制字CCW)组成。
通道指令格式: ``` ┌─────────┬─────────┬─────────┬─────────┐ │ 操作码 │ 内存地址 │ 传输计数 │ 标志位 │ └─────────┴─────────┴─────────┴─────────┘ ```
通道工作流程: ``` 1. CPU组织通道程序并存入内存 2. CPU发送“启动I/O”命令给通道 3. 通道从内存取通道指令执行 4. 通道控制设备进行I/O操作 5. 传输完成,通道发出中断 6. CPU响应中断,处理完成 ```
四级I/O系统: ``` CPU ─── 通道 ─── 设备控制器 ─── I/O设备
(可多个) (可多个) (可多个)
```
11.4 中断系统
11.4.1 中断的基本概念
中断的定义: 中断是指CPU在执行程序过程中,遇到急需处理的事件时,暂停当前程序,转去执行处理程序,处理完毕后返回原程序继续执行的过程。
中断源分类:
外部中断: 来自CPU外部的中断请求。 - 可屏蔽中断:可以通过软件屏蔽 - 非屏蔽中断:必须立即响应,如电源故障
内部中断(异常): 来自CPU内部的中断。 - 故障(Fault):可纠正的错误,如缺页 - 陷阱(Trap):有意为之,如系统调用 - 中止(Abort):严重错误,无法恢复
中断的作用: 1. 实现I/O控制 2. 实现多道程序设计 3. 实现实时处理 4. 实现故障处理 5. 实现人机交互
11.4.2 中断优先级与嵌套
中断优先级: 当多个中断源同时请求时,按照优先级高低决定响应顺序。
优先级划分原则: - 高速设备优先于低速设备 - 输入设备优先于输出设备 - 实时设备优先于非实时设备 - 故障中断优先级最高
优先级实现方法:
软件查询法: CPU响应中断后,用软件查询中断源。优先级由查询顺序决定。
硬件排队法: 使用硬件电路(如菊花链、优先级编码器)确定优先级。
中断嵌套: 高优先级中断可以打断低优先级中断的处理,形成中断嵌套。
嵌套规则: - 高优先级可以打断低优先级 - 同优先级一般不嵌套(或根据策略) - 低优先级不能打断高优先级
嵌套处理: ``` 主程序 ──→ 中断A(低优先级)
↓
保存现场A
↓
执行服务A ──→ 中断B(高优先级)
↓
保存现场B
↓
执行服务B
↓
恢复现场B
↓
返回 ←───────┘
↓
恢复现场A
↓
返回 ←──────────────────┘
```
11.4.3 中断向量与向量中断
中断向量: 中断服务程序的入口地址和状态字(PSW)。
中断向量表: 存储所有中断向量的表格,通常位于内存起始位置(如00000H-003FFH)。
向量中断: CPU根据中断源自动获取对应的中断向量,转入相应服务程序。
获取方式: - 中断源提供向量号 - 中断控制器(如8259A)提供向量号 - CPU内部产生向量号
x86中断向量表: 256个中断向量,每个4字节(IP:CS)。 - 0-31:CPU保留(异常) - 32-255:用户定义(外部中断)
11.5 设备驱动程序
11.5.1 设备驱动程序的功能
基本概念: 设备驱动程序是操作系统内核中的软件模块,负责控制和管理特定I/O设备。
主要功能: 1. 接收上层软件的I/O请求 2. 将抽象请求转换为具体设备操作 3. 初始化设备控制器 4. 控制数据传输 5. 处理设备中断 6. 进行错误处理
驱动程序层次: ``` 用户程序
↓
系统调用接口
↓
设备无关软件(缓冲管理、设备分配)
↓
设备驱动程序(具体设备控制)
↓
中断处理程序
↓
设备控制器 → I/O设备 ```
11.5.2 设备驱动程序的结构
设备控制表(DCT): 每个设备一个,记录设备信息: - 设备标识 - 设备状态 - 控制表指针 - 请求队列指针
设备开关表: 系统维护的驱动程序入口表,用于调用不同设备的驱动程序。
驱动程序接口: 统一的驱动程序接口,包括: - open():打开设备 - close():关闭设备 - read():读数据 - write():写数据 - ioctl():控制操作
11.6 例题精讲
例题1: 某系统有5个中断源,优先级从高到低为A、B、C、D、E。若当前正在处理C中断,各中断源的屏蔽字如下:
| 中断源 | A | B | C | D | E |
| ——- | — | — | — | — | — |
| A | 1 | 1 | 1 | 1 | 1 |
| B | 0 | 1 | 1 | 1 | 1 |
| C | 0 | 0 | 1 | 1 | 1 |
| D | 0 | 0 | 0 | 1 | 1 |
| E | 0 | 0 | 0 | 0 | 1 |
(1) 什么是屏蔽字? (2) 处理C中断时,哪些中断源可以打断它?
解答: (1) 屏蔽字表示该中断处理时对其他中断的屏蔽情况。1表示屏蔽(不允许中断),0表示不屏蔽(允许中断)。
(2) 处理C中断时,查看C的屏蔽字:A=0, B=0, C=1, D=0, E=0。 屏蔽字为0表示该中断源可以打断当前中断处理。因此A、B、D、E都可以打断C的处理。
例题2: 比较程序查询、中断、DMA三种I/O方式的特点,并说明各自的适用场合。
解答:
| 特性 | 程序查询 | 中断 | DMA |
| —– | ——— | —— | —– |
| CPU效率 | 低(轮询等待) | 中(每次传输中断) | 高(批量传输) |
| 响应速度 | 慢 | 较快 | 快 |
| 硬件复杂度 | 简单 | 中等 | 较复杂 |
| 数据传输单位 | 字节/字 | 字节/字 | 数据块 |
| 适用设备 | 简单低速 | 中低速 | 高速块设备 |
| 典型应用 | LED控制 | 键盘、串口 | 磁盘、显卡 |
例题3: 某磁盘转速为7200 RPM,平均寻道时间为8ms,每个磁道有64个扇区,每个扇区512字节。计算: (1) 平均旋转延迟 (2) 传输一个扇区的时间 (3) 读取一个扇区的总时间
解答: (1) 旋转延迟 = (60秒/7200转) / 2 = 4.17ms(平均为半圈) (2) 传输时间 = (60秒/7200) / 64 = 0.13ms (3) 总时间 = 寻道时间 + 旋转延迟 + 传输时间
= 8ms + 4.17ms + 0.13ms = 12.3ms
11.7 本章小结
重点内容:
1. I/O系统组成:
- 硬件:I/O设备、设备控制器、I/O接口
- 软件:设备驱动程序、I/O管理软件
2. I/O端口编址:
- 独立编址:x86架构,需要专门I/O指令
- 统一编址:ARM架构,使用访存指令
3. I/O控制方式:
- 程序查询:CPU轮询,效率最低
- 程序中断:设备就绪中断CPU,适合中低速设备
- DMA:设备直接访问内存,适合高速设备
- 通道:专用处理器管理I/O,适合大型系统
4. 中断系统:
- 中断类型:外部中断、内部中断(异常)
- 中断优先级:优先级高的先响应
- 中断嵌套:高优先级可打断低优先级
- 向量中断:自动获取服务程序入口
5. DMA技术:
- DMA控制器接管总线
- 传送方式:CPU停止法、周期挪用、交替访问
- 适合磁盘等高速块设备
常见考点: - 四种I/O方式的比较 - 中断处理过程 - DMA工作原理 - 通道类型与特点 - 端口编址方式比较 - 中断屏蔽与优先级