计算机组成原理-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.mzph.cn/news/767482.shtml

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

相关文章

RabbitMQ 01

01.定义 02.功能

apifox创建接口含中文字符报错的两种解决方案

针对apifox的含中文报错解决方法: 方法一:创建相应接口后,在设置中URL自动编码为WHATING。 方法二:直接将浏览器的url复制到apifox中,浏览器会自动解析配置中文转换路径。

springboot297毕业生实习与就业管理系统的设计与实现

毕业生实习与就业管理系统 摘 要 使用旧方法对毕业生实习与就业管理系统的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在毕业生实习与就业管理系统的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数…

ADS版图优化方法---使用EM-Cosimulation对版图进行OPTIM

ADS版图优化方法—使用EM-Cosimulation对版图进行OPTIM 一般来说,对原理图进行OPTIM优化的方法大伙用的都比较6了,跑起来也非常快。但是得到版图又可能和原理图的结果差的非常大,为了优化版图又不得不重新对原理图的参数进行调谐优化&#x…

这个国产原型设计工具,建议PM新人一定要用!

Hello小伙伴们!我是榛妮,原BAT大厂女产品经理一枚,目前在香港创业。 一转眼,做产品经理已经8年,想想入行时的种种往事(尴尬情况),至今仍然历历在目。 说起刚入行时遇到的那些问题&a…

蓝桥杯物联网Lora通信功能总结

1、LORA通信在函数LORA被初始化的时候就已经处于接收状态 即开机即能接收数据 2、LORA数据的接收以及发送都通过FIFO数据线 3、LORA的收发同时进行会产生FIFO数据线的通信干扰 4、LORA_Rx在FIFO中有数据的时候才会取出数据,FIFO没有数据会直接跳过 当LORA在发送数…

服务器运行一段时间后

自己记录一下。 一、查看目录占用情况 df -h 命令查看磁盘空间 du -ah --max-depth=1 / 查看根目录下各个文件占用情况 二、mysql日志清空 这个日志是可以清空的 echo > /usr/local/mysql/data/syzl-db2.log #将文件清空 说明: 这个文件这么大是因为,开启 …

TypeScript基础类型

string、number、bolean 直接在变量后面添加即可。 let myName: string Tomfunction sayHello(person: string) {return hello, person } let user Tom let array [1, 2, 3] console.log(sayHello(user))function greet(person: string, date: Date): string {console.lo…

基于python+vue城市交通管理系统的设计与实现flask-django-php-nodejs

此系统设计主要采用的是python语言来进行开发,采用django/flask框架技术,框架分为三层,分别是控制层Controller,业务处理层Service,持久层dao,能够采用多层次管理开发,对于各个模块设计制作有一…

数学建模综合评价模型与决策方法

评价方法主要分为两类,其主要区别在确定权重的方法上 一类是主观赋权法,多次采取综合资讯评分确定权重,如综合指数法,模糊综合评判法,层次评判法,功效系数法等 另一类是客观赋权法,根据各指标…

力扣HOT100 - 15. 三数之和

解题思路: 排序 双指针 注意: 在nums[ k ],nums[ i ],nums[ j ]的值与自身重复时均会进行跳过,防止重复添加。 如代码中: 防止nums[ k ]重复:if(k>0&&nums[k]nums[k-1]) continue…

Web前端全栈HTML5通向大神之路

本套课程共三大阶段,六大部分,是WEB前端、混合开发与全栈开发必须要掌握的技能,从基础到实践,是从编程小白成长为全栈大神的最佳教程! 链接:https://pan.baidu.com/s/1S_8DCORz0N2ZCdtJg0gHsw?pwdtjyv 提取…

Java进阶—GC回收(垃圾回收)

1. 什么是垃圾回收 垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)的一项重要功能,用于自动管理程序中不再使用的内存。在Java中,程序员不需要手动释放内存,因为GC会自动检测并回收不再使用的对象,从而减少内存泄…

力扣|两数相加|链表

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 …

面试算法-98-随机链表的复制

题目 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节…

Git的原理和使用(四)

目录 远程操作 理解分布式版本控制系统 远程仓库 新建远程仓库 克隆远程仓库 向远程仓库推送 拉取远程仓库 配置Git 忽略特殊文件 为命令配置别名 标签管理 理解标签 创建标签 操作标签 远程操作 理解分布式版本控制系统 1、每个人的电脑上都是一个完整的版本库…

网络行为管理系统招标模板

项目名称:网络行为管理系统招标 一、项目背景 随着信息技术的迅猛发展,网络安全和数据保护已成为企业和组织面临的关键挑战。为了确保网络环境的安全、合规,并实现对网络行为的有效管理和审计,我们特此启动网络行为管理系统的招…

AI程序员革命:探析Devin的登场与编程未来

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

基于python+vue超市货品信息管理系统flask-django-php-nodejs

在此基础上,结合现有超市货品信息管理体系的特点,运用新技术,构建了以 python为基础的超市货品信息管理信息化管理体系。首先,以需求为依据,根据需求分析结果进行了系统的设计,并将其划分为管理员和用户二种…

每日一练:LeeCode-498、对角线遍历【二维数组+边界判断】

给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。 示例 1: 输入:mat [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,4,7,5,3,6,8,9] 示例 2: 输入:ma…