早期的计算机,计算机数量少,应用少,外部设备少,外部设备和主机之间的连接采用分散连接的方式,CPU 和 I/O设备 串行 工作,采用程序查询方式。也就是每个设备都有专门的控制线路,这些控制线路甚至和CPU的控制线路设计在一起,紧密耦合,这时候,如果增减外部设备非常难,但是由于当时计算机和外部设备数量少,这样设计还是值得的。这时,外部设备和主机之间的连接主要还是采用程序查询的方式,在这种方式中,CPU的工作和IO工作是串行执行的,IO在进行数据的输入和输出的时候,CPU必须运行相应的程序或处于停等状态。
当外部设备越来越多,分散连接的方式已经不适应外部设备的发展、计算机技术的发展以及计算机领域的扩展,这种情况下就出现了IO接口和DMA控制器。由IO接口、DMA控制器和主机相互配合完成数据的输入、输出操作,连接方式也发生了变化,采用了总线的方式进行连接,IO设备通过接口连接在总线上,一个总线可以连接多个设备,总线另外一端和主机相联,这种情况下,主机和IO设备进行传输的传输控制方式也发生了变化,要求CPU和IO之间并行进行工作,所以出现了信息传输方式,即中断和DMA。
在中断和DMA两种方式的信息传输过程中,或者信息完成之后,仍需要CPU参与部分信息传输的处理工作。为了使CPU工作和IO工作能估并行起来,或者是输入输出的数据输入输出的管理控制,尽可能的从主机中独立出来。就出现了具有通道结构的IO阶段。
通道可以看作是一种简单的处理器 ,或者是一个小型的,功能更强的DMA控制器,他能够执行通道程序,通道有自己的指令系统,通过执行通道程序,可以控制连接在通道上的IO设备和主机之间直接进行传输。
IO处理机,可以是专用的处理机,在大型计算机中,我们可以使用现在的微处理器直接作为IO处理机来用,控制IO设备的工作,或者在有些大型计算机中,直接使用和主机中处理器完全相同的处理器来作为IO处理器,这时,IO处理器功能非常强大,甚至在没有IO设备的时候,可以主机处理器进行使用完成相应的任务。
1、IO指令: CPU指令的一部分,CPU通过这些指令控制IO设备协调工作。
操作码:表示这样的指令是IO指令
命令码:相当于CPU指令中普通指令的操作码,指出了要对IO设备做怎样的操作,如:对IO设备进行查询,输入,输出,以及其他的控制
设备码:给出的是IO设备的编码,也就是IO设备的地址,或者是IO设备中某一个寄存器的地址,这些寄存器叫做IO端口。
2、通道指令: 通道自身的指令
通道自身的指令,通道是一种小型的MDA处理机,能够实现IO设备和主机之间直接进行信息传送,通道有自己的控制器,有的通道还有自己的存储器,通道能够执行由通道指令组成的通道程序,通道指令就是通道自身的指令,通常情况下,编程人员,在应用程序中,为了调用外部设备,使得外部设备能够工作,应用程序中需要增加广义IO指令,广义IO指令要指出参加数据传输的IO设备,数据传输主存的首地址,传输数据的长度,传输的方向(向IO设备传输数据还是向主存传输数据),操作系统通过广义IO指令给出的参数以及要求的操作,会编写一个由通道指令组成的通道程序,并且把通道程序放在内存或者是通道自己的内存指定的位置,之后启动通道进行工作,通道拿到通道程序的首地址后,就可以执行通道程序,控制IO设备完成相应的输入输出工作,所以通道指令中的一些参数需要指出要传输成块数据的首地址,当然通道也可以传输单个字节,这时候需要指出这个字节在内存中的地址,或者是要把这个字节传输到内存中的哪一个地址,如果是一组数据,还要指定传输的字数 ,传输的方向,设备地址等,这些参数都要有通道指令指出,这些指令一般比较长,通道下面还可以带若干个子通道,子通道可以并行进行工作,每个字通道下可以连接多个设备控制器,每个设备控制器可以连接多个设备
IO设备,IO接口
IO设备通过IO接口连接在总线上,和主机完成信息交换,
设备连接设备控制器,设备控制器连接通道,通道连接子通道。
如果CPU要启动IO设备进行输入输出,那么主机和IO设备如何进行联系。
1、统一编址
把IO设备的编址看成是内存地址的一部分,比如将内存的高位或者低位部分地址作为IO设备地址,当CPU访问内存的这部分地址的时候,就相当于是对IO设备的访问,这样CPU使用存数、取数指令对IO设备进行访问控制,我们不需要单独的IO指令,只要CPU指令的地址码落到了内存IO地址的部分,那这条指令就是对IO地址进行操作的,这种方式CPU的指令集会相对简单。如果内存地址的编址比较大的话,就可以采用统一编址的方式
2、不统一编址(单独编址)
在内存地址之外,专门设置一个地址空间,如内存地址空间是20位,寻址范围是1M,对外部设备进行编址时候,使用16位,即64K,为了区分一条指令是对内存进行操作,还是对IO设备进行操作,在单独编址的计算机中,输入输出指令就不能计算机系统原有的取数或者存数指令,我们要用专用的IO指令来对IO设备进行控制操作。
用设备选择电路识别是否被选中:把IO设备中保存的地址和CPU指令给定的地址进行比较即可。
1、 串行,数据一位一位进行传输,传输速度慢,但是适合远程传输
2、 并行,同时传输多位数据,所以有多条线路,通常数据线条数为8的倍数。
为了进行并行工作, IO设备和IO接口之间要有多条数据线组成的类似总线结构的数据线来完成数据并行的输入和输出,双方之间还要采用应答信号。
如果IO设备要接受数据,IO接口把数据准备好以后,通过Ready信号告诉IO设备端口中的数据已经准备好了,IO设备对端口中的数据进行读取,并给出应答信号。
如果是输入,IO设备通过IO接口将数据输入到CPU中,或者输入都主机中,IO接口当中的数据缓冲器一旦空了,会向IO设备发送Ready信号,告诉IO设备可以向IO接口中发送数据了,IO设备向IO接口发送数据,并且给出应答信号。
每台设备都配有一套,控制线路和一组信号线,这种方式不便于增删设备。
外部设备通过接口和CPU进行连接,接口能够向外部设备传送CPU的控制命令,可以向CPU传送外部设备的状态信息,同样,接口还可以完成数据缓存,外部设备输入的数据可以先缓存在接口中,完成数据的格式转换操作,在传送给主机,或者主机中的数据在接口中进行缓存,经过格式转换处理传输给外部设备。这种方式便于增删设备。
这种方式中,CPU和外设采用串行方式进行工作的。
从外部设备中读取一批数据进入计算机内存的过程:首先CPU在程序中执行一条指令,这条指令就是读操作,向IO设备发出读命令,发出读命令以后,CPU开始读取IO的状态,实际上是IO接口中状态标志值,看数据是否被准备好,如果数据没有被准备好,就会执行跳转指令继续不断地读取状态判断数据是否准备好,如果状态标志显示数据已经被准备好了,这时候CPU就可以从接口中读出数据,这个数据可以是一个字节,也可以是一个字,把这些数据放到CPU的某一个寄存器中,然后把寄存器中保存的数据写入到内存指定的位置,然后判断传输是否结束,如果没有结束,CPU继续通过程序向IO设备发出读指令。
图为查询外部IO设备是否准备好数据的逻辑,一般,外部设备执行的速度很慢,CPU执行速度很快,外部设备经过一个较长的时间才能把数据准备好,然后将准备好的数据送入到IO接口中的数据缓冲,然后状态置为数据准备好了。CPU只有查询到数据准备好了才能进行数据传输。在数据准备过程中,CPU一直处于原地踏步状态,没有去执行其他指令,没有去做其他工作,这样CPU的效率非常低。
在以上的工作方式中,内存和CPU工作过程中,必须要通过CPU,先要把数据送入到CPU的寄存器中,然后把数据送入指定的目标,这个目标可以是外部设备,也可以是内存的某一个存储单元,在这种情况下,内存—CPU—IO三者之间的连接关系可以看作是以CPU为中心,信息交换必须经过CPU,外部设备慢,CPU速度快,在数据准备过程中消耗了CPU的大量时间,造成CPU的效率非常低。
中断方式过程: CPU执行主程序,在执行程序过程中碰到一个IO指令,执行这个IO执行,启动IO设备进行数据准备,发出启动设备的指令后,CPU继续执行原来的程序,外部设备接收到了启动设备的命令,接收到了输入输出操作的命令,外部设备开始进行状态准备,当外部设备准备好接收或者是输入数据以后,他就会向CPU提出一个中断请求让CPU停止对当前程序的执行,转而和IO设备进行数据交换,当数据交换完成,CPU继续执行原有的主程序。
这种方式,在设备自身准备阶段,CPU没有等待,只有到了真正进行数据传输了,由外部设备主动的发起中断请求信号,请求CPU协助完成数据的输入和输出操作。
IO工作可以分成两个阶段,数据准备阶段和与主机交换信息阶段,在程序查询方式当中,数据准备和与主机相互交换信息两个阶段,CPU都要参与工作,程序中断方式对程序查询方式进行了改进,在IO设备和IO接口进行数据准备的时候,CPU不进行查询只有当外部设备和内存之间开始进行信息交换的时候,CPU才会暂停(中断)现行程序,为输入和输出进行服务。
这种方式中,CPU实现了和IO设备之间部分的并行工作,也就是在IO设备进行数据准备的时候,CPU还可以执行自己的程序,不需要停等。这种方式CPU可以一定程度的成数据的输入输出中解放出来。
这种情况一定程度的对CPU进行了解放,但是不彻底,因为数据传输过程中仍然需要CPU的参与,而且要保证程序被中断掉以后,CPU返回了能正确的继续执行程序,这就需要CPU执行保存现场和恢复现场的指令,需要消耗一定的时间。如果外部设备和内存之间传输的数据数据量特别小,比如只传输1个字节,但是扔需要CPU执行很多条指令来完成现场的保护或者是恢复工作,依然会消耗CPU大量的时间。
这种方式在内存和IO之间建立了直接的通路,内存和IO直接通过DMA控制器进行数据交换,在数据交换过程中也不需要CPU的参与,把CPU进一步的从数据的输入和输出中解放出来。不需要中断现行程序的执行,采用周期挪用(周期窃取),由DMA控制器直接控制外部设备和内存直接进行数据交换。
周期挪用: 因为DMA控制主存和外设之间进行信息交换,一定要使用到总线(地址线,数据线,控制线),这些总线如果DMA利用他们进行信息交换,那CPU就要把总线的使用权让出来,让出来的时间就是一个存取周期,在这个存取周期中,如果DMA要完成IO和内存之间的数据交换,那这个存取周期,总线就交给DMA使用,同样,总线控制权也交给DMA,这种方式叫做周期挪用。
上图中,CPU执行主程序,当CPU碰到了IO指令要进行数据输入或者数据输出,CPU发出启动IO的指令,发出指令之后,CPU继续执行自己的程序,IO设备在DMA控制器的控制之下,完成数据的准备,当数据准备好以后,要进行数据传输了,由DMA控制器发出DMA占用总线请求,占用一个存取周期,利用这一个存取后期进行外部设备和IO之间的数据交换,在这一个存取周期中,CPU不能使用总线对内存进行访问,这个周期结束以后,IO设备可以继续进行准备,CPU继续去执行现行的程序,也就是这个周期结束后,总线的控制权,对内存的使用权又归还给了CPU,在这一个存取周期中,CPU虽然不能使用总线,不能访问内存,但是这个周期中CPU还是可以执行的,比如:现在处理器, 并不是CPU每执行一条指令就从内存中取出一条指令,指令是需要预取的,在指令执行之前,可能若干条指令已经被预取到CPU的执行缓冲当中了,只要这些指令不需要访存,或者是在这个存取周期中不需要访存,CPU就可以利用指令缓存中的指令或数据继续执行主程序中的指令,所以在这一个存取周期中,CPU的工作和外部设备和内存间的数据交互还是可以进行并行操作的。
IO设备通过接口电路和主机进行连接,外部设备包括两大部分,设备控制器和机电磁光部分,外部设备设备通过IO接口和主机之间进行数据交换,主机通过IO接口向设备控制器传输控制命令,控制外部设备进行相相关的操作;同样,主机通过IO接口来读取外部设备的状态。
外部设备分类:
人机交互设备 | 键盘、鼠标、打印机、显示器 |
---|---|
计算机信息存储设备 | 磁盘、光盘、磁带 |
机 机通信设备 | 调制解调器等 |
A/D、D/A(模拟/数字(数字/模拟)转换器): 计算机内部使用的都是数字信号,如果计算机要对外部设备进行控制,或者是要把信号进行远程传输,需要将数字信号转换成模拟信号,在接收端,需要在把模拟信号转换成数字信号。同样,外部设备对主机的输入,可能采用的是模拟信号,主机需要将模拟信号转换成数字信号。
终端: 终端一般由显示器和键盘组成,但不仅仅是键盘和显示器,还有一些控制机构,缓存等。一般终端不能进行单独工作,需要一些连接线和远程的主机进行连接,才能进行工作。
1、 实现设备的选择
我们使用总线的方式来完成外部设备和系统主机之间的连接,外部设备要有地址,主机通过地址来确认这次数据传输是和那个设备进行数据传输。
2、 实现数据缓冲达到速度的匹配。
外部设备工作多样,工作速度差异也非常大,有的速度比较快,如硬盘,有的速度比较慢,如键盘,可能很长时间来能输入一个字节的数据,要通过接口实现数据缓冲,达到速度匹配的问题。
3、 实现数据串—并格式转换。
接口和主机之间采用并行传输,一次传输一个字节或者一个字,外部设备和接口之间可能采用串行传输,一位一位的传输,数据要在接口中完成数据的组装或者拆解,做格式转换。
4、 实现电平转换
主机和IO设备工作的电平不一致,通过IO接口完成电平的转换,是主机和IO设备能够协调进行工作。
5、 传送控制命令
CPU把控制命令传输到接口当中,由这个命令控制外部设备进行工作。
6、 反应设备状态(忙,就绪,中断请求)
接口总要有状态标志。
1、总线连接方式的 I/O 接口电路
设备选择线
传输的是参与本次信息交换的设备的设备码或者是端口号,实际上就是设备的地址或者是端口的地址,这个地址传输给IO接口,在IO接口中进行匹配,看是否是这个接口上连接的某个设备要参与这次数据传输,这条线是单向线。
数据线
完成数据的输入和输出,线的条数和接口类型有关,双向线。
命令线
来自CPU的命令,通过命令线输入到IO接口中,命令经过缓冲和译码以后,可以控制设备进行相应的输入和输出操作。
状态线
单向线, 从IO接口送到IO总线,进而送到主机由主机连接外部设备的状态。
2、接口的功能
功能 | 组成 |
---|---|
选址功能 | 设备选择电路 |
传送命令的功能 | 命令寄存器、命令译码器 |
传送数据的功能 | 数据缓冲寄存器 |
反映设备状态的功能 | 设备状态标记 |
完成触发器: 用于标记设备是否准备好,数据是否准备好,D = 1完成,D = 0未完成
工作触发器: 用于标识外部设备共组是否忙,B = 1忙,B = 0闲
中断请求触发器: 中断方式中,数据准备好以后主动由设备提出中断请求,因此接口中要有中断请求触发器,另外接口可能有中断请求,但是是否允许他向主机提出中断请求要看设备中断请求的重要性。因此在接口中设置了屏蔽触发器。
屏蔽触发器: 如果屏蔽触发器 = 1 尽管设备已经完成了工作,依然不能向主机或者CPU发出中断请求。因为主机当前处理的程序的重要性比这次输入输出操作的重要性高。
左端:
数据线:双向并行传输
地址线:给出的是外部设备的地址,供设备选择电路使用,
命令线:给出设备操作命令,放在命令寄存器中进行锁存,进而进行译码,并且在时序控制电路的控制下给出各个操作以及操作之间的时间关系。
状态线:把IO接口、外部设备的状态传输给CPU。
右侧:
数据线:传输接口和设备之间需要传输的数据。
命令线:来自于命令译码器和时序逻辑,控制外部设备做相应的工作。
状态线: 外部设备状态输入,对状态标记进行置位或者复位。
分类方式 | 分类 |
---|---|
传送方式 | 并行接口,串行接口 |
选择的灵活性 | 可编程接口,不可编程接口 |
通用性 | 通用接口、专用接口 |
数据传送的 控制方式 | 中断接口,DMA 接口 |
如果只有一个设备参与内存和IO之间的数据传输,在执行程序的过程中,CPU执行到一个输入输出指令,由这个输入输出指令发出启动设备的命令,相应的设备接收到这个命令之后,就进行相应的数据准备,数据准备好以后,再传输给CPU,CPU发出设备启动命令之后,开始检查设备状态标记,看IO接口中的数据是否已经准备好,设备是否已经准备好进行输入或者输出,如果准备就绪,就进行数据交换,如果没有准备就绪,CPU就处于一种踏步状态,通过循环的方式检查状态标记,知道数据准备好,开始交换数据,这个过程中我们要使用三条指令:
1、 检查状态标记指令:测试指令
2、 在检查设备是否准备就绪,需要一个转移指令
3、 数据传送指令进行交换数据、数据输入输出指令或者访存指令
多个设备
如果有多个设备都要通过程序查询方式和CPU进行数据交换, 都要通过程序查询方式和内存进行数据交换,我们需要把参与传输的这些设备按照优先级进行排序,优先级越高的设备被查询到的时间就越早。
首先要保存寄存器内容:因为程序查询方式要完成内存和外设的数据输入输出,需要借助CPU中的某一个寄存器对数据进行暂存,如果这个寄存器中的数据是有用的,我们要对这个寄存器中的数据进行保存,可以把他写入到某一个内存单元中,把他压入堆栈中,或者把他放入到其他寄存器中进行保存。
设置计数器值:控制传输的数据量,这次内存和IO之间进行数据传输到底传输多大量的数据,计数值的设置有两种方式:1、如果我们要传输n个字,计数器的值就设置为n,每完成一个字的传输,将n-1,直到减到0为止,就完成了数据的传输。2、把计数器的值设置为-n,并且这个负数用补码进行表示。每传输一个字,在这种情况下,对计数器的加1,直到计数器溢出,计数器中的值变成0,数据传输结束。
设置主存缓冲区地址:数据传输需要只要内存这个块的地址是多少。我们保存数据或者读取数据就从这个主存缓冲区的首地址开始。
启动外部设备:让外部设备进行准备和数据传输。
启动外部设备以后,CPU开始查询外部设备的状态或者是IO接口的状态,如果没有准备好,CPU进行原地踏步反复进行查询,知道状态标志标明数据已经准备好了,这个查询操作才会停止开始进行数据传输。
数据传输完以后:
修改内存地址:加一或者减一,为下次输入或者输出做准备。
修改计数值:加一或者减一,表名还有多少数据需要传输。
判断数据是否传输完成。
程序员编写一个程序,要用程序查询的这种方式来完成数据输入输出,在他的应用程序中,需要嵌入以上的程序流程,由这段程序完成数据输入和输出操作,根据这个流程以及IO接口电路的基本结构,我们可以得到程序查询的接口电路:
1、 CPU通过地址线给出外部设备的地址
2、 设备选择电路把自己的设备地址或者是端口号和地址线上的地址进行比较,如果相同,说明启动的就是连接在这个接口电路上的设备,此时SEL信号有效。
3、 启动命令和SEL信号都有效的前提下,对两个状态标记进行置位或者是复位。
4、 目前是CPU发出读命令,设备还没有开始工总,因此标记D = 0表示数据还没有准备好,标记B = 1表示设备开始工作设备处于忙状态,
5、 B标记去启动设备,设备接收到B的标记信号后以及启动命令之后,这杯开始工作,
6、 设备把数据准备好,并且数据通过输入的数据线把他保存到DBR数据缓冲当中,这时设备工作结束。
7、 设备通过设备状态线向接口电路送入设备工作结束信号,这个信号会修改接口电路中的两个标记,D = 1表示数据已经准备好,B = 0表示设备闲,工作已经完成。
8、 D准备就绪信号被送出。
在上述过程中,直到D状态为1前,CPU都在原地踏步查询D。
9、 CPU查询到D = 1,说明数据已经准备好,并且已经放入到DBR。
10、 CPU通过数据线对数据进行读入。
CPU执行程序的过程中,如果发生意外事件或者是特殊事件,CPU要中断当前程序的处理执行,转而处理特殊事件或者是异常事件,通过执行中断服务程序的方式进行处理,处理结束之后,要返回到被中断的程序的断点继续执行原来的程序。
1、配置中断请求触发器和中断屏蔽触发器
由外部设备对中断请求标志进行设置值,表明有中断请求,这个中断请求标志能否变成中断请求信号向CPU发出中断请求,还需要看这个中断请求标志是否会被屏蔽掉,所以需要一个中断屏蔽触发器,因为有时计算机正在执行的程序他的重要性高。
排队器
在同一个时刻,向CPU发出中断请求的可能有多个设备,这些设备的优先级是不一样的。经过排队之后,只有优先级最高的设备提出的中断请求会被响应。
排队器有硬件和软件两种实现方式,这里简述硬件排队方式实现。硬件实现电路在 CPU 内或在接口电路中。
设备 1#、2#、3#、4# 优先级按 降序排列,INTRi = 1 为有请求, 即 ! INTRi = 0,最终输出的INIP只有一个是高电平,其他的都是低电平,高电平代表目前要相应的优先级最该的IO设备
中断向量地址形成部件
需要执行中断程序,必须知道中断服务程序的入口地址。也就是中断服务程序在内存中的起始地址。
入口地址的产生方式也有两种,硬件方式与软件方式,这里简述硬件方式。硬件方式由 硬件 产生 向量地址,再由 向量地址 找到 入口地址。
中断号:中断编号,如8086中支持256个中断,这256个中断被编号成0-255
中断向量:中断服务程序的入口地址,段地址 + 偏移量,以及执行中断服务程序的状态信息。
中断服务程序的入口地址:可以由中断地址生成
向量地址:中断向量保存的内存单元的地址。
1、CPU响应中断的条件和时间
条件:
允许中断触发器 EINT = 1。
用 开中断 指令将 EINT 置 “1”,用 关中断 指令将 EINT 置“ 0” 或硬件 自动复位。
时间:
当 D = 1(随机)且 MASK = 0 时。
在每条指令执行阶段的结束前。
CPU 发 中断查询信号(将 INTR 置“1”)。
2、IO中断处理过程
以数据输入为例:
当CPU在执行程序的时候,遇到一个输入指令,要求把指令的外部设备把数据输入到主机中。
1、 CPU通过这条指令在数据线上给出设备的地址,
2、 设备地址送到接口电路中后,利用设备选择电路和设备地址进行比较,如果相同,那这个接口和相对应的设备就被选中,SEL信号有效,接口电路开始工作。设备被选择的信号。
3、 CPU送来启动命令或者是对接口和设备的控制命令,这个命令在接口中进行译码。
4、 启动命令和SEL信号同时有效 ,触发器B = 1用于启动设备,并且表示设备开始工作设备忙,触发器D = 0表示数据还没有准备好,
5、 接口工作结束以后,将数据送入到接口中的数据缓冲区DBR。B = 0表示接口工作完成处于闲状态,D = 1表示数据已经准备好。
6、 如果接口的中断请求没有被屏蔽,发出中断请求,经过排队器进行排队,排队器的输出信号只有一个是1。
7、 CPU发出中断响应信号,形成向量地址,向量地址(包含设备号等信息)通过数据线传输给CPU,传给PC,PC通过这个地址取出中断程序的入口地址。
服务流程
保护现场————中断服务(对不同的 I/O 设备具有不同内容的设备服务)————恢复现场(出栈指令)————中断返回(中断返回指令)
程序断点保护:当前PC中保存的地址的值。有些不能读取的状态也需要进行保护,直接通过硬件完成,这个称为中断隐指令,并不是一条指令。
寄存器内容的保护:中断服务程序可能会利用到CPU中的某些寄存器,这些寄存器之前的值也需要进行保护,通过进栈指令进行保护
单重中断
CPU在执行中断服务程序的过程中,如果有了新的中断请求,不管新的中断请求的优先级有多高,都不能中断现行的中断服务程序。
多重中断
CPU在执行中断服务程序的过程中,允许级别级别更高的中断源中断现行的中断服务程序。
宏观 上 CPU 和 I/O 并行 工作,微观 上 CPU 中断现行程序 为 I/O 服务。
1、DMA 和程序中断方式的数据通路比较
2、DMA与主存交换数据的三种方式
(1)停止CPU访问主存
控制简单,CPU放弃总线和内存使用权,将使用权交给DMA接口。适合大量数据进行传输。
问题:数据传输过程中,如果CPU的指令缓冲器中有指令或者是已经将指令或者数据加载进了cache,CPU可以继续执行指令。但是当没有指令和数据了,CPU将会保持当前的状态。
这种方式不能充分发挥CPU利用率。因为当一块数据传输给主存的过程中,数据是一个字一个字的在外部设备和主存之间进行传输, 传输的间隔可能会比较大,这个时间会超过一个主存周期。在传输间隔这段时间,虽然DMA接口没有直接使用主存,但是依然占用主存的访问权,CPU这段时间不能访问主存执行程序。
这里的周期指的是访存周期,如果DMA接口准备好了数据传输,就申请总线的使用权,占用一个或者是几个内存访问周期,完成数据的传输,在数据传输的间隔或者是数据准备阶段,DMA接口放弃对内存的使用和对总线的占用。
DMA访问主存有三种可能:
CPU此时不访存
CPU正在访存,正处于某一个访存周期的中间阶段,DMA等待
CPU和DMA同时请求访存,这种情况下,DMA优先的,CPU要放弃对内存和总线的控制权
由于在固定的时间点,存储器和IO总线使用权是固定的,就不需要DMA提出DMA申请,建立对总线和内存的控制权和使用权,速度比较快。
功能
(1) 向 CPU 申请 DMA 传送
(2) 处理总线 控制权的转交
(3) 管理 系统总线、控制 数据传送
(4) 确定 数据传送的 首地址和长度,修正 传送过程中的数据 地址 和 长度
(5) DMA 传送结束时,给出操作完成信号
组成
AR:地址寄存器,由CPU给出,存放下一个数据将要放在内存中的那个位置,如果数据的存放是由低地址向高地址,每存入一次将AR + 1
WC:存放的是将要放入CPU中的数据的字长,最开始存放-n,每次存入一次,WC + 1
BR:数据缓冲器,外部设备的数据或者是存储单元中输出的数据,要暂在接口的数据缓冲器中。
DAR:设备地址寄存器
(1) 供设备选择电路使用,判断这次访问的设备是不是这个接口中当前连接的设备,是否由这个DMA接口进行管理。
(2) 对硬盘进行访问的时候,这个DAR中还可以用于保存柱面号,磁道号,扇区号。
DMA控制逻辑:控制接口内部协调工作,控制在给定的时序发出给定的信号,如给CPU发出DMA请求。向主存发出读写信号。外部设备要向DMA进行数据传输,外部设备要向DMA控制器发出请求信号,DMA控制器向设备发出控制信号。给CPU发出总线占用请求信号,CPU发出应答信号。
中断机构:用于数据传输完以后,对后续工作进行处理的。如WC = 0表示传输结束,如果等于0,就会向中断机构发送信号,给终端机构的中断请求触发器状态置为1,当一条输入指令执行完成后,由中断机构发信息给CPU,让CPU做完成后的处理。
1、预处理
(1)通知 DMA 控制逻辑传送方向(入/出)
(2)设备地址 DMA 的 DAR
(3)主存地址 DMA 的 AR
(4)传送字数 DMA 的 WC
2、数据传送
允许传送:能否占用内存和总线的使用权,如果CPU正在使用总线和内存(一个存储周期未结束),DMA等待。
数据传输过程如下:
2、 通知设备请求信号DREQ告诉DMA控制逻辑数据已经准备好了。
3、 DMA控制逻辑通过总线向CPU提出总线和主存占用请求
4、 CPU在允许的时候给出应答,此时CPU会放弃总线和主存的占用权,总线和主存由DMA接口进行控制。
5、 要进行数据传输,就要给出主存的地址,此时由AR给出要将数据写入的内存中的地址,使得系统总线中地址总线是有效的
6、 由设备控制器给出设备应答信号DACK,告诉设备已经开始信息传输。
7、 对内存的读写控制信号由DMA控制逻辑给出,数据由 BR发出通过数据线传送给主存,每传输一个数据,AR + 1, WC + 1.
8、 通过溢出信号判断数据是否传送完成,如果溢出,会将溢出信号传送给中断机构,使得中断请求触发器置1,参数中断排队,发出中断请求信号给CPU,使得CPU去做中断后处理。没有溢出,即没有传输完会继续进行传输,下次传输,设备继续将数据放入BR中。
数据输出:
2、 由DREQ发出信号通知设备控制器,BR已经空了,可以用于接收下一个数据了。
3、 DMA控制逻辑通过总线向CPU提出总线和主存占用请求
4、 CPU在允许的时候给出应答,此时CPU会放弃总线和主存的占用权,总线和主存由DMA接口进行控制。允许下一次的数据输出
5、 要进行数据传输,就要给出主存的地址,此时由AR给出要将数据写入的内存中的地址,使得系统总线中地址总线是有效的
6、 由设备控制器给出设备应答信号DACK,告诉设备已经进行了新的数据传输。
7、 次数内存中的数据通过数据线再次写入到BR中,每传输一个数据,AR + 1, WC + 1。
8、 通过溢出信号判断数据是否传送完成,如果溢出,会将溢出信号传送给中断机构,使得中断请求触发器置1,参数中断排队,发出中断请求信号给CPU,使得CPU去做中断后处理。没有溢出,即没有传输完会继续进行传输,下次传输,设备继续将数据放入BR中。
3、后处理
由中断服务程序完成:
(1)校验送入主存的数是否正确
(2)是否继续用 DMA
(3)测试传送过程是否正确,错则转诊断程序
1、具有公共请求线的 DMA 请求
中断方式 | DMA 方式 | |
---|---|---|
数据传送 | 程序 | 硬件 |
响应时间 | 指令执行结束 | 存取周期结束 |
处理异常情况 | 能 | 不能 |
中断请求 | 传送数据 | 后处理 |
优先级 | 低 | 高 |
在 物理上 连接 多个 设备 ,在 逻辑上 只允许连接 一个 设备
从物理上说一个DMA接口可以连接多个设备,但是在数据准备和数据传送的整个过程中,在逻辑上实际上这个接口只能连接一个设备
在 物理上 连接 多个 设备 ,在 逻辑上 允许连接 多个 设备同时工作