目录
一、程序查询方式
1. 程序查询基本流程
2. 接口电路
3. 接口工作过程
二、程序中断方式
1. 程序中断基本流程
2. 接口电路
3. I/O 中断处理过程
三、DMA 方式
1. DMA 的概念和特点
2. DMA 与 CPU 的访存冲突
3. DMA 接口的功能
4. DMA 接口的组成
5. DMA 的工作过程
6. DMA 方式和程序中断方式的对比
I/O 设备与主机交换信息时,对信息传送的控制方式一共有五种:程序查询方式、程序中断方式、直接存储器存取方式(DMA)、I/O 通道方式、I/O 处理机方式。
其中,前两种方式都是通过 CPU 中程序指令的执行来控制的。
一、程序查询方式
程序查询方式是由 CPU 通过程序不断查询 I/O 设备是否已做好准备,从而控制 I/O 设备与主机交换信息。
1. 程序查询基本流程
采用这种方式实现主机和 I/O 设备交换信息,要求 I/O 接口内设置一个 状态标记,用来反映 I/O 设备是否准备就绪。CPU 通过检测这个标记,就可以了解 I/O 设备的准备情况。
当 I/O 设备较多时,CPU 就需要按 I/O 设备在系统中的 优先级 进行逐级查询。
为了完成这个查询的流程,CPU 通常需要执行以下 3 条指令:
-
测试指令:用来查询 I/O 设备是否准备就绪;
-
传送指令:当 I/O 设备准备就绪时,执行数据的传送指令;
-
转移指令:如果 I/O 设备未准备就绪,应执行转移指令;转至测试指令,继续测试 I/O 设备的状态。
当执行一段程序,需要启动某个 I/O 设备进行数据交互时,就把查询流程插入到运行的程序中。具体的查询流程如下:
① 这种方式传送数据时要占用 CPU 中的寄存器,所以首先要将寄存器原内容保护起来;
② 传送的往往是一批数据,所以需要设置 I/O 设备与主机交换数据的计数值,用来控制数据量;
③ 设置要传送的数据在主存缓冲区的首地址;
④ CPU 启动 I/O 设备;
⑤ 将 I/O 接口中的设备状态标志取至 CPU 并测试 I/O 设备是否准备就绪。如果未准备就绪,则等待,直到准备就绪为止;当准备就绪时,接着可实现传送。
对输入而言,准备就绪意味着接口电路中的数据缓冲寄存器已装满欲传送的数据,称为 输入缓冲满,CPU 可以取走数据;对输出而言,准备就绪意味着接口电路中的数据已被设备取走,称为 输出缓冲空,这样 CPU 可以再次将数据送到接口,设备则可以再次从接口接收数据。
⑥ CPU 执行 I/O 指令,从 I/O 接口的数据缓冲寄存器中读出一个数据(输入),或者把一个数据写入 I/O 接口中的数据缓冲寄存器内(输出),同时将接口中的状态标志复位;
⑦ 修改主存地址;
⑧ 修改计数值,若原设置计数值为原码,则依次减 1;若原设置计数值为负数的补码,则依次加 1;
⑨ 判断计数值。若计数值不为 0,表示一批数据尚未传送完,重新启动外设继续传送;若计数值为 0,则表示一批数据已传送完毕;
⑩ 结束 I/O 传送,继续执行原程序。
只要一启动 I/O 设备,CPU 就不断地查询 I/O 设备的准备情况,这就会暂停原程序的执行。当 I/O 设备准备就绪后,就将数据逐个传送;直到数据全部传送结束,CPU 才重新回到原程序继续执行。
所以在程序查询方式下,CPU 和 I/O 设备是串行工作的,效率不高。
2. 接口电路
程序查询方式对应的接口电路基本组成如下:
图中的数据缓冲寄存器用来存放要传送的数据;D 是完成触发器,B 是工作触发器。
3. 接口工作过程
以输入设备为例,数据应该从 I/O 设备传送至主机。I/O 接口的具体工作过程为:
① CPU 执行 I/O 指令启动输入设备;指令中的设备码字段,通过地址线(设备选择线)送至设备选择电路;
② 如果接口的设备码与地址线上信号相同,设备被选中,输出 SEL 有效;
③ I/O 指令中的启动命令输入,通过与非门将完成触发器 D 置 0(复位),将工作触发器 B 置1(置 位);
④ 工作触发器 B 输出启动信号,启动设备开始工作;
⑤ 输入设备将数据送至数据缓冲寄存器;
⑥ 输入缓冲满,由设备发出工作结束信号,将完成触发器 D 置 1,工作触发器 B 置 0;
⑦ 完成触发器 D 输出 1,通知 CPU “准备就绪”;
⑧ CPU 执行输入指令,将数据缓冲寄存器中的数据取出,送至通用寄存器,再存入主存。
二、程序中断方式
程序查询方式效率较低,主要原因就是 I/O 设备工作速度较慢,CPU 启动设备后,需要等待一段时间 I/O 设备才能准备就绪、开始信息交换;而 CPU 则耗费了大量时间进行状态查询。
如果 CPU 在启动 I/O 设备后,继续执行自身的原程序;等到 I/O 设备准备就绪后,主动向 CPU 发出请求再予以响应,就可以大大提升工作效率。这个请求就可以以 I/O 中断 的形式出现。
1. 程序中断基本流程
上图中,CPU 在执行 I/O 指令启动 I/O 设备之后,继续执行原程序;在执行第 M 条指令时,I/O 设备准备就绪,发来了中断请求,于是 CPU 在第 M 条指令执行结束后进入中断周期,转而执行中断服务程序;等到中断服务程序执行完毕,再返回到程序断点处,继续执行第 M + 1 条指令。
这种利用 I/O 中断,暂时中断 CPU 现行程序、转入 I/O 服务程序的方式,就称为 程序中断方式。
采用程序中断方式,CPU 就可以不必等待 I/O 设备的准备过程,工作效率得到了明显的提升。不过 CPU 和 I/O 接口需要增加响应的硬件电路,还要编制对应的中断服务程序。
2. 接口电路
很明显,采用程序中断方式,必须在接口电路中增加中断处理相应的硬件,比如中断请求触发器 INTR、中断屏蔽触发器 MASK、排队器、中断向量地址形成部件等。
上图中,完成触发器 D 和 屏蔽触发器 MASK 的输出通过与非门连接,产生中断请求信号;并通过排队器判优,交给设备编码器(中断向量地址形成部件)产生向量地址。
3. I/O 中断处理过程
同样,CPU 响应 I/O 设备提出中断请求的条件,是允许中断触发器 EINT = 1;CPU 响应 I/O 中断请求的时间,是在某条指令执行阶段的结束时刻。
以输入设备为例,I/O 中断处理的过程为:
① CPU 发出 I/O 设备启动命令,将完成触发器 D 置 0,将完成触发器 B 置 1;
② 工作触发器 B 启动设备,开始工作;
③ 输入设备将数据送至数据缓冲寄存器;
④ 输入缓冲满,设备发出工作结束信号,将完成触发器 D 置 1,完成触发器 B 置 0;
⑤ 指令执行阶段的结束时刻,CPU 发出中断查询信号;
⑥ 当设备准备就绪(D = 1),且未被屏蔽(MASK = 0)时,中断请求触发器 INTR 被置 1,向 CPU 发出 中断请求;同时 INTR 信号送至排队器,进行 中断判优。
⑦ 当 EINT = 1(允许中断),而设备又被排队器选中时,进入 中断响应 阶段;CPU 发来的中断响应信号 INTA 将排队器的输出送至编码器,形成向量地址;
⑧ 向量地址送至 PC,作为下一条指令的地址;随后跳转至中断服务程序入口地址,进入 中断服务 阶段;
⑨ 执行中断服务程序,通过输入指令将数据缓冲寄存器的数据取出,送至通用寄存器,再存入主存。
⑩ 中断服务程序最后一条指令是 中断返回 指令,执行结束后返回原程序的断点处。
这里也可以看出,一次中断处理的过程可以简单分为 中断请求、中断判优、中断响应、中断服务 和 中断返回 5 个阶段。
三、DMA 方式
1. DMA 的概念和特点
如果 I/O 设备能直接与主存交换信息而不占用 CPU,那么 CPU 的资源利用率就可以进一步提高,这种方式就被称为 直接存储器存取(Direct Memory Access,DMA)。
DMA 方式的特点是,I/O 设备与主存之间有一条直接数据通路。因此,I/O 设备可以与主存直接交换信息,而不需要调用中断服务程序。这样 ,CPU 就不必暂停现行程序、专门去为设备服务,省去了保护现场和恢复线程的过程;所以工作效率比程序中断方式更高。
对于 高速 I/O 设备 或者 辅存,如果采用程序中断方式,那么每次与主机进行数据交互时都要等待 CPU 做出中断响应,很可能会造成数据丢失;因此更适合采用 DMA 方式。
2. DMA 与 CPU 的访存冲突
在 DMA 方式中,由于 DMA 接口与 CPU 都可以访问主存,这就有可能出现两者争用主存的冲突。
I/O 设备请求进行 DMA 传送时,会遇到三种情况:
-
CPU 此时不需要访问主存:这时 I/O 设备与 CPU 不发生冲突;
-
CPU 正在访问主存:这时必须等存取周期结束,CPU 才会将总线占有权让出;
-
CPU 也同时要求访问主存:这就出现了访存冲突。
发生访存冲突时,I/O 访存要优先于 CPU 的访存,因为 I/O 设备不立即访问主存的话就可能丢失数据。所以一般这时需要 CPU 进行 “让步”。
为了有效地分时使用主存,通常采用以下三种方法来解决访存冲突:
(1)停止 CPU 访问主存
这种方法就是 CPU 彻底停止访存、等 I/O 访存结束之后再继续进行。
当外设要求传送一批数据时,由 DMA 接口向 CPU 发一个停止信号,要求 CPU 放弃地址线、数据线和有关控制线的使用权。DMA 接口获得总线控制权后,开始进行数据传送;数据传送结束后,DMA 接口通知 CPU 可以使用主存,并把总线控制权交回给 CPU。
这种方式的优缺点如下:
-
优点:控制简单,适用于数据传输率很高的 I/O 设备,进行成组数据的传送。
-
缺点:DMA 接口在访问主存时,CPU 基本上处于不工作状态或保持原状态。
所以这种方式下,CPU 对主存的利用率不高。
(2)周期挪用(或周期窃取)
如果 I/O设备 发出 DMA 请求时,CPU 并不是完全放弃总线的使用权,而是允许 I/O 设备 “挪用” 或 “窃取” 总线使用权一个或几个主存周期;这种方式就被称为 周期挪用,或 周期窃取。当 DMA 不请求时,CPU 仍可以继续访问主存。
这就意味着,CPU 在执行访问主存指令过程中,插入了 DMA 请求,那么就会被窃取了若干个存取周期,使CPU 延缓若干存取周期后再访问主存。
与 CPU 暂停访存的方式相比,这种方式既实现了 I/O 传送,又较好地发挥了主存与 CPU 的效率,是一种广泛采用的方法。
(3)DMA 与 CPU 交替访问
这种方法就是 DMA 与 CPU 轮流进行访存,平均分配主存的使用时间。
交替访问的方法适合于 CPU 的工作周期比主存存取周期长的情况。
例如,CPU 的工作周期是主存存取周期的 2 倍以上,那么可以将一个 CPU 周期分为 C~1~ 和 C~2~ 两个子周期,
其中 C~1~ 专门进行 CPU 访存,而 C~2~ 专门进行 DMA 访存。
这种方式不需要总线使用权的申请、建立和归还过程,总线使用权是通过 C~1~ 和 C~2~ 分别控制的。CPU 与 DMA 接口各自有独立的访存地址寄存器、数据寄存器和读/写信号。
在这种工作方式下,CPU 既不停止主程序的运行,也不会进入等待状态。当然,其相应的硬件逻辑也会变得更为复杂。
3. DMA 接口的功能
采用 DMA 方式进行数据传送时,数据的传输过程完全由 DMA 接口电路控制;因此 DMA 接口也被称为 DMA 控制器。
DMA 接口应该具有以下功能:
-
向 CPU 申请 DMA 传送;
-
在 CPU 允许 DMA 工作时,处理总线控制权的转交;
-
在 DMA 期间管理系统总线,控制数据传输;
-
确定数据传送的起始地址和数据长度,并在传送过程中进行修正;
-
数据块传送结束时,向 CPU 提交 DMA 操作完成的信号。
4. DMA 接口的组成
最简单的 DMA 接口组成如下图所示:
接口中的主要部件有:
-
主存地址寄存器(AR):用于存放主存中需要交换的数据的地址。DMA 传送数据前,应该将数据在主存中的首地址送至 AR;DMA 传送过程中,每交换一次数据,就将 AR 的内容加 1,直到一批数据传送完毕。
-
字计数器(WC):用来记录传送数据的总字数。DMA 传送过程中,每传送一个数据字,WC 就减 1(若是补码则 加 1),直到计数器为 0(溢出),就表示这批数据传送完毕;DMA 接口就可以向 CPU 发出中断请求信号了。
-
设备地址寄存器(DAR):存放 I/O 设备的设备码,或者辅存中的寻址信息。
-
数据缓冲寄存器(BR):用来暂存每次要传送的数据。
-
DMA 控制逻辑:由控制电路、时序电路、命令状态控制寄存器等组成,负责管理 DMA 的传送过程。每当设备准备好一个数据字,就向 DMA 接口提出请求(DREQ),DMA 控制逻辑就向 CPU 请求 DMA 服务,发出总线使用权的请求信号 HRQ;CPU 发出响应信号 HLDA 后,DMA 控制逻辑就开始负责管理 DMA 传送的全过程,并通知设备已经被授权了一个 DMA 周期(DACK)。
-
中断机构:用来提出中断请求。当字计数器 WC 溢出(全 0)时,一批数据传送完毕,这个 “溢出信号” 就通过中断机构向 CPU 提出中断请求,由 CPU 做 DMA 操作的后处理。
需要注意的是,这里和程序中断方式中的中断,都属于 I/O 中断;但中断的目的不同:程序中断方式的中断是为了传送数据,而 DMA 中的中断只是为了报告一批数据传送结束。
5. DMA 的工作过程
DMA 的数据传送过程可以分为 预处理、数据传送 和 后处理 三个阶段。
(1)预处理
在 DMA 接口开始工作之前,需要先做一些准备工作,由 CPU 给它预置一些信息;这就是 “预处理” 阶段。
-
告诉 DMA 控制逻辑数据传送的方向,是输入(写主存)还是输出(读主存);
-
将设备码写入 DMA 设备地址寄存器 DAR,并启动设备;
-
将交换数据的主存起始地址,写入 DMA 主存地址寄存器 AR;
-
将交换数据的个数,写入字计数器 WC
这些准备工作由 CPU 执行几条 I/O 指令完成,也就是程序的初始化阶段。这些工作完成后,CPU 可以继续执行原来的程序。
当 I/O 设备准备就绪时,就通过 DMA 接口向 CPU 提出占用总线的请求;若有多个 DMA 接口同时申请,就按优先级由 硬件排队判优逻辑 决定响应顺序。
I/O 设备得到主存总线的控制权后,数据的传送就全部由 DMA 接口进行管理。
(2)数据传送
DMA 方式是以 数据块 为单位进行数据传送的。
这里以周期挪用的 DMA 方式为例,对于数据输入的场景,数据传送的流程如下:
① 当设备准备好一个数据字时,发出选通信号,将该字读到数据缓冲寄存器(BR)中,表示数据缓冲寄存器 “满”;
② 与此同时,设备向 DMA 接口发出请求(DREQ);
③ DMA 接口向 CPU 申请总线控制权(HRQ);
④ CPU 发回应答信号 HLDA,表示允许将总线控制权交给 DMA 接口;
⑤ 将主存地址寄存器 AR 中的主存地址,送至地址总线,并向主存发出写命令;
⑥ 通知设备已被授予一个 DMA 周期(DACK),并为交换下一个字做准备;
⑦ 将数据缓冲寄存器 DAR 的内容,送至数据总线;
⑧ 主存将数据总线上的信息,写至地址总线指定的存储单元中;
⑨ 修改 AR 中的主存地址和字计数值 WC。
⑩ 判断数据块是否传送结束,如果没有结束则继续传送;如果已结束(字计数器溢出),则向 CPU 发出程序中断请求,标志数据块传送结束。
若为输出数据,整体步骤类似,主要的不同就是:
-
第 ① 步需要将 BR 中的数据送至 I/O 设备,表示 BR 已 “空”;
-
第 ⑤ 步需要向主存发出读命令;
-
第 ⑦ ⑧ 步,是将主存相应存储单元的内容,通过数据总线写入 BR,并送至输出设备;
(3)后处理
当 DMA 的中断请求得到响应后,CPU 停止原程序的执行,转而去执行中断服务程序,做一些 DMA 的结束工作,这就是 “后处理” 阶段。
DMA 的结束阶段工作主要包括:
-
校验送入主存的数据是否正确;
-
决定是否继续用 DMA 传送其他数据块。若继续传送,则又要对 DMA 接口进行初始化;若不需要传送,则停止外设;
-
测试在传送过程中是否发生错误;如果出错,则转错误诊断及处理程序。
6. DMA 方式和程序中断方式的对比
DMA 方式和程序中断方式是 I/O 设备最为常见的信息传送控制方式。两者都用到了中断,但中断的目的不同:程序中断方式的中断是为了传送数据,而 DMA 中的中断只是为了报告一批数据传送结束;而且中断的优先级上,DMA 中断的优先级更高。