计算机组成原理-5-输入输出系统

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系统的发展概况:

  1. 早期阶段:分散连接,每个外设都有专门的控制电路,甚至和CPU控制电路设置在一起。CPU和I/O设备串行工作,控制方式采用“程序查询方式”。缺点是难以增、删外设。
  2. 接口模块和DMA阶段:总线连接,外设和CPU都挂载在总线上。CPU和I/O设备并行工作,控制方式有“中断方式”、“DMA方式”。
  3. 具有通道结构的阶段:为了将 外设的管理/控制 尽可能从主机中独立出来,便设置“通道”,其结构如下图所示。“通道”可以认为是小型的增强的DMA控制器,有自己的指令系统,通过执行通道程序,可以使通道上的I/O设备和主机直接进行信息传输。
  4. 具有I/O处理机的阶段:设置“专用处理器”负责管理I/O设备,甚至当没有外设工作时,也可以承担主机的部分计算任务,常见于大型服务器。

趋势:数据的输入输出逐渐从CPU中分离出来,外部设备的独立性越来越强。

若干个
若干个
若干个
CPU
主存
通道
子通道
设备控制器
I/O设备
图5-2 “通道”的硬件连接层级图(由大到小)

5.1.2 I/O系统的组成

  1. I/O软件
  • I/O指令:CPU指令的一部分。格式为 |操作码|命令码|设备码|,操作码只是I/O指令的标志;命令码相当于CPU指令中的操作码,指出要对I/O设备执行什么操作,如查询/输入/输出/控制等;设备码是I/O设备的地址,也可以是“I/O端口”的寄存器地址。
  • 通道指令:通常在编写应用程序时,为了调用外设需要增加“广义I/O指令”,指出要传输数据的首地址、传送字数、操作命令等。操作系统会根据这些信息使用通道指令生成“通道程序”,执行该通道程序就可以控制相应I/O设备完成输入输出。通道指令一般较长,如IBM/370通道指令为64位。
  1. I/O硬件
  • 采用总线连接:设备通过“接口”连接到总线上。
  • 采用通道结构:设备通过“设备控制器”连接“通道”。

5.1.3 I/O设备与主机的连接

  上一章讲解了“CPU和主存”的信息交换方式,但CPU和主存通常不会改变,而I/O设备则会随时增加、删除,所以“主机和I/O设备”的信息交换方式和前者有很多不同。具体来说,主机如何选中对应的I/O设备?主机和I/O设备如何知道彼此状态?主机和I/O设备如何物理连接?下面就来回答这一系列问题:

  1. I/O设备编址方式:为I/O设备的存储空间分配地址。
  • 统一编址:将I/O设备地址看成是内存地址的一部分,CPU可以直接用取数、存数等指令对I/O设备进行访问。优点是CPU指令集相对简单,适合内存地址较大的情况,如64位操作系统。
  • 单独编址:在内存地址之外额外开辟一块地址空间作为外设空间。为了区分对内存、外设的操作,需要设置专门的I/O指令来操作外设。
  1. 设备选中:使用上述编址选中相应的I/O设备,本过程会使用“设备选择电路”(比较器)。

  2. 传送方式:分为串行、并行。通常并行传输位数是8的倍数。

  3. 联络方式:I/O设备和主机需要确定彼此的状态。

  • 立即响应:适用于结构简单、状态少的设备,如LED灯。
  • 异步工作:“异步”主要指I/O设备与主机工作速度不匹配。此时采用应答信号向对方指明自己的状态,比如下面并行传输的状态信号、串行传输的起始位/终止位。
  • 同步工作:主机和I/O设别采用“同步时标”(时钟信号)驱动工作。
  1. 连接方式:
  • 辐射式连接:每个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效率对比
  1. 程序查询方式:CPU和I/O串行工作。CPU发送读指令后,需要原地等待I/O设备准备好,如下图红框所示。并且,主存要想与I/O设备进行数据交换,也需要CPU作为中间媒介,CPU全程参与数据交换工作,CPU工作效率非常低!

  2. 程序中断方式:CPU和I/O部分的并行工作。CPU发送读指令后,直接去执行其他程序;I/O设备准备好后,向CPU提出中断请求,CPU再暂停现行程序读取数据。CPU无需原地等待,但仍然亲自进行数据搬运。并且,中断需要几十条指令完成,若主存和I/O设备进行小批量、频繁读写,CPU的效率还是很低。

  3. DMA方式:CPU和I/O完全并行工作。CPU发送读指令后,直接去执行其他程序,只需让出在数据搬运期间让出总线使用权(周期挪用/周期窃取),CPU还可以继续运行程序,主存和I/O设备之间通过“DMA控制器”使用总线进行数据交换。CPU被解放的程度更大,CPU工作效率很高。

  4. 通道方式:参考“计算机体系结构”课程。

  5. I/O处理机方式:参考“计算机体系结构”课程。

总结:上述方式从上到下,I/O系统的自治能力越来越强

在“5.4节-控制方式”中会详细介绍上述前三种控制方式的电路结构和功能,本小节先铺垫概念。

5.2 I/O设备

按照通信对象的不同,I/O设备大致分为以下三类:

  1. 人机交互设备:包括输入输出,如键盘、鼠标、打印机、显示器等。
  2. 计算机信息存储设备:也就是“计算机组成原理-4-存储器”介绍的内容,如磁盘、光盘、磁带。
  3. 机—机通信设备:协助计算机与其他设备之间进行通信的设备,如调制解调器、网卡等。

当然也可以如下表所示,分为输入设备、输出设备、其他设备:

表5-1 I/O设备的分类

注:本小节具体内容可以参考中文教材“5.2 I/O设备”,有很多篇幅介绍,但由于非重点MOOC就不多讲解了。

5.3 I/O接口

  “接口”的概念非常广泛,可以是“软件-软件”、“软件-硬件”、“硬件-硬件”。本节主要介绍主机和I/O设备之间的“I/O接口”,既包括电路硬件,也包括控制软件。单个“I/O接口”控制多个I/O设备。“I/O接口”的功能主要有:

  1. 实现设备的选择。
  2. 实现数据缓冲达到速度匹配。
  3. 实现数据串-并格式转换。
  4. 实现电平转换。
  5. 传送控制命令。
  6. 反映设备的状态(“忙”、“就绪”、“中断请求”)。

为了实现上述功能,下面介绍“I/O总线”与“I/O设备”进行连接的电路结构,以及I/O接口内部的基本组成:

图5-4 “I/O总线”与“I/O接口”的连接、“I/O接口”的基本组成

I/O总线可以分为四种类型的连接线

  1. 设备选择线:单向,传输I/O设备的设备码或端口号,用于指定设备。
  2. 数据线:双向,传输数据。
  3. 命令线:单向,输入来自主机的命令,控制I/O设备完成相应操作。
  4. 状态线:单向,向主机输出本设备的状态。

I/O接口的基本组成

  1. 设备选择电路:本质是一个比较器,实现I/O设备的选址功能。
  2. 命令寄存器和命令译码器:实现传送命令的功能。使用“命令寄存器”锁存命令,再通过“命令译码器”和节拍发出控制信号,控制接口或I/O设备完成相应功能。
  3. 数据缓冲寄存器:实现传送数据的功能【核心功能】。稍加改变即可成为“串-并转换电路”。
  4. 设备状态标记:使用一系列触发器,来反映设备的状态。
  • 完成触发器 D \text{D} D:用于标记I/O设备是否准备好、数据是否准备好。
  • 工作触发器 B \text{B} B:用于标记I/O设备是否忙。
  • 中断请求触发器 INTR \text{INTR} INTR:I/O设备准备好后,向主机发送中断请求。
  • 屏蔽触发器 MASK \text{MASK} MASK:设置有效时,即使I/O设备完成准备工作,也不能向主机提出中断请求。用于屏蔽不重要的中断请求,比如主机正在和其他I/O设备进行重要交互。
  1. 控制逻辑电路:保障上述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 “程序查询方式”的流程图:单设备查询流程、多设备查询流程、完整程序流程

单设备查询流程:本过程涉及三条指令。

  1. 测试指令:检查状态标记,
  2. 转移指令:也称为分支指令。检查设备使用准备好,
  3. 传送指令:也称为输入输出指令、访存指令。来进行交换数据。

多设备查询流程:首先根据优先级进行排序,然后依次进行读写。

完整程序流程

  1. 保护寄存器内容:数据交互过程中需要CPU寄存器进行暂存数据,于是首先将该CPU寄存器的值存储到其他地方,等数据读/写完毕后再取回来。
  2. 设置计数值:控制传输的数据量。假设待传输数据总量为 n n n,可以将计数器初值设置为 n n n,递减到零;也可以将初值设置为 − n -n n (补码),递增到0。
  3. 设置主存缓冲区地址:标记主存读/写数据的起始地址。
  4. 启动I/O设备:让外部设备准备好数据传输。
  5. “准备好?”:通过原地踏步的方式,不断查询I/O设备是否准备好。
  6. 传输数据:按照流程图所示的不断地、一个一个地传输数据。最后结束I/O传送。

  上一小节的最后进行“I/O接口分类”时,提到“程序查询方式”没有“I/O接口”,但其实也会有一些简单的控制电路。我们对照图5-4所示的5个部分,来分析“程序查询方式”的接口电路的工作流程。以数据输入(CPU读数据)为例:

图5-7 “程序查询方式”的接口电路
  1. CPU发出读命令(①):CPU发送设备地址到“设备选择电路”,确认本次数据传输的I/O设备。该电路输出的设备选择信号 SEL \text{SEL} SEL,和CPU发送的“启动指令”一起,控制设备开始工作。
  2. 设置状态信号(②):控制设备开始工作时,会设置 D = 0 \text{D}=0 D=0 表示数据还没有准备好, B = 1 \text{B}=1 B=1 表示设备开始工作。
  3. I/O设备传数据(③④):I/O设备将数据传输到数据寄存器 DBR \text{DBR} DBR 中,然后设置 D = 1 \text{D}=1 D=1 B = 0 \text{B}=0 B=0 告知CPU目前自己的状态。
  4. CPU读数据(⑤⑥): D = 0 \text{D}=0 D=0 时,CPU会一直原地等待。直到CPU检测到 D = 1 \text{D}=1 D=1,读取 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的步骤:

  1. CPU启动I/O设备:CPU执行主程序“启动打印机”后,直接继续执行主程序,不会等待。
  2. CPU进入中断:“打印机”准备好后,向CPU发起I/O中断请求,CPU“响应中断”后进入中断程序,接收数据。
  3. CPU退出中断:CPU执行完中断程序后(接收完数据),退出中断,然后继续执行中断之前的主程序。

2. I/O中断的接口电路
  那实现“程序中断方式”的“I/O接口”电路长什么样子呢?首先来介绍一些组件。在“5.3节-I/O接口”中,已经介绍“I/O接口”最基础的五大部件,但“程序中断方式”还需要四个新的部件。如下,首先介绍这四个新部件的结构和功能:

图5-9 中断请求触发器和中断屏蔽触发器、排队器、中断向量地址形成部件
  1. 中断请求触发器 INTR \text{INTR} INTR:高电平表示有请求,通过中断请求线向CPU发送中断请求。
  2. 中断屏蔽触发器 MASK \text{MASK} MASK:高电平表示中断会被屏蔽掉,注意屏蔽的是本“I/O接口”的中断。
  3. 排队器:按照优先级顺序,对不同的中断请求排序。不同I/O设备的优先级不同,比如高速设备的优先级更高,因为若不及时处理,可能会导致数据丢失。有下面两种实现方式。
  • 硬件:可以集成在CPU内部;或者设置在每个I/O设备的接口电路中,然后连接在一起组成一个“链”,称为“菊花链方式”或者“链式排队器”。上左二图给出示意图,输入的 INTR i ‾ \overline{\text{INTR}_i} INTRi 是“中断请求触发器”发送过来的信号,每个接口的排队器都由“非门”、“与非门”组成,执行最后一个 INTP i ′ = 1 \text{INTP}'_i=1 INTPi=1 的中断请求。若没有中断请求 INTR i ‾ = 0 \overline{\text{INTR}_i}=0 INTRi=0 INTP i ′ \text{INTP}'_i INTPi 均为1,最后一个的横向输出为0;若有中断请求,最后一个的横向输出必为1,假设 INTR 1 ‾ = 1 \overline{\text{INTR}_1}=1 INTR1=1 INTR 2 ‾ = 0 \overline{\text{INTR}_2}=0 INTR2=0,那么 INTP 2 ′ \text{INTP}'_2 INTP2 是最后一个1,通过上面的“与门”就可以选择出唯一为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中断请求 进入中断程序 的基本步骤:

  1. CPU发送指令(①):CPU执行到某输入指令,该指令要求将指定的I/O设备的数据输入到主机中,于是CPU将该设备的I/O地址发送到“地址线”,同时发送“启动命令”。
  2. 设置状态信号(②):所有“I/O接口”都会接收到“地址线”上的地址,但只有“地址线”指定的I/O接口会响应,并执行“启动命令”,将数据状态设置未准备好 D = 0 \text{D}=0 D=0、I/O设备设置为忙 B = 1 \text{B}=1 B=1
  3. I/O设备传数据(③④):I/O设备准备好后会传输数据到 DBR \text{DBR} DBR,然后设置 D = 1 \text{D}=1 D=1 (设置中断)、 B = 0 \text{B}=0 B=0
  4. 发送中断请求(⑤⑥⑦⑧):CPU发送“中断查询”,于是 INTR \text{INTR} INTR 输出“中断请求”,CPU于是返回“中断响应”表示准备好中断,并读取中断“向量地址”。
  5. CPU读数据:CPU根据中断向量地址跳转到中断程序的入口地址,执行中断程序。

注:CPU只有在 “中断允许触发器 EINT \text{EINT} EINT” 为高电平时才会进行“中断查询”。

4. 中断服务程序的流程
  上述便介绍完了CPU如何通过“I/O接口”电路进入中断,那么后续 CPU如何执行中断程序 呢?下面给出“中断服务程序的流程”,主要分为4个步骤:

  1. 保护现场:硬件来完成。
  • 程序断点的保护:保存中断程序结束后要执行的指令,是下图“中断周期”的一部分。
  • 寄存器内容的保护:不能由指令读取的状态也需要保护,比如通用寄存器或者体系结构寄存器。利用“进栈指令”完成,或者保存在内存的指定区域、空闲寄存器。
  1. 中断服务:对不同的I/O设备,执行不同内容的中断程序。
  2. 恢复现场:主要指“体系结构寄存器”的内容,使用“出栈指令”读出,或者从保存的内存、寄存器读出。
  3. 中断返回:使用“中断返回指令”返回到中断之前的断点。

上面的流程其实是“单重中断”的执行流程,也就是不允许中断现行的中断服务程序。而“多重中断/中断嵌套”允许级别更高的中断源,中断现行的中断服务程序。此时“多重中断”和“单重中断”的关键区别就在于“开中断指令”的执行时机,如下:

图5-11 单重中断程序流程、多重中断程序流程

单重中断

  1. CPU正常执行指令:也就是不断的“取指令”、“执行指令”。若 EINT = 1 \text{EINT}=1 EINT=1,则在每条指令执行阶段的结束前,CPU发送“中断查询”信号,此信号可以使能“I/O接口”的 中断请求触发器 INTR \text{INTR} INTR。若接收到“中断请求”,那么就执行下一步;否则就不断循环。
  2. CPU进入中断周期:主要是“保护断点”、“形成中断服务程序的入口地址”、“关中断”。这三步操作都是由硬件按时序完成,合称为“中断隐指令/中断周期”。但注意,此时属于前面所执行指令的最后阶段,所以“中断隐指令”不是一个完整的CPU指令,第九章详细介绍。
  3. 进入中断服务程序:如上图,将中断服务程序的核心“设备服务”执行完毕后,才“开中断

多重中断

  1. CPU正常执行指令。和上述“单重中断”相同。
  2. CPU进入中断周期。和上述“单重中断”相同。
  3. 进入中断服务程序:和上述“单重中断”不同的是,在“保护现场”完成后,立即“开中断。那么有可能会在“设备服务”的执行过程中,再次触发中断,形成“多重中断”。

注:CPU只有在 “中断允许触发器 EINT \text{EINT} EINT” 为高电平时才会进行“中断查询”。
注:“开中断”就是软件设置 EINT = 1 \text{EINT}=1 EINT=1
注:“关中断”就是软件设置 EINT = 0 \text{EINT}=0 EINT=0,当然也可以硬件自动复位。
注: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接口应具备以下功能:

  1. 向CPU申请DMA传送。
  2. 处理总线控制权的转交
  3. 管理系统总线、控制数据传送。
  4. 确定数据传送的首地址和长度,修正传送过程中的数据地址长度
  5. 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传送过程(下左图):

  1. 预处理:通过几条输入输出指令设置DMA传输的配置信息,比通知“DMA控制逻辑”数据传送方向,将设备地址写入 DAR \text{DAR} DAR,将主存地址写入 AR \text{AR} AR,使用传送总字数初始化 WC \text{WC} WC
  2. 数据传送:一个一个的传送数据,也就是不断地从CPU那里占用总线并释放。
  3. 后处理:本质上也是一个“中断服务程序”,具体功能如下。
  • 校验送入主存的数是否正确。
  • 是否继续用DMA。
  • 测试传送过程是否正确,错则转诊断程序。
  1. 继续执行主程序。
图5-15 DMA传送流程图、DMA数据输出步骤

以数据输出(主存输出数据到I/O设备)为例(上右图):

  1. I/O设备读取数据(①②):“设备”从 BR \text{BR} BR 中读取信号,并发送 DREQ \text{DREQ} DREQ 给“DMA控制逻辑”,表示单个数据已经读取完毕。
  2. DMA控制总线(③④):“DMA控制逻辑”向CPU发送总线接管请求 HRQ \text{HRQ} HRQ,CPU给出应答 HLDA \text{HLDA} HLDA,DMA接口控制总线。
  3. DMA访存(⑤⑥⑦):DMA接口通过“地址线”发送 AR \text{AR} AR 访问主存,主存通过“数据线”将数据发送到 BR \text{BR} BR 中,同时“DMA控制器”发送应答信号 DACK \text{DACK} DACK 通知“设备”新的数据准备好了。注意传输数据的过程中,也会一并更新 AR \text{AR} AR WC \text{WC} WC 方便下次传输。
  4. CPU处理数据: WC \text{WC} WC 自增后溢出,表示数据传输完成,便直接向“中断请求”发送信号,“中断请求”再向CPU发送“中断请求”,表示数据处理完成,CPU可以执行“后处理”。

4. DMA接口与系统的连接方式

若干个
若干个
CPU/主存
DMA接口
I/O设备
图5-16 DMA接口与系统的连接方式

  如上图所示,一条总线上可以挂载多个“DMA接口”、而一个“DMA接口”又可以连接多个“I/O设备”。它们之间的连接方式如下。首先是多个DMA接口的挂载方式:

图5-17 具有公共请求线的DMA请求、独立的DMA请求
  1. 具有公共请求线的DMA请求:DAM接口按照优先级从左到右排序,所有DMA接口共享一条“DMA请求线”。CPU收到DMA请求时,按位置顺序逐个查询需要将总线释放给哪个“DMA接口”。
  2. 独立的DMA请求:每一个DMA接口都有独立的“DMA请求线”、“DMA响应线”与CPU相连,判优逻辑由CPU内部完成。
  3. 计数器定时查询的DMA请求:教材上没写。本质就是将“链式查询”的“DMA响应”换成CPU内部的计数器。

注:可以参考“3.5.1节-总线判优控制”中的“链式查询”、“独立请求查询”、“计数器定时查询”。

而多个“I/O设备”连接到一个“DMA接口”的类型较为简单,如下两种:

图5-18 选择型、多路型(通道)
  1. 选择型:在物理上连接多个设备,在逻辑上只允许连接一个设备。如上左图,多个“I/O设备”共用一个DMA接口,适合“I/O设备”数量少且传输速率高的场景
  2. 多路型:在物理上连接多个设备,在逻辑上允许连接多个设备“同时工作”。这里的“同时工作”指的是多个“I/O设备”可以同时进行数据准备,但实际传输数据时仍然只有一个“I/O设备”与主存交换数据。如上右图所示“通道”,此类型适合“I/O设备”数量多且传输速率较低的场景。下面给出具体实例。
  • 下图所示“磁盘”、“磁带”、“打印机”同时采用“多路型”连接到一个“DMA接口”上。“打印机”先请求,服务打印机一个访存周期;“磁盘”、“磁带”同时请求,优先响应速度更高的设备。可以看到,尽管多个设备同时连接到一个“通道”上,但“通道”依然有很多空闲时间。

注:“通道”可以参考“计算机体系结构”课程中的“通道处理机”。

5.4.4 程序中断方式与DMA方式的比较

表5-2 DMA方式与程序中断方式的比较
比较方面中断方式DMA方式
数据传送程序,需要CPU参与硬件,无需CPU
响应时间指令执行结束主存的存取周期结束
能否用于处理异常不能
中断请求的作用传送数据后处理
优先级高,通常连接高速设备

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/564577.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大白话扩散模型(无公式版)

背景 传统的图像生成模型有GAN,VAE等,但是存在模式坍缩,即生成图片缺乏多样性,这是因为模型本身结构导致的。而扩散模型拥有训练稳定,保持图像多样性等特点,逐渐成为现在AIGC领域的主流。 扩散模型 正如…

2024/3/24 LED点阵屏

显示原理: 类似矩阵键盘,逐行or逐列扫描 74HC595是串行 寄存器 感觉就是三转八寄存器 并行:同时输出;串行:一位一位输出 先配置74HC595,重新进行位声明 sbit RCKP3^5; //RCLK sbit SCKP3^6; …

管理类联考–复试–管理类知识–计划

决策是管理的核心,决策是计划的前提,计划是管理的首要职能,战略是一种计划。 #mermaid-svg-rGssnUQtzhGwEUp6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-rGssnUQtzhGwEUp6 .e…

Vue3 上手笔记

1. Vue3简介 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece(n 经历了:4800次提交、40个RFC、600次PR、300贡献者 官方发版地址:Release v3.0.0 One Piece vuejs/core 截止2023年10月,最…

第十三届蓝桥杯JavaB组省赛真题 - 星期计算

解题思路: 方法一: 20的22次方是一个比较大的数,long和int都装不下这么大的数,因此需要使用下面的方法,如果 a, b, p 都是整数,且 p 是正数,那么:(a * b) % p (a % p * b % p) % …

ensp ppp验证实验(二)

实验拓扑&#xff1a; 1、R1和R2使用PPP链路直连&#xff0c;R2和R3把2条PPP链路捆绑为PPP MP直连 2、按照图示配置IP地址 3、R2对R1的PPP进行单向chap验证 4、R2和R3的PPP进行双向chap验证 实验内容&#xff1a; R1配置&#xff1a; #修改名称 <Huawei>sys Enter …

MySQL5.6.11安装步骤(Windows7 64位)

MySQL5.6.11安装步骤&#xff08;Windows7 64位&#xff09; 1. 下载MySQL Community Server 5.6.21&#xff0c;注意选择系统类型&#xff08;32位/64位&#xff09; 2. 解压MySQL压缩包 将以下载的MySQL压缩包解压到自定义目录下。 3. 添加环境变量 变量名&#xff1a;MYS…

Linux_常见指令_权限理_1

文章目录 一、Linux下的基本指令1.显示文件名 - ls2.显示当前路径 - pwd3.进入目录 - cd4.创建普通文件 - touch5.创建目录 - mkdir6.删除 - rmdir 和 rm7.手册 - man8.拷贝 - cp9.剪切 - mv10.查看短文本 - cat11.查看长文本 - more 和 less12. > (输出重定向)&#xff0c;…

鸿蒙实战开发:【7日天气预报】

先来看一下效果 本项目界面搭建基于ArkUI中TS扩展的声明式开发范式&#xff0c; 数据接口是[和风&#xff08;天气预报&#xff09;]&#xff0c; 使用ArkUI自带的网络请求调用接口。 我想要实现的一个功能是&#xff0c;查询当前城市的实时天气&#xff0c; 目前已实现的功…

基于VS code 实现Java前后端打通—基础—使用Springboot+postgreSql+mybatis+Navicat

前言&#xff1a; 作者学习webjava后的而总结&#xff0c;总的流程概括就是先使用springboot创建项目&#xff0c;在application.properties中完成相应的postgreSql和mybaits的环境配置和.xml文件中dependecy依赖配置&#xff0c;entities实现数据表的类型模板&#xff0c;分别…

大创项目推荐 图像识别-人脸识别与疲劳检测 - python opencv

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是…