# 第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] 定义
> DMA（Direct 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中断处理

---

*本章难度：⭐⭐⭐ 中等*
*重要程度：⭐⭐⭐⭐ 重点*