Files
obsidian/计算机组成原理/学习笔记/05_输入输出系统.md

583 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第5章 输入输出系统
> 📖 本章介绍I/O设备与主机交换信息的三种控制方式程序查询、中断和DMA。
> 🎯 重点理解中断处理过程和DMA工作原理
---
## 📋 本章目录
- [[#5.1 概述]]
- [[#5.2 I/O设备]]
- [[#5.3 接口]]
- [[#5.4 程序查询方式]]
- [[#5.5 程序中断方式]]
- [[#5.6 DMA方式]]
- [[#本章小结]]
---
## 5.1 概述
### 5.1.1 输入输出系统的发展
```mermaid
graph LR
A[早期阶段] --> B[接口模块阶段]
B --> C[DMA阶段]
C --> D[通道阶段]
D --> E[IO处理机阶段]
style A fill:#ff9999
style B fill:#ffcc99
style C fill:#ffff99
style D fill:#99ff99
style E fill:#99ccff
```
| 阶段 | 特点 | CPU参与度 |
|------|------|----------|
| 早期阶段 | IO设备直接连CPU串行工作 | 完全参与 |
| 接口模块阶段 | 通过接口连接,可并行工作 | 部分参与 |
| DMA阶段 | IO与主存直接通路CPU不参与数据传输 | 少量参与 |
| 通道阶段 | 通道独立管理IO | 不参与 |
| IO处理机阶段 | IO处理机独立工作 | 不参与 |
### 5.1.2 输入输出系统的组成
```mermaid
graph TB
A[输入输出系统] --> B[I/O软件]
A --> C[I/O硬件]
B --> B1[I/O指令]
B --> B2[通道指令]
B --> B3[管理程序]
C --> C1[I/O接口]
C --> C2[I/O设备]
```
#### I/O指令格式
```mermaid
graph LR
subgraph "I/O指令格式"
OP[操作码] --> CMD[命令码] --> DEV[设备码]
end
```
**命令码功能**
- 数据输入IO → CPU
- 数据输出CPU → IO
- 状态测试(查询设备状态)
- 形成操作命令
---
## 5.2 I/O设备
### 5.2.1 I/O设备分类
| 类型 | 设备 | 特点 |
|------|------|------|
| 输入设备 | 键盘、鼠标、扫描仪 | 人 → 机 |
| 输出设备 | 显示器、打印机 | 机 → 人 |
| 外存储器 | 磁盘、磁带、光盘 | 存储信息 |
### 5.2.2 I/O设备与主机联系方式
```mermaid
graph TB
subgraph "联系方式"
A[I/O设备] --> B[编址方式]
B --> B1[统一编址]
B --> B2[独立编址]
A --> C[联络方式]
C --> C1[立即响应]
C --> C2[异步联络]
C --> C3[同步联络]
A --> D[连接方式]
D --> D1[辐射式]
D --> D2[总线式]
end
```
---
## 5.3 接口
### 5.3.1 接口的功能
> [!info] 接口定义
> 接口是主机与I/O设备之间的桥梁实现数据缓冲、格式转换和控制信号传递。
**主要功能**
1. **选址功能**:识别设备地址
2. **传送命令**接收并执行CPU命令
3. **传送数据**:缓冲数据传输
4. **反映状态**向CPU报告设备状态
### 5.3.2 接口的组成
```mermaid
graph TB
subgraph "I/O接口"
DR[数据缓冲寄存器] <--> |"数据"| DATA[数据总线]
CR[控制/状态寄存器] <--> |"控制"| CTRL[控制总线]
AR[设备选择电路] <--> |"地址"| ADDR[地址总线]
DR --> |"数据"| DEV[I/O设备]
CR --> |"控制"| DEV
end
```
**寄存器说明**
| 寄存器 | 功能 | 方向 |
|--------|------|------|
| 数据缓冲寄存器 | 暂存传输数据 | 双向 |
| 控制寄存器 | 存放CPU命令 | CPU→接口 |
| 状态寄存器 | 存放设备状态 | 接口→CPU |
| 设备选择电路 | 识别设备地址 | CPU→接口 |
### 5.3.3 接口类型
| 类型 | 特点 | 应用 |
|------|------|------|
| 并行接口 | 数据并行传输 | 近距离 |
| 串行接口 | 数据串行传输 | 远距离 |
| 可编程接口 | 功能可编程设置 | 灵活应用 |
---
## 5.4 程序查询方式
### 5.4.1 工作原理
> [!info] 核心思想
> CPU主动查询I/O设备状态设备准备好后才进行数据传输。
```mermaid
sequenceDiagram
participant CPU
participant IO as I/O设备
loop 查询过程
CPU->>IO: 查询状态
IO-->>CPU: 返回状态
alt 设备未就绪
Note over CPU: 继续查询
else 设备就绪
CPU->>IO: 传输数据
IO-->>CPU: 完成传输
end
end
```
### 5.4.2 程序流程
```mermaid
graph TB
START[开始] --> INIT[初始化]
INIT --> QUERY[查询状态]
QUERY --> CHECK{就绪?}
CHECK -->|否| QUERY
CHECK -->|是| TRANS[传输数据]
TRANS --> NEXT[下一个数据?]
NEXT -->|是| QUERY
NEXT -->|否| END[结束]
```
### 5.4.3 特点分析
| 优点 | 缺点 |
|------|------|
| 实现简单 | CPU效率低 |
| 硬件成本低 | 实时性差 |
| 易于理解 | 不能并行工作 |
> [!warning] 适用场景
> 适用于I/O设备较少、数据传输不频繁的简单系统。
---
## 5.5 程序中断方式
### 5.5.1 中断的概念
> [!info] 定义
> 中断是指CPU暂停现行程序转去处理中断请求处理完毕后返回原程序继续执行。
```mermaid
sequenceDiagram
participant CPU
participant IO as I/O设备
Note over CPU: 执行主程序
CPU->>IO: 启动设备
Note over CPU: 继续执行主程序
Note over IO: 设备准备数据
IO->>CPU: 中断请求
Note over CPU: 保存现场
CPU->>IO: 中断响应
Note over CPU: 执行中断服务程序
CPU->>IO: 传输数据
Note over CPU: 恢复现场
Note over CPU: 返回主程序
```
### 5.5.2 中断系统的功能
#### 1. 中断请求
```mermaid
graph LR
subgraph "中断请求信号"
INTR[INTR<br/>可屏蔽中断] --> CPU
NMI[NMI<br/>不可屏蔽中断] --> CPU
end
```
**中断源分类**
- **外部中断**I/O设备请求、定时器中断
- **内部中断**:溢出、除零、缺页
#### 2. 中断判优
> [!info] 问题
> 多个中断同时请求时,如何确定优先级?
**判优方法**
| 方法 | 原理 | 特点 |
|------|------|------|
| 硬件判优 | 硬件优先级电路 | 速度快 |
| 软件判优 | 程序查询顺序 | 灵活,速度慢 |
**优先级原则**
- 硬件故障 > 软件中断
- 高速设备 > 低速设备
- 输入 > 输出
- 实时设备 > 普通设备
#### 3. 中断响应
**响应条件**
1. 中断源有请求
2. CPU允许中断开中断
3. 一条指令执行完毕
4. 没有更高优先级中断
**响应过程**
1. 关中断
2. 保存断点PC、PSW
3. 识别中断源
4. 转入中断服务程序
#### 4. 中断处理
```mermaid
graph TB
subgraph "中断处理过程"
A[关中断] --> B[保存断点]
B --> C[保存现场]
C --> D[识别中断源]
D --> E[执行中断服务程序]
E --> F[恢复现场]
F --> G[开中断]
G --> H[返回断点]
end
```
#### 5. 中断返回
**返回指令**IRET中断返回
**功能**
1. 恢复断点PC
2. 恢复程序状态字PSW
3. 开中断
### 5.5.3 中断服务程序流程
```mermaid
graph TB
START[中断响应] --> SAVE1[保存断点]
SAVE1 --> SAVE2[保存现场]
SAVE2 --> EI[开中断]
EI --> SERVICE[执行服务程序]
SERVICE --> DI[关中断]
DI --> RESTORE1[恢复现场]
RESTORE1 --> RESTORE2[恢复断点]
RESTORE2 --> RET[中断返回]
```
> [!note] 现场保存
> - **断点**由硬件自动保存PC、PSW
> - **现场**:由软件保存(通用寄存器)
### 5.5.4 多重中断
> [!info] 概念
> 在处理中断时,允许更高优先级的中断打断当前中断处理。
**实现方法**
1. 中断服务程序开始时**关中断**
2. 保存现场后**开中断**
3. 允许更高优先级中断
4. 返回前**关中断**
```mermaid
sequenceDiagram
participant CPU
participant IO1 as 低优先级设备
participant IO2 as 高优先级设备
Note over CPU: 执行主程序
IO1->>CPU: 中断请求1
Note over CPU: 保存现场,开中断
Note over CPU: 执行服务程序1
IO2->>CPU: 中断请求2优先级高
Note over CPU: 保存现场,开中断
Note over CPU: 执行服务程序2
Note over CPU: 恢复现场,返回
Note over CPU: 继续服务程序1
Note over CPU: 恢复现场,返回
Note over CPU: 继续主程序
```
### 5.5.5 中断接口
```mermaid
graph TB
subgraph "中断接口"
DR[数据缓冲寄存器] <--> DATA[数据总线]
AR[设备选择电路] <--> ADDR[地址总线]
IR[中断请求触发器] --> INTR[INTR线]
IM[中断屏蔽触发器] --> MASK[屏蔽信号]
READY[准备就绪触发器] --> DR
end
```
**关键触发器**
- **中断请求触发器IR**:记录中断请求
- **中断屏蔽触发器IM**:控制中断是否允许
- **准备就绪触发器READY**:设备是否就绪
### 5.5.6 程序中断方式特点
| 优点 | 缺点 |
|------|------|
| CPU效率提高 | 保护和恢复现场开销 |
| 实时性好 | 硬件成本增加 |
| 可处理突发事件 | 程序设计复杂 |
---
## 5.6 DMA方式
### 5.6.1 DMA的基本概念
> [!info] 定义
> DMADirect Memory Access是I/O设备与主存直接进行数据交换不经过CPU的方式。
```mermaid
graph TB
subgraph "DMA方式"
CPU[CPU] <--> |"控制"| DMA[DMA控制器]
DMA <--> |"数据"| MEM[主存]
DMA <--> |"数据"| IO[I/O设备]
CPU -.-> |"不参与数据传输"| MEM
end
```
**特点**
- 数据传输不经过CPU
- CPU与I/O设备并行工作
- 适用于高速I/O设备
### 5.6.2 DMA与中断方式对比
| 特性 | 中断方式 | DMA方式 |
|------|----------|---------|
| 数据传输 | 通过CPU | 直接访问主存 |
| CPU参与 | 参与每次传输 | 只参与启动和结束 |
| 传输单位 | 字 | 数据块 |
| 适用速度 | 中低速设备 | 高速设备 |
| 开销 | 保护/恢复现场 | 硬件成本 |
### 5.6.3 DMA传送方式
#### 1. 停止CPU访问主存
```mermaid
sequenceDiagram
participant CPU
participant DMA
participant MEM as 主存
Note over CPU: 正常访问主存
DMA->>CPU: DMA请求
Note over CPU: 停止访问主存
DMA->>MEM: 数据传输
Note over CPU: 等待
DMA->>CPU: DMA结束
Note over CPU: 恢复访问主存
```
**特点**CPU处于空闲状态效率低
#### 2. 周期挪用Cycle Stealing
```mermermaid
sequenceDiagram
participant CPU
participant DMA
participant MEM as 主存
Note over CPU: 执行指令
DMA->>DMA: DMA请求
Note over DMA: 等待CPU周期结束
DMA->>MEM: 挪用一个周期传输
Note over CPU: 继续执行
Note over DMA: 重复挪用
```
**特点**CPU效率影响小常用
#### 3. DMA与CPU交替访问
```mermaid
sequenceDiagram
participant CPU
participant DMA
participant MEM as 主存
Note over CPU,DMA: CPU周期
CPU->>MEM: CPU访问
Note over CPU,DMA: DMA周期
DMA->>MEM: DMA访问
Note over CPU,DMA: 交替进行
```
**特点**:效率最高,硬件复杂
### 5.6.4 DMA控制器组成
```mermaid
graph TB
subgraph "DMA控制器"
AR[地址寄存器] <--> |"地址"| MEM[主存]
WC[字计数器] --> |"计数"| CTRL[控制逻辑]
DAR[数据缓冲寄存器] <--> |"数据"| IO[I/O设备]
CSR[控制状态寄存器] <--> |"控制"| CPU
CTRL --> |"请求"| DREQ[DREQ线]
CTRL <--> |"响应"| DACK[DACK线]
end
```
**寄存器功能**
| 寄存器 | 功能 |
|--------|------|
| 地址寄存器AR | 存放主存地址,每次传输后+1 |
| 字计数器WC | 存放传输字数,每次传输后-1 |
| 数据缓冲寄存器DAR | 暂存传输数据 |
| 控制状态寄存器CSR | 存放控制命令和状态 |
### 5.6.5 DMA传送过程
```mermaid
graph TB
subgraph "DMA传送过程"
A[CPU初始化DMA] --> B[DMA请求]
B --> C[DMA响应]
C --> D[数据传输]
D --> E{传输完成?}
E -->|否| D
E -->|是| F[DMA结束]
F --> G[中断CPU]
G --> H[CPU处理]
end
```
**详细步骤**
1. **预处理**CPU完成
- 设置起始地址
- 设置传输字数
- 设置传输方向
- 启动DMA
2. **数据传输**DMA完成
- 地址送主存
- 发读/写命令
- 数据传输
- 地址+1字计数-1
3. **后处理**CPU完成
- 检测传输是否出错
- 是否继续传输
### 5.6.6 DMA方式特点
| 优点 | 缺点 |
|------|------|
| 传输速度快 | 硬件成本高 |
| CPU效率高 | 控制复杂 |
| 适用于高速设备 | 需要额外硬件 |
---
## 📝 本章小结
### 核心概念
1. **三种IO方式**程序查询、程序中断、DMA
2. **中断处理**:中断请求 → 判优 → 响应 → 处理 → 返回
3. **DMA方式**直接访问主存CPU不参与数据传输
### 关键对比
| 方式 | CPU参与度 | 传输单位 | 速度 | 复杂度 |
|------|----------|----------|------|--------|
| 程序查询 | 完全 | 字 | 慢 | 低 |
| 程序中断 | 部分 | 字 | 中 | 中 |
| DMA | 极少 | 数据块 | 快 | 高 |
### 重点图示
> [!summary] 必须掌握的图
> 1. 中断处理流程图
> 2. DMA控制器组成框图
> 3. 三种IO方式工作时序对比图
---
## 🧪 自测练习
### 概念题
1. 比较三种IO方式的特点和适用场景。
2. 说明中断处理的基本过程。
3. 解释DMA的三种传送方式。
### 分析题
1. 设计一个支持多重中断的处理流程。
2. 说明DMA控制器的工作原理。
---
## 🔗 相关链接
- [[04_存储器]] - 上一章
- [[06_运算方法]] - 下一章
- [[08_CPU结构与功能]] - CPU中断处理
---
*本章难度:⭐⭐⭐ 中等*
*重要程度:⭐⭐⭐⭐ 重点*