写在前面:
- 本系列笔记主要以《计算机组成原理(唐朔飞)》为参考,大部分内容出于此书,笔者的工作主要是挑其重点展示,另外配合下方视频链接的教程展开思路,在笔记中一些比较难懂的地方加以自己的一点点理解(重点基本都会有标注,没有任何标注的难懂文字应该是笔者因为强迫症而加进来的,可选择性地忽略)。
一、概述
1、DMA方式的特点
(1)下图示意了DMA方式与程序中断方式的数据通路,主存和DMA接口之间只有一条数据通路,因此主存和设备交换信息时是不需要通过CPU的,CPU也不需要暂停现行程序为设备服务,省去了保护现场和恢复现场的工作,工作速度比程序中断方式要快不少,这一特点特别适合于高速I/O或辅存与主存之间的信息交换。
(2)若出现高速I/O(通过DMA接口)和CPU同时访问主存的情况,CPU必须将总线(如地址线、数据线)的占有权让给DMA接口使用,即DMA采取周期窃取的方式占用一个存取周期。
2、DMA接口与CPU争用主存的三种解决方法
(1)停止CPU访存:
当外设要求传送一批数据时,由DMA接口向CPU发一个停止信号,要求CPU放弃地址线、数据线和有关控制线的使用权,DMA接口获得总线控制权后开始进行数据传送,在数据传送结束后DMA接口通知CPU可以使用主存,并把总线控制权交回给CPU。
这种方式的优点是控制简单,适用于数据传输率很高的I/O设备实现成组数据的传送;缺点是DMA接口在访问主存时,CPU基本上处于不工作状态或保持原状态,而且即使I/O设备高速运行,两个数据之间的准备间隔也总大于一个存取周期,因此CPU对主存的利用率并没得到充分发挥。
(2)周期挪用(或周期窃取):
每当I/O设备发出DMA请求时,I/O设备便挪用或窃取总线占用权一个或几个存取周期,而DMA不请求时,CPU仍继续访问主存。
I/O设备请求DMA传送会遇到三种情况:
①CPU此时不需要访存(比如CPU正在执行耗时较长的乘法指令),I/O设备与CPU不发生冲突。
②I/O设备请求DMA传送时,CPU正在访问主存,此时必须待存取周期结束,CPU才能将总线占有权让出。
③I/O设备要求访问主存时,CPU也要求访问主存,二者产生访问冲突,此时I/O访存优先于CPU访存,因为I/O不立即访问主存就可能会丢失数据,这时I/O要窃取一两个存取周期,意味着CPU在执行访问主存指令过程中插入了DMA请求,并挪用了一两个存取周期,使CPU延缓了一两个存取周期再访问主存。
(3)DMA与CPU交替访问:
这种方法适合于CPU的工作周期比主存存取周期长的情况,CPU的工作周期可分为两个分周期,其中一个周期专供DMA访存,另一个周期专供CPU访存,CPU本身也不会停止主程序的运行,不会进入等待状态。
这种方式不需要总线使用全的申请、建立和归还过程,总线使用权是通过两个分周期分别控制的。
二、DMA接口的功能和组成
1、DMA接口的功能
(1)向CPU申请DMA传送。
(2)在CPU允许DMA工作时,处理总线控制权的转交,避免因进入DMA工作而影响CPU正常活动或引起总线竞争。
(3)在DMA期间管理系统总线,控制数据传送。
(4)确定数据传送的起始地址和数据长度,修正数据传送过程中的数据地址和数据长度。
(5)在数据块传送结束时,给出DMA操作完成的信号。
2、DMA接口的组成
(1)主存地址寄存器(AR)
AR用于存放主存中需要交换数据的地址。在DMA传送数据前,必须通过程序将数据在主存中的首地址送到主存地址寄存器;在DMA传送过程中,每交换一次数据,将地址寄存器的内容加1,直到一批数据传送完毕为止。
(2)字计数器(WC)
WC用于记录传送数据的总字数,通常以交换字数的补码值预置。在DMA传送过程中,每传送一个字,字计数器加1,直到计数器为0,即最高位产生进位时,表示该批数据传送完毕(若交换字数以原码值预置,则每传送一个字,字计数器减1,直到计数器为0时,表示该批数据传送结束),DMA接口随即向CPU发中断请求信号。
(3)数据缓冲寄存器(BR)
BR用于暂存每次传送的数据。通常DMA接口与主存之间采用字传送,而DMA与设备之间可能是字节或位传送,因此DMA接口中还可能包括有装配或拆卸字信息的硬件逻辑,如数据移位缓冲寄存器、字节计数器等。
(4)DMA控制逻辑
DMA控制逻辑负责管理DMA的传送过程,由控制电路、时序电路及命令状态控制寄存器等组成。每当设备准备好一个数据字(或一个字传送结束),就向DMA接口提出申请(DERQ),DMA控制逻辑便向CPU请求DMA服务,发出总线使用权的请求信号(HRQ),待收到CPU发出的响应信号HLDA后,DMA控制逻辑便开始管理DMA传送的全过程,包括对主存寄存器和字计数器的修改、识别总线地址、指定传送类型(输入或输出)以及通知设备已经被授予一个DMA周期(DACK)等。
(5)中断机构
当字计数器溢出(全“0”)时,表示一批数据交换完毕,由“溢出信号”通过中断机构向CPU提出中断请求,请求CPU作DMA操作后的处理。需要说明的是,这里的中断不是为了传送数据,只是为了报告一批数据传送结束。
(6)设备地址寄存器(DAR)
DAR存放I/O设备的设备码或表示设备信息存储区的寻址信息,如磁盘数据所在的区号、盘面号和柱面号,具体内容取决于设备的数据格式和地址的编址方式。
三、DMA的工作过程
1、DMA传送过程
(1)预处理阶段:
在DMA接口开始工作之前,CPU必须对其进行配置相关信息:
①给DMA控制逻辑指明数据传送方向是输入(写主存)还是输出(读主存)。
②向DMA设备地址寄存器送入设备号,并启动设备。
③向DMA主存地址寄存器送入交换数据的主存起始地址。
④对字计数器赋予交换数据的个数。
上述工作由CPU执行几条输入输出指令完成,即程序的初始化阶段,这些工作完成后,CPU继续执行原来的程序。
当I/O设备准备好发送的数据(输入)或上次接收的数据已经处理完毕(输出)时,它便通过DMA接口向CPU提出占用总线的申请,若有多个DMA同时申请,则按轻重缓急由硬件排队器的判优逻辑决定优先级,待I/O设备得到主存总线的控制权后,数据的传送便由该DMA接口进行管理。
(2)数据传送阶段:
DMA方式是以数据块为单位传送的,下图所示的示意图,是以周期挪用的DMA方式为例的。
数据输入的具体过程如下:
①当设备准备好一个字时,发出选通信号,将该字读到DMA的数据缓冲寄存器中,表示数据缓冲寄存器“满”。
②数据缓冲寄存器“满”的同时设备向DMA接口发送请求(DERQ)。
③DMA接口向CPU申请总线控制权(HRQ)。
④CPU发回HLDA信号,表示允许将总线控制权交给交给DMA接口。
⑤将DMA主存地址寄存器中的主存地址送地址总线,并命令存储器写。
⑥通知设备已被授予一个DMA周期(DACK),并为交换下一个字节做准备。
⑦将DMA数据缓冲寄存器的内容送数据总线。
⑧主存将数据总线上的信息写至地址总线指定的存储单元中。
⑨修改主存地址和字计数值。
⑩判断数据块是否传送结束,若未结束就继续传送,若已结束(字计数器溢出)则向CPU申请程序中断,标志数据块传送结束。
数据输出的具体过程如下:
①当DMA数据缓冲寄存器已将输出数据送至I/O设备后,表示数据缓冲寄存器已“空”。
②设备向DMA接口发请求(DREQ)。
③DMA接口向CPU申请总线控制权(HRQ)。
④CPU发回HLDA信号,表示允许将总线控制权交给DMA接口使用。
⑤将DMA主存地址寄存器中的主存地址送地址总线,并命令存储器读。
⑥通知设备已被授予一个DMA周期(DACK),并为交换下一个字做准备。
⑦主存将相应地址单元的内容通过数据总线读入DMA的数据缓冲寄存器中。
⑧将DMA数据缓冲寄存器的内容送到输出设备,若为字符设备则需将其拆成字符输出。
⑨修改主存地址和字计数值。
⑩判断数据块是否传送完毕,若未完毕就继续传送,若已传送完毕(字计数器溢出)则向CPU申请程序中断,标志数据块传送结束。
(3)后处理阶段:
当DMA的中断请求得到响应后,CPU停止原程序的执行,转去执行中断服务程序,做一些DMA的结束工作,其中包括校验送入主存的数据是否正确、决定是否继续用DMA传送其它数据块(若继续传送则需要再一次对DMA接口进行初始化,反之则停止外设)、测试在传送过程中是否发生错误(若出错则需要转错误诊断程序及处理错误程序)。
2、DMA接口与系统的连接方式
(1)具有公共请求线的DMA请求方式:若干个DMA接口通过一条公用的DMA请求线向CPU申请总线控制权,CPU发出响应信号,用链式查询方式通过DMA接口,首先选中的设备获得总线控制权。
(2)独立的DMA请求方式:每一个DMA接口各有一对独立的DMA请求线和DMA响应线,它由CPU的优先级判别机构裁决首先响应哪个请求,并在对应的响应线上发出响应信号,获得响应信号的DMA接口便可控制总线与主存传送数据。
3、DMA方式和程序中断方式的比较
(1)从数据传送看,程序中断方式靠程序传送,DMA方式靠硬件传送(硬件的速度普遍较快)。
(2)从CPU响应时间看,程序中断方式是在一条指令执行结束时响应,而DMA方式可在指令周期内的任一存取周期结束时响应。
(3)程序中断方式有处理异常事件的能力,DMA则没有。
(4)程序中断方式需要中断现行程序,故需保护现场,而DMA方式则不会中断现行程序,也就不需要保护现场。
(5)DMA的优先级比程序中断的优先级高。
四、DMA接口的类型
1、选择型DMA接口
选择型DMA接口的主要特点是在物理上可连接多个设备,在逻辑上只允许连接一个设备,即在某一段时间内DMA接口只能为一个设备服务,关键是在预处理时将所选设备的设备号送入设备地址寄存器。
选择性DMA接口特别适用于数据传输率很高的设备。
2、多路型DMA接口
多路型DMA接口不仅在物理上可以连接多个设备,而且在逻辑上也允许多个设备同时工作,各个设备采用字节交叉的方式通过DMA接口进行数据传送,每个与DMA接口连接的设备都设置有一套寄存器分别存放各自的传送参数。
多路型DMA接口特别适用于同时为多个数据传输率不高的设备服务。