网站关键词优化代码,公司官网如何被百度收录,洛阳seo培训,p2p网站开发思路方案5. 输入输出系统 文章目录 5. 输入输出系统5.1 概述5.1.1 I/O系统的发展概况5.1.2 I/O系统的组成5.1.3 I/O设备与主机的连接5.1.4 I/O设备与主机传送信息的控制方式 5.2 I/O设备5.3 I/O接口5.4 控制方式5.4.1 程序查询方式5.4.2 程序中断方式5.4.3 DMA方式5.4.4 程序中断方式与…5. 输入输出系统 文章目录 5. 输入输出系统5.1 概述5.1.1 I/O系统的发展概况5.1.2 I/O系统的组成5.1.3 I/O设备与主机的连接5.1.4 I/O设备与主机传送信息的控制方式 5.2 I/O设备5.3 I/O接口5.4 控制方式5.4.1 程序查询方式5.4.2 程序中断方式5.4.3 DMA方式5.4.4 程序中断方式与DMA方式的比较 本笔记参考哈工大刘宏伟老师的MOOC《计算机组成原理上_哈尔滨工业大学》、《计算机组成原理下_哈尔滨工业大学》。或者是B站《计算机组成原理哈工大刘宏伟135讲全高清》大家一起听比较热闹。中文教材《计算机组成原理第二版-唐朔飞.pdf》、《学习指导与习题解答第2版-唐朔飞.pdf》本篇笔记对应课程第五章下图加粗。 5.1 概述 图5-1 I/O设备在计算机系统的位置 I/O设备主要包括两部分设备控制器、机/电/磁/光部分。上图给出了“I/O设备(外部设备)”在计算机系统中的位置“I/O设备”通过“I/O接口”与“主机”进行数据交换、“主机”通过“I/O接口”控制或读取“I/O设备”的状态。后续 “5.1节-概述”简要介绍“I/O设备”的基本问题。“5.2节-I/O设备”简要介绍“I/O设备”的分类。“5.3节-I/O接口”具体介绍“I/O接口”电路的结构和功能。“5.4节-控制方式”具体介绍“主机”控制“I/O设备”的三种控制方式。 5.1.1 I/O系统的发展概况 输入输出系统(I/O系统)是计算机系统中种类最多、功能最多、结构最复杂、构成最多样的系统。现代计算机系统中外部设备的成本可以占到计算机总成本的80%甚至以上。可以说正是这些丰富多彩的外部设备才促成了计算机系统在各个领域的大规模应用。下面是I/O系统的发展概况 早期阶段分散连接每个外设都有专门的控制电路甚至和CPU控制电路设置在一起。CPU和I/O设备串行工作控制方式采用“程序查询方式”。缺点是难以增、删外设。接口模块和DMA阶段总线连接外设和CPU都挂载在总线上。CPU和I/O设备并行工作控制方式有“中断方式”、“DMA方式”。具有通道结构的阶段为了将 外设的管理/控制 尽可能从主机中独立出来便设置“通道”其结构如下图所示。“通道”可以认为是小型的增强的DMA控制器有自己的指令系统通过执行通道程序可以使通道上的I/O设备和主机直接进行信息传输。具有I/O处理机的阶段设置“专用处理器”负责管理I/O设备甚至当没有外设工作时也可以承担主机的部分计算任务常见于大型服务器。 趋势数据的输入输出逐渐从CPU中分离出来外部设备的独立性越来越强。 #mermaid-svg-oFm9Hp0T4cJiATDs {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-oFm9Hp0T4cJiATDs .error-icon{fill:#552222;}#mermaid-svg-oFm9Hp0T4cJiATDs .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-oFm9Hp0T4cJiATDs .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-oFm9Hp0T4cJiATDs .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-oFm9Hp0T4cJiATDs .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-oFm9Hp0T4cJiATDs .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-oFm9Hp0T4cJiATDs .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-oFm9Hp0T4cJiATDs .marker{fill:#333333;stroke:#333333;}#mermaid-svg-oFm9Hp0T4cJiATDs .marker.cross{stroke:#333333;}#mermaid-svg-oFm9Hp0T4cJiATDs svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-oFm9Hp0T4cJiATDs .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-oFm9Hp0T4cJiATDs .cluster-label text{fill:#333;}#mermaid-svg-oFm9Hp0T4cJiATDs .cluster-label span{color:#333;}#mermaid-svg-oFm9Hp0T4cJiATDs .label text,#mermaid-svg-oFm9Hp0T4cJiATDs span{fill:#333;color:#333;}#mermaid-svg-oFm9Hp0T4cJiATDs .node rect,#mermaid-svg-oFm9Hp0T4cJiATDs .node circle,#mermaid-svg-oFm9Hp0T4cJiATDs .node ellipse,#mermaid-svg-oFm9Hp0T4cJiATDs .node polygon,#mermaid-svg-oFm9Hp0T4cJiATDs .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oFm9Hp0T4cJiATDs .node .label{text-align:center;}#mermaid-svg-oFm9Hp0T4cJiATDs .node.clickable{cursor:pointer;}#mermaid-svg-oFm9Hp0T4cJiATDs .arrowheadPath{fill:#333333;}#mermaid-svg-oFm9Hp0T4cJiATDs .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-oFm9Hp0T4cJiATDs .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-oFm9Hp0T4cJiATDs .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-oFm9Hp0T4cJiATDs .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-oFm9Hp0T4cJiATDs .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-oFm9Hp0T4cJiATDs .cluster text{fill:#333;}#mermaid-svg-oFm9Hp0T4cJiATDs .cluster span{color:#333;}#mermaid-svg-oFm9Hp0T4cJiATDs div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-oFm9Hp0T4cJiATDs :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 若干个 若干个 若干个 CPU 主存 通道 子通道 设备控制器 I/O设备 图5-2 “通道”的硬件连接层级图由大到小 5.1.2 I/O系统的组成 I/O软件 I/O指令CPU指令的一部分。格式为 |操作码|命令码|设备码|操作码只是I/O指令的标志命令码相当于CPU指令中的操作码指出要对I/O设备执行什么操作如查询/输入/输出/控制等设备码是I/O设备的地址也可以是“I/O端口”的寄存器地址。通道指令通常在编写应用程序时为了调用外设需要增加“广义I/O指令”指出要传输数据的首地址、传送字数、操作命令等。操作系统会根据这些信息使用通道指令生成“通道程序”执行该通道程序就可以控制相应I/O设备完成输入输出。通道指令一般较长如IBM/370通道指令为64位。 I/O硬件 采用总线连接设备通过“接口”连接到总线上。采用通道结构设备通过“设备控制器”连接“通道”。 5.1.3 I/O设备与主机的连接 上一章讲解了“CPU和主存”的信息交换方式但CPU和主存通常不会改变而I/O设备则会随时增加、删除所以“主机和I/O设备”的信息交换方式和前者有很多不同。具体来说主机如何选中对应的I/O设备主机和I/O设备如何知道彼此状态主机和I/O设备如何物理连接下面就来回答这一系列问题 I/O设备编址方式为I/O设备的存储空间分配地址。 统一编址将I/O设备地址看成是内存地址的一部分CPU可以直接用取数、存数等指令对I/O设备进行访问。优点是CPU指令集相对简单适合内存地址较大的情况如64位操作系统。单独编址在内存地址之外额外开辟一块地址空间作为外设空间。为了区分对内存、外设的操作需要设置专门的I/O指令来操作外设。 设备选中使用上述编址选中相应的I/O设备本过程会使用“设备选择电路”(比较器)。 传送方式分为串行、并行。通常并行传输位数是8的倍数。 联络方式I/O设备和主机需要确定彼此的状态。 立即响应适用于结构简单、状态少的设备如LED灯。异步工作“异步”主要指I/O设备与主机工作速度不匹配。此时采用应答信号向对方指明自己的状态比如下面并行传输的状态信号、串行传输的起始位/终止位。 同步工作主机和I/O设别采用“同步时标”(时钟信号)驱动工作。 连接方式 辐射式连接每个I/O设备都需要专用的控制电路不利于I/O设备的增删。目前弃用。总线连接所有I/O设备挂载在总线上节省资源、方便I/O设备管理。 5.1.4 I/O设备与主机传送信息的控制方式 下图给出了三种主机控制I/O设备工作的方式。在“程序查询方式”、“程序中断方式”中主存和I/O设备之间没有直接相连的总线所以CPU需要亲自进行数据的搬运而“DMA方式”中主存和I/O设备之间的设立总线CPU只需释放总线控制权一段时间具体的数据搬运则让DMA完成即可显然DMA方式的CPU工作效率最高。下面是这些控制方式的具体介绍以数据输入(CPU读取数据)为例 图5-3 程序查询方式、程序中断方式、DMA方式的CPU效率对比 程序查询方式CPU和I/O串行工作。CPU发送读指令后需要原地等待I/O设备准备好如下图红框所示。并且主存要想与I/O设备进行数据交换也需要CPU作为中间媒介CPU全程参与数据交换工作CPU工作效率非常低 程序中断方式CPU和I/O部分的并行工作。CPU发送读指令后直接去执行其他程序I/O设备准备好后向CPU提出中断请求CPU再暂停现行程序读取数据。CPU无需原地等待但仍然亲自进行数据搬运。并且中断需要几十条指令完成若主存和I/O设备进行小批量、频繁读写CPU的效率还是很低。 DMA方式CPU和I/O完全并行工作。CPU发送读指令后直接去执行其他程序只需让出在数据搬运期间让出总线使用权(周期挪用/周期窃取)CPU还可以继续运行程序主存和I/O设备之间通过“DMA控制器”使用总线进行数据交换。CPU被解放的程度更大CPU工作效率很高。 通道方式参考“计算机体系结构”课程。 I/O处理机方式参考“计算机体系结构”课程。 总结上述方式从上到下I/O系统的自治能力越来越强。 在“5.4节-控制方式”中会详细介绍上述前三种控制方式的电路结构和功能本小节先铺垫概念。
5.2 I/O设备
按照通信对象的不同I/O设备大致分为以下三类 人机交互设备包括输入输出如键盘、鼠标、打印机、显示器等。计算机信息存储设备也就是“计算机组成原理-4-存储器”介绍的内容如磁盘、光盘、磁带。机—机通信设备协助计算机与其他设备之间进行通信的设备如调制解调器、网卡等。 当然也可以如下表所示分为输入设备、输出设备、其他设备
表5-1 I/O设备的分类 注本小节具体内容可以参考中文教材“5.2 I/O设备”有很多篇幅介绍但由于非重点MOOC就不多讲解了。 5.3 I/O接口 “接口”的概念非常广泛可以是“软件-软件”、“软件-硬件”、“硬件-硬件”。本节主要介绍主机和I/O设备之间的“I/O接口”既包括电路硬件也包括控制软件。单个“I/O接口”控制多个I/O设备。“I/O接口”的功能主要有 实现设备的选择。实现数据缓冲达到速度匹配。实现数据串-并格式转换。实现电平转换。传送控制命令。反映设备的状态(“忙”、“就绪”、“中断请求”)。 为了实现上述功能下面介绍“I/O总线”与“I/O设备”进行连接的电路结构以及I/O接口内部的基本组成 图5-4 “I/O总线”与“I/O接口”的连接、“I/O接口”的基本组成 I/O总线可以分为四种类型的连接线 设备选择线单向传输I/O设备的设备码或端口号用于指定设备。数据线双向传输数据。命令线单向输入来自主机的命令控制I/O设备完成相应操作。状态线单向向主机输出本设备的状态。 I/O接口的基本组成 设备选择电路本质是一个比较器实现I/O设备的选址功能。命令寄存器和命令译码器实现传送命令的功能。使用“命令寄存器”锁存命令再通过“命令译码器”和节拍发出控制信号控制接口或I/O设备完成相应功能。数据缓冲寄存器实现传送数据的功能【核心功能】。稍加改变即可成为“串-并转换电路”。设备状态标记使用一系列触发器来反映设备的状态。 完成触发器 D \text{D} D用于标记I/O设备是否准备好、数据是否准备好。工作触发器 B \text{B} B用于标记I/O设备是否忙。中断请求触发器 INTR \text{INTR} INTRI/O设备准备好后向主机发送中断请求。屏蔽触发器 MASK \text{MASK} MASK设置有效时即使I/O设备完成准备工作也不能向主机提出中断请求。用于屏蔽不重要的中断请求比如主机正在和其他I/O设备进行重要交互。 控制逻辑电路保障上述I/O接口的四大部分协调的按时序工作。 注上述基本结构未给出“并串转换”、“电平转换”功能可自行思考添加。 最后是接口的分类。简单给出下面四种分类方式其中按照“控制方式”分类时“程序查询方式”无需“I/O接口”所以分类中没有给出。如下图 图5-5 I/O接口的分类 5.4 控制方式 在“5.1.4节-I/O设备与主机传送信息的控制方式”已经简单介绍了这三种控制方式下面来看看具体的内部结构和工作原理。注意到早期个人计算机主板的“南桥芯片”也具有“I/O接口”的功能。“南桥芯片”现已淘汰集成到“北桥芯片”、“CPU”之中。
5.4.1 程序查询方式 “程序查询方式”的流程简单来说就是CPU和I/O设备串行工作CPU会原地踏步等待I/O设备准备完成进而导致CPU的工作效率极低。下面左两图分为“单I/O设备”、“多I/O设备”的查询流程图右图给出整个“程序查询方式”的完整流程 图5-6 “程序查询方式”的流程图单设备查询流程、多设备查询流程、完整程序流程 单设备查询流程本过程涉及三条指令。 测试指令检查状态标记转移指令也称为分支指令。检查设备使用准备好传送指令也称为输入输出指令、访存指令。来进行交换数据。 多设备查询流程首先根据优先级进行排序然后依次进行读写。 完整程序流程 保护寄存器内容数据交互过程中需要CPU寄存器进行暂存数据于是首先将该CPU寄存器的值存储到其他地方等数据读/写完毕后再取回来。设置计数值控制传输的数据量。假设待传输数据总量为 n n n可以将计数器初值设置为 n n n递减到零也可以将初值设置为 − n -n −n (补码)递增到0。设置主存缓冲区地址标记主存读/写数据的起始地址。启动I/O设备让外部设备准备好数据传输。“准备好”通过原地踏步的方式不断查询I/O设备是否准备好。传输数据按照流程图所示的不断地、一个一个地传输数据。最后结束I/O传送。 上一小节的最后进行“I/O接口分类”时提到“程序查询方式”没有“I/O接口”但其实也会有一些简单的控制电路。我们对照图5-4所示的5个部分来分析“程序查询方式”的接口电路的工作流程。以数据输入(CPU读数据)为例 图5-7 “程序查询方式”的接口电路 CPU发出读命令(①)CPU发送设备地址到“设备选择电路”确认本次数据传输的I/O设备。该电路输出的设备选择信号 SEL \text{SEL} SEL和CPU发送的“启动指令”一起控制设备开始工作。设置状态信号(②)控制设备开始工作时会设置 D 0 \text{D}0 D0 表示数据还没有准备好 B 1 \text{B}1 B1 表示设备开始工作。I/O设备传数据(③④)I/O设备将数据传输到数据寄存器 DBR \text{DBR} DBR 中然后设置 D 1 \text{D}1 D1、 B 0 \text{B}0 B0 告知CPU目前自己的状态。CPU读数据(⑤⑥) D 0 \text{D}0 D0 时CPU会一直原地等待。直到CPU检测到 D 1 \text{D}1 D1读取 DBR \text{DBR} DBR 中的数据并存放到主存中完成本次数据传输。 注实际电路更加复杂比如需要对CPU指令进行锁存、译码然后按顺序产生一系列控制信号。上述为简单示意。 5.4.2 程序中断方式
1. 中断的概念 首先介绍一下什么是中断。“中断”指CPU在执行程序的过程中若发生意外情况CPU会“保护现场”转而执行中断程序执行完中断程序后“恢复现场”继续执行原有程序如下左图所示。下右图则将打印机作为“中断源”给出了中断程序占用CPU的示意图。可以看到“程序中断方式”实现在宏观上CPU和I/O设备并行工作也就是I/O设备在准备过程中CPU依然在执行主程序。但微观上CPU中断主程序为I/O设备服务。如下图 图5-8 中断示意图、“打印机”中断程序占用CPU示意图 中断程序占用CPU的步骤 CPU启动I/O设备CPU执行主程序“启动打印机”后直接继续执行主程序不会等待。CPU进入中断“打印机”准备好后向CPU发起I/O中断请求CPU“响应中断”后进入中断程序接收数据。CPU退出中断CPU执行完中断程序后(接收完数据)退出中断然后继续执行中断之前的主程序。 2. I/O中断的接口电路 那实现“程序中断方式”的“I/O接口”电路长什么样子呢首先来介绍一些组件。在“5.3节-I/O接口”中已经介绍“I/O接口”最基础的五大部件但“程序中断方式”还需要四个新的部件。如下首先介绍这四个新部件的结构和功能 图5-9 中断请求触发器和中断屏蔽触发器、排队器、中断向量地址形成部件 中断请求触发器 INTR \text{INTR} INTR高电平表示有请求通过中断请求线向CPU发送中断请求。中断屏蔽触发器 MASK \text{MASK} MASK高电平表示中断会被屏蔽掉注意屏蔽的是本“I/O接口”的中断。排队器按照优先级顺序对不同的中断请求排序。不同I/O设备的优先级不同比如高速设备的优先级更高因为若不及时处理可能会导致数据丢失。有下面两种实现方式。 硬件可以集成在CPU内部或者设置在每个I/O设备的接口电路中然后连接在一起组成一个“链”称为“菊花链方式”或者“链式排队器”。上左二图给出示意图输入的 INTR i ‾ \overline{\text{INTR}_i} INTRi 是“中断请求触发器”发送过来的信号每个接口的排队器都由“非门”、“与非门”组成执行最后一个 INTP i ′ 1 \text{INTP}_i1 INTPi′1 的中断请求。若没有中断请求 INTR i ‾ 0 \overline{\text{INTR}_i}0 INTRi0 INTP i ′ \text{INTP}_i INTPi′ 均为1最后一个的横向输出为0若有中断请求最后一个的横向输出必为1假设 INTR 1 ‾ 1 \overline{\text{INTR}_1}1 INTR11、 INTR 2 ‾ 0 \overline{\text{INTR}_2}0 INTR20那么 INTP 2 ′ \text{INTP}_2 INTP2′ 是最后一个1通过上面的“与门”就可以选择出唯一为1的中断请求。软件事先规定好中断优先级然后从高到低依次查询详见第八章。 中断向量地址形成部件如上右二图所示输入为上述“排队器”(只有一位高电平)输出中断向量地址。这个“中断地址向量”是在内存中预留好的比如 Intel 8086 最多支持256个中断。CPU根据这些固定好的中断向量地址就能找到之前存放在此的中断程序入口地址(上右一图)。有如下两种方法。 软件查表法详见第八章。硬件向量法也就是“设备编码器”如下图直接使用一系列三态门产生中断向量地址。 注“中断向量地址”对应于“中断向量”而“中断向量”对应于“中断程序服务入口”。两者不一样注意区分。 然后将上述四个新部件添加进来便可以给出下图 “程序中断方式”的接口电路 图5-10 “程序中断方式”的接口电路基本组成 上侧的四个部件是新介绍的 中断请求触发器 INTR \text{INTR} INTR中断屏蔽触发器 MASK \text{MASK} MASK排队器设备编码器中断向量地址形成部件 下侧的五大部件是“5.3节-I/O接口”介绍的 设备选择电路命令译码命令寄存器和命令译码器数据缓冲寄存器 DBR \text{DBR} DBR设备状态标记 D \text{D} D/ B \text{B} B控制逻辑电路本图未展示的电路 3. I/O中断处理过程
下面是使用上述“程序中断方式”的接口电路根据I/O中断请求 进入中断程序 的基本步骤 CPU发送指令(①)CPU执行到某输入指令该指令要求将指定的I/O设备的数据输入到主机中于是CPU将该设备的I/O地址发送到“地址线”同时发送“启动命令”。设置状态信号(②)所有“I/O接口”都会接收到“地址线”上的地址但只有“地址线”指定的I/O接口会响应并执行“启动命令”将数据状态设置未准备好 D 0 \text{D}0 D0、I/O设备设置为忙 B 1 \text{B}1 B1。I/O设备传数据(③④)I/O设备准备好后会传输数据到 DBR \text{DBR} DBR然后设置 D 1 \text{D}1 D1 (设置中断)、 B 0 \text{B}0 B0。发送中断请求(⑤⑥⑦⑧)CPU发送“中断查询”于是 INTR \text{INTR} INTR 输出“中断请求”CPU于是返回“中断响应”表示准备好中断并读取中断“向量地址”。CPU读数据CPU根据中断向量地址跳转到中断程序的入口地址执行中断程序。 注CPU只有在 “中断允许触发器 EINT \text{EINT} EINT” 为高电平时才会进行“中断查询”。 4. 中断服务程序的流程 上述便介绍完了CPU如何通过“I/O接口”电路进入中断那么后续 CPU如何执行中断程序 呢下面给出“中断服务程序的流程”主要分为4个步骤 保护现场硬件来完成。 程序断点的保护保存中断程序结束后要执行的指令是下图“中断周期”的一部分。寄存器内容的保护不能由指令读取的状态也需要保护比如通用寄存器或者体系结构寄存器。利用“进栈指令”完成或者保存在内存的指定区域、空闲寄存器。 中断服务对不同的I/O设备执行不同内容的中断程序。恢复现场主要指“体系结构寄存器”的内容使用“出栈指令”读出或者从保存的内存、寄存器读出。中断返回使用“中断返回指令”返回到中断之前的断点。 上面的流程其实是“单重中断”的执行流程也就是不允许中断现行的中断服务程序。而“多重中断/中断嵌套”允许级别更高的中断源中断现行的中断服务程序。此时“多重中断”和“单重中断”的关键区别就在于“开中断指令”的执行时机如下 图5-11 单重中断程序流程、多重中断程序流程 单重中断 CPU正常执行指令也就是不断的“取指令”、“执行指令”。若 EINT 1 \text{EINT}1 EINT1则在每条指令执行阶段的结束前CPU发送“中断查询”信号此信号可以使能“I/O接口”的 中断请求触发器 INTR \text{INTR} INTR。若接收到“中断请求”那么就执行下一步否则就不断循环。CPU进入中断周期主要是“保护断点”、“形成中断服务程序的入口地址”、“关中断”。这三步操作都是由硬件按时序完成合称为“中断隐指令/中断周期”。但注意此时属于前面所执行指令的最后阶段所以“中断隐指令”不是一个完整的CPU指令第九章详细介绍。进入中断服务程序如上图将中断服务程序的核心“设备服务”执行完毕后才“开中断”。 多重中断 CPU正常执行指令。和上述“单重中断”相同。CPU进入中断周期。和上述“单重中断”相同。进入中断服务程序和上述“单重中断”不同的是在“保护现场”完成后立即“开中断”。那么有可能会在“设备服务”的执行过程中再次触发中断形成“多重中断”。 注CPU只有在 “中断允许触发器 EINT \text{EINT} EINT” 为高电平时才会进行“中断查询”。 注“开中断”就是软件设置 EINT 1 \text{EINT}1 EINT1。 注“关中断”就是软件设置 EINT 0 \text{EINT}0 EINT0当然也可以硬件自动复位。 注8086的介绍见“微机原理与接口技术”课程。 5.4.3 DMA方式
1. DMA方式的特点 DMA是“直接存储器访问”(Direct Memory Access)的缩写。实际上“程序中断方式”和“程序查询方式”的数据通路相同都需要CPU的参与如下图的棕色通路“DMA方式”则无需CPU参与主存和DMA接口可以直接交换数据如下图的棕色通路 图5-12 三种控制方式的数据通路 下图给出了DMA与主存交换数据的三种方式 图5-13 DMA与主存交换数据的三种方式 停止CPU访问主存DMA完全占用主存CPU停止对主存的访问控制简单。缺点是若CPU的预存指令执行完毕那么CPU就只能处于不工作状态或保持状态未充分发挥CPU对主存的利用率。周期挪用(或周期窃取)【常用】“周期”指“访问主存的周期”。也就是在数据传输阶段DMA一次只占用(窃取)一个访存周期而不是一直占用这样CPU也可以访问主存。于是当DMA想要访问主存时便有三种可能CPU没有访存、DMA可以直接占用CPU正在访存、DMA只能等待DMA和CPU同时请求访存DMA优先访存防止数据丢失。DMA与CPU交替访问数据传输时将CPU工作周期中分成固定的两份DMA、CPU固定的轮流访存不需要申请建立和归还总线的使用权。适合CPU工作速度比主存慢的情况一般不可能实用性不强。 2. DMA接口的功能和组成 在搬运数据的过程中DMA接口应具备以下功能 向CPU申请DMA传送。处理总线控制权的转交。管理系统总线、控制数据传送。确定数据传送的首地址和长度修正传送过程中的数据地址和长度。DMA传送结束时给出操作完成信号方便CPU后续处理。 根据DMA接口的功能便可以确定DMA接口的结构组成如下图 图5-14 DMA接口的结构示意图 假设是“单总线结构”CPU、主存、DMA挂载在同一根总线上。 地址寄存器 AR \text{AR} AR数据传送的首地址。计数器 WC \text{WC} WC记录已经传输的数据长度。假设采用递增方式且总数据量为 n n n则 WC \text{WC} WC 初始值为 − n -n −n。数据缓冲器 BR \text{BR} BR暂存数据。设备地址寄存器 DAR \text{DAR} DAR一个作用是供内部的“设备选择电路”使用用于选择相应的设备。另一个作用保存“机械硬盘”要读取的柱面号、磁道号、扇区号等信息方便确认数据传输地址。DMA控制逻辑控制DMA接口内部协调工作控制在相应时序发送相应信号如向CPU发出DMA请求 HRQ \text{HRQ} HRQ、向主存发送读写控制信号。CPU回复应答信号 HLDA \text{HLDA} HLDA。中断机构数据传输完成后进行后续处理。也就是 WC \text{WC} WC 发生溢出时会向此发信号。然后向CPU发送中断请求完成后续处理。设备和 BR \text{BR} BR 直接相连。要想传输数据需要首先向 “DMA控制器” 发送请求信号 DREQ \text{DREQ} DREQ (Device REQuest)然后“DMA控制器”发送应答信号 DACK \text{DACK} DACK (Device ACK) 表示同意。 3. DMA的工作过程 那根据上述结构“DMA接口”如何完成数据传输的工作呢DMA传送过程如下左图所示分成四个步骤。下面介绍这四个步骤并以数据输出(主存输出数据到I/O设备)为例给出DMA接口各部件的工作流程 DMA传送过程下左图 预处理通过几条输入输出指令设置DMA传输的配置信息比通知“DMA控制逻辑”数据传送方向将设备地址写入 DAR \text{DAR} DAR将主存地址写入 AR \text{AR} AR使用传送总字数初始化 WC \text{WC} WC。数据传送一个一个的传送数据也就是不断地从CPU那里占用总线并释放。后处理本质上也是一个“中断服务程序”具体功能如下。 校验送入主存的数是否正确。是否继续用DMA。测试传送过程是否正确错则转诊断程序。 继续执行主程序。 图5-15 DMA传送流程图、DMA数据输出步骤 以数据输出(主存输出数据到I/O设备)为例上右图 I/O设备读取数据(①②)“设备”从 BR \text{BR} BR 中读取信号并发送 DREQ \text{DREQ} DREQ 给“DMA控制逻辑”表示单个数据已经读取完毕。DMA控制总线(③④)“DMA控制逻辑”向CPU发送总线接管请求 HRQ \text{HRQ} HRQCPU给出应答 HLDA \text{HLDA} HLDADMA接口控制总线。DMA访存(⑤⑥⑦)DMA接口通过“地址线”发送 AR \text{AR} AR 访问主存主存通过“数据线”将数据发送到 BR \text{BR} BR 中同时“DMA控制器”发送应答信号 DACK \text{DACK} DACK 通知“设备”新的数据准备好了。注意传输数据的过程中也会一并更新 AR \text{AR} AR、 WC \text{WC} WC 方便下次传输。CPU处理数据 WC \text{WC} WC 自增后溢出表示数据传输完成便直接向“中断请求”发送信号“中断请求”再向CPU发送“中断请求”表示数据处理完成CPU可以执行“后处理”。 4. DMA接口与系统的连接方式 #mermaid-svg-ZEMxvgxg5LTypAO6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ZEMxvgxg5LTypAO6 .error-icon{fill:#552222;}#mermaid-svg-ZEMxvgxg5LTypAO6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZEMxvgxg5LTypAO6 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-ZEMxvgxg5LTypAO6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZEMxvgxg5LTypAO6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZEMxvgxg5LTypAO6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZEMxvgxg5LTypAO6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZEMxvgxg5LTypAO6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZEMxvgxg5LTypAO6 .marker.cross{stroke:#333333;}#mermaid-svg-ZEMxvgxg5LTypAO6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZEMxvgxg5LTypAO6 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ZEMxvgxg5LTypAO6 .cluster-label text{fill:#333;}#mermaid-svg-ZEMxvgxg5LTypAO6 .cluster-label span{color:#333;}#mermaid-svg-ZEMxvgxg5LTypAO6 .label text,#mermaid-svg-ZEMxvgxg5LTypAO6 span{fill:#333;color:#333;}#mermaid-svg-ZEMxvgxg5LTypAO6 .node rect,#mermaid-svg-ZEMxvgxg5LTypAO6 .node circle,#mermaid-svg-ZEMxvgxg5LTypAO6 .node ellipse,#mermaid-svg-ZEMxvgxg5LTypAO6 .node polygon,#mermaid-svg-ZEMxvgxg5LTypAO6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZEMxvgxg5LTypAO6 .node .label{text-align:center;}#mermaid-svg-ZEMxvgxg5LTypAO6 .node.clickable{cursor:pointer;}#mermaid-svg-ZEMxvgxg5LTypAO6 .arrowheadPath{fill:#333333;}#mermaid-svg-ZEMxvgxg5LTypAO6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ZEMxvgxg5LTypAO6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ZEMxvgxg5LTypAO6 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-ZEMxvgxg5LTypAO6 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-ZEMxvgxg5LTypAO6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZEMxvgxg5LTypAO6 .cluster text{fill:#333;}#mermaid-svg-ZEMxvgxg5LTypAO6 .cluster span{color:#333;}#mermaid-svg-ZEMxvgxg5LTypAO6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ZEMxvgxg5LTypAO6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 若干个 若干个 CPU/主存 DMA接口 I/O设备 图5-16 DMA接口与系统的连接方式 如上图所示一条总线上可以挂载多个“DMA接口”、而一个“DMA接口”又可以连接多个“I/O设备”。它们之间的连接方式如下。首先是多个DMA接口的挂载方式 图5-17 具有公共请求线的DMA请求、独立的DMA请求 具有公共请求线的DMA请求DAM接口按照优先级从左到右排序所有DMA接口共享一条“DMA请求线”。CPU收到DMA请求时按位置顺序逐个查询需要将总线释放给哪个“DMA接口”。独立的DMA请求每一个DMA接口都有独立的“DMA请求线”、“DMA响应线”与CPU相连判优逻辑由CPU内部完成。计数器定时查询的DMA请求教材上没写。本质就是将“链式查询”的“DMA响应”换成CPU内部的计数器。 注可以参考“3.5.1节-总线判优控制”中的“链式查询”、“独立请求查询”、“计数器定时查询”。 而多个“I/O设备”连接到一个“DMA接口”的类型较为简单如下两种 图5-18 选择型、多路型(通道) 选择型在物理上连接多个设备在逻辑上只允许连接一个设备。如上左图多个“I/O设备”共用一个DMA接口适合“I/O设备”数量少且传输速率高的场景。多路型在物理上连接多个设备在逻辑上允许连接多个设备“同时工作”。这里的“同时工作”指的是多个“I/O设备”可以同时进行数据准备但实际传输数据时仍然只有一个“I/O设备”与主存交换数据。如上右图所示“通道”此类型适合“I/O设备”数量多且传输速率较低的场景。下面给出具体实例。 下图所示“磁盘”、“磁带”、“打印机”同时采用“多路型”连接到一个“DMA接口”上。“打印机”先请求服务打印机一个访存周期“磁盘”、“磁带”同时请求优先响应速度更高的设备。可以看到尽管多个设备同时连接到一个“通道”上但“通道”依然有很多空闲时间。 注“通道”可以参考“计算机体系结构”课程中的“通道处理机”。 5.4.4 程序中断方式与DMA方式的比较
表5-2 DMA方式与程序中断方式的比较 比较方面中断方式DMA方式数据传送程序需要CPU参与硬件无需CPU响应时间指令执行结束主存的存取周期结束能否用于处理异常能不能中断请求的作用传送数据后处理优先级低高通常连接高速设备