# 第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
可屏蔽中断] --> CPU NMI[NMI
不可屏蔽中断] --> 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中断处理 --- *本章难度:⭐⭐⭐ 中等* *重要程度:⭐⭐⭐⭐ 重点*