本笔记可结合《2023王道计算机组成原理考研复习指导》食用🔥
I/O就是输入输出,I/O设备就是可以将数据输入道计算机,或者可以接收计算机输出数据的外部设备。
主机如何与I/O设备进行交互:通过I/O接口,又称I/O控制器、设备控制器,负责协调主机与外部设备之间的数据传输。I/O控制器多种多样,也会制定相映的标准,如:用于控制USB设备的IO接口、用于控制SATA 3.0硬盘的IO接口等。(I/O控制器就是一块芯片,常被集成在主板上)
CPU和外设之间的速度差距是很大的,所以我们需要有数据寄存器来作为缓冲,一个慢速的外设可以往数据寄存器里慢慢的写入数据,当这个寄存器被写满,CPU很快的将这个寄存器的数据取走。
如上图,
主机侧(系统总线)这一侧数据的传输方式只能是并行传输。(这句话2000年以前对,2000年以后错)
设备侧这一侧数据的传输方式既有可能是串行传输,也有可能是并行传输。
这样的一个I/O接口可以连接多个外设,都是通过外设界面控制逻辑连接
CPU连接在左边主机侧,然后外设(例如打印机)连接在右边设备侧
控制寄存器、状态寄存器在使用时间上是错开的,因此有的I/O接口中可将二者合二为一。 IO控制器的各种寄存器称为IO端口。例如数据缓冲寄存器称为数据端口,状态寄存器称为状态接口。
I/O端口就是一个一个的寄存器。由于I/O接口内部有很多端口(寄存器),为了标明CPU要访问的是哪个寄存器,因此我们就需要给这些端口(寄存器)进行编址。 CPU对于不同端口(寄存器)的操作是不一样的:
如何访问I/O端口?I/O端口要想能够被CPU访问,必须要有端口地址,每一个端口都对应着一个端口地址。
统一编址:把I/O端口当做存储器的单元进行地址分配,用统一的访存指令就可以访问I/O端口,又称存储器映射方式(意思就是I/O端口的地址和内存的地址是一整套)
靠不同的地址码区分内存和I/O设备,I/O地址要求相对固定在地址的某部分
LOAD
指令,只要可以访问内存也可以访问I/O端口如系统总线中地址线共10根,则可以访问的存储单元个数为210=1024个,假设要给10个I/O端口编址
0-9 表示I/O地址,10-1023为主存单元地址
0-1013表示主存单元地址,1014-1023为I/O地址
10-19表示I/O地址,0-9、20-1023为主存单元地址
优点:不需要专门的输入/输出指令,所有访存指令都可直接访问端口,程序设计灵活性高。端口有较大的编址空间,读写控制逻辑电路简单
缺点:端口占用了储存地址空间使储存地址空间变小,外设寻址时间长(地址位数多,地址译码速度慢)
独立编址: I/O端口地址与存储器地址无关,独立编址CPU需要设置专门的输入/输出指令访问端口,又称I/O映射方式(意思就是I/O端口的地址和内存的地址是相互独立的)
按数据传送方式可分为:
按主机访问I/O设备的控制方式可分为:
按功能选择的灵活性可分为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HmCufvu3-1659540077893)(王道计组第七章IO系统.assets/10.png)]
程序查询方式:CPU启动I/O操作之后,例如启动一个读操作,当I/O设备在准备数据的时候, CPU会不断的轮巡检查I/O接口当中这个状态是否已完成,当CPU发现I/O设备的数据准备完成之后, CPU才会去I/O接口当中取走数据。在I/O设备准备数据的这个过程当中,CPU不可以干其他事情, CPU需要一直轮巡检查I/O接口状态。
程序中断方式:每一次I/O设备(外设)准备好一个字的数据, CPU就需要运行一次中断服务程序,把这一个字的数据转存到主存当中,所以对于那些速度很快的I/O设备来说,采用这种中断控制方式,会使CPU执行中断服务程序开销很大,效率很低
DMA方式:DMA控制器也是一种I/O控制器,也就是I/O接口。在数据准备阶段,CPU与外设并行工作, DMA方式在外设与内存之间开辟一条直接数据通路,信息传送不再经过CPU,降低了CPU在传送数据时的开销,因此称为直接存储器存取方式。由于数据传送不经过CPU,也就不需要保护恢复CPU现场等操作
在这种控制方式下,CPU一旦启动I/O,就必须停止现行程序的运行,并在现行程序中插入一段程序。
题目告诉我们这个系统采用程序查询方式, CPU和I/O接口之间的数据输入输出时间不考虑,只考虑查询时间。
每一个查询操作需要100个时钟周期,CPU的时钟频率是50MHz,则时间:
鼠标:
硬盘:
程序中断是指在计算机执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂时中止现行程序,而转去对这些异常情况或特殊请求进行处理,在处理完毕后CPU又自动返回到现行程序的断点处,继续执行原程序。
如上图, CPU执行完一条指令在末尾都会检查是否有中断请求,例如键盘敲击产生一个中断请求, CPU会暂时改变自己执行指令的流,转而执行中断服务程序。
CPU处理中断的基本流程:
CPU如何判断自己当前处于关中断的状态呢?这个信息会被记录在PSW状态寄存器里面,当IF=1表示开中断(允许响应中断),IF=0表示关中断(不允许响应中断)。关中段可以用来辅助原子操作。
中断请求标记:判断是哪个设备发来的中断信号
每个中断源向CPU发出中断请求的时间是随机的。为了记录中断事件并区分不同的中断源,中断系统需对每个中断源设置中断请求标记触发器INTR,当其状态为"1"时表示中断原由请求。这些触发器可组成中断请求标志寄存器,该寄存器可集中在CPU中,也可分散在各个中断源中。
通过INTR线发出的是可屏蔽中断,也就是外中断,对于外中断,CPU是在统一的时刻即每条指令执行阶段结束前向接口发出中断查询信号,以获取I/O的中断请求,也就是说,CPU响应中断的时间是在每条指令执行阶段的结束时刻。
CPU响应中断必须满足以下三个条件:
中断判优:有多个中断信号同时到来,先处理哪一个中断
中断判优既可以用硬件实现,也可以用软件实现:
如上图,在K指令执行结束后发现了一个中断信号,此时我们需要让PC指向该中断处理程序的第1条指令的地址,但是由于此时PC指向的是K+1条指令,现在这个中断事件导致程序执行流发生了改变,所以CPU处理完中断之后,又需要将PC的值指向K+1。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZvR5042H-1659540077897)(王道计组第七章IO系统.assets/18.png)]
我们给每一个中断请求信号进行编号,在主存中与这些中断请求号对应的单元中保存了 JMP 指令,这个指令指明了这个中断请求所对应的中断请求处理程序的入口地址,中断请求处理程序的入口地址就是中断向量。把系统中的全部中断向量集中存放到存储器的某个区域内,这个存放中断程序的存储区就称为中断向量表。
我们用硬件排队器进行中断判优,只会有一条线输出1,其他的输出线一律都是0,将硬件排队器输出作为中断向量地址形成部件的输入,将其映射为某一个向量地址(中断类型号)。 CPU响应中断后,通过识别中断源获得中断类型号,然后据此计算出对应中断向量的地址,再根据该地址从中断向量表中取出中断服务程序的入口地址并送入程序计数器PC,于是CPU转而执行中断服务程序,这种方法被称为中断向量法,采用中断向量法的中断被称为向量中断。
中断服务程序的主要任务:
正常情况,CPU取一条指令执行一条指令,取一条指令执行一条指令,顺序执行各条指令。在每条指令的末尾,CPU都会检查是否有中断信号,若没有中断信号需要处理,则继续取下一条指令执行下一条指令。若有中断信号需要处理:
单重中断:执行中断服务程序时,不响应新的中断请求
- 因为关中断和开中断保证了中断服务程序一气呵成,即使此时有新的中断请求也不会响应
单重中断:在CPU执行中断服务程序的过程中,又出现了新的更高优先级的中断请求,而CPU对新的中断请求不予响应,则这种中断称为单重中断
多重中断:又称中断嵌套,执行中断服务程序时可响应新的中断请求。(也就是执行中断服务程序时又发生了中断, CPU暂停现行的中断服务程序转去处理新的中断请求)
保护现场和恢复现场的操作都必须一气呵成
多重中断其实就是又增加了一条关中断和开中断,并且多层中断,在保护现场时也会保护屏蔽字。屏蔽字也叫中断屏蔽字,他可以屏蔽某些中断
中断屏蔽技术主要用于多重中断,CPU要具备多重中断的功能,须满足下列条件:
每个中断源都有一个屏蔽触发器,1表示屏蔽该中断源的请求,0表示可以正常申请,所有屏蔽触发器组合在一起,便构成一个屏蔽字寄存器,屏蔽字寄存器的内容称为屏蔽字
左边是硬件排队器,右边是增加了中断屏蔽功能的硬件排队器.
屏蔽字设置的规律:
如果ABCD同时发来中断请求,A的中断请求优先级最高,D的中断请求优先级最低。要将中断处理次序进行改造:
在时刻5,B发出中断请求, CPU就会运行与B相关的中断服务程序,当运行5us到时刻10,D发出中断请求,此时B虽还未执行完毕,但D的优先级高于B,于是D中断B而获得CPU。D运行20us到时刻30完成,于是继续运行B的中断程序,当再运行5us到时刻35,A发出中断请求抢走CPU,于是A运行20us到时刻55完成,再次继续运行B,运行5us到时刻55,C发出中断请求抢走CPU,于是C运行20us到时刻80完成,再次继续运行B,运行5us结束。
向量地址指向了中断向量的地址,而中断向量指向了中断服务程序的入口地址。
如上图, CPU正在运行某一个现行程序,这个程序有可能需要使用到外部设备,那么我们需要将I/O指令发送给外部设备,接下来这个外部设备就可以准备CPU想要的数据和信息,在外部设备准备数据的过程当中,CPU可以继续执行现行程序。当外部设备完成准备数据工作之后,会给CPU发送中断请求信号,假设CPU执行的现行程序是指令K,在指令K末尾检测到中断请求信号,CPU然后对这个中断请求信号进行处理。处理完成后CPU执行K+1指令,继续执行现行程序
CPI:每一条指令需要多少个时钟周期,时钟周期 = 1/CPU时钟频率。外设准备数据的时间需要0.5ms,设备D采用中断方式进行输入/输出,I/O端口每收到一个字符申请一次中断,中断响应需要10个时钟周期(收到中断请求到作出中断响应这段时间10个时钟周期),中断服务程序有20条指令,其中第15条指令启动D工作。
问:若CPU需从D读取1000个字符,则完成这一任务所需的时间大约是多少个时钟周期? CPU用于完成这一任务的时间大约是多少个时钟周期?在中断响应阶段CPU进行了哪些操作?
第一问:
第二问:第二问其实是在问中断服务程序的时钟周期(这搁这考阅读能力呢?)
DMA控制器通常用来控制块设备,假设CPU想要读入磁盘的一整块的数据,CPU向DMA控制器指明执行输入操作,从I/O设备(磁盘)输入数据到主存当中,指明要传送多少个数据,指明数据在磁盘的什么地址,在内存的什么地址。假设此次传输的块中有5个字,DMA要进行计数此时已经传了几个字了,磁盘中的数据是一个字一个字丢给DMA控制器的,所以DMA控制器还需要有数据缓冲寄存器。
这一个字传送给主存之前:
这一个字传送给主存传送时:
这一个字传送给主存传送后:
将DMA控制器内部细化:DMA控制器 = DMAC
通过系统总线,DMAC和主存相连,DMAC和设备相连。块设备输入或输出的数据都会先被放到数据缓冲寄存器里面,
注:在DMA传送过程中,DMA控制器将接管CPU的地址总线、数据总线和控制总线,CPU的主存控制信号被禁
止使用。而当DMA传送结束后,将恢复CPU的一切权利并开始执行其操作。(DMA控制器通过系统总线向主存传送数据的过程,CPU不能使用系统总线,直到DMA控制器传送完成数据,CPU才能继续使用系统总线)
单总线结构:
DMA的传送过程:
到底要让谁使用主存,这个操作完全由CPU控制,因为CPU将总线给了DMAC就意味着CPU不能访问主存
我们现在换一种总线的连接方式(三总线结构),主存和DMA接口之间之间有一条直接数据通路DMA总线。主存和CPU是由主存总线连接,DMA接口使用DMA总线,可以一直持有DMA总线。
由于DMA方式传送数据不需要经过CPU,因此不必中断现行程序,I/O与主机并行工作,程序和传送并行工作。
DMA方式具有下列特点:
主存和DMA控制器之间有一条数据通路,因此主存和I/O设备之间交换信息时,不通过CPU。但当I/O设备和CPU
同时访问主存时,可能发生冲突,为了有效地使用主存,DMA控制器与CPU通常采用以下3种方法使用主存。
停止CPU访问主存
DMA和CPU交替访存
周期挪用(周期窃取)
当I/O设备有DMA请求时,会遇到3种情况:
此时CPU不访存,因此I/O的访存请求和CPU未发生冲突
CPU正在访存,此时必须等CPU存取周期结束后,CPU再将总线占有权让出
CPU和DMA同时请求访存,出现访存冲突,此时CPU要暂时放弃总线占有权, I/O访存优先级高于CPU访存,因为I/O不立即访存就可能丢失数据。此时由I/O设备挪用一个或几个存取周期,传送完一个数据后,立即释放总线,是一种单字传送方式
中断 | DMA | |
---|---|---|
数据传送 | 程序控制 程序的切换 -> 保存和恢复现场 | 硬件控制 CPU只需进行预处理和后处理 |
中断请求 | 传送数据 | 后处理 |
响应 | 指令执行周期结束后响应中断 | 每个机器周期结束均可,总线空闲即可响应DMA请求 |
场景 | CPU控制,低速设备 | DMA控制器控制,高速设备 |
优先级 | 优先级低于MDA | 优先级高于中断 |
异常处理 | 能处理异常事件 | 仅传送数据 |