**I/O接口:**又称I/O控制器、设备控制器,负责协调主机与外部设备之间的数据传输。其实就是一块芯片。
scanf("%d",&c)
这个输入语句具体是如何执行的呢?
首先CPU会通过控制总线发送一个读命令,告诉键盘我要读一个数据,然后通过地址总线指明要使用哪个I/O设备。键盘接受到数据后,会将数据放到数据寄存器中。但是CPU怎么知道键盘是否已经工作结束了呢,键盘输入结束后会将结束信号卸载状态寄存器中,表明自己已经输入完成了,然后CPU去查询这个状态寄存器,就能够知道结束了没,然后就去数据寄存器中取数据然后赋值给c这个变量。
CPU如何控制键盘I/O的完成?
数据流:键盘-> I/O接口的数据寄存器->数据总线->CPU某寄存器->主存(变量的地址)
但是如果数据量很大的时候,没输入一个数据都会产生一次中断,这样CPU的大量时间都用来处理中断了,造成CPU的利用下降。
DMA控制方式:主存与高速I/O设备之间有一条直接数据通路(DMA总线)。CPU向DMA接口发出"读/写”命令,并指明主存地址、磁盘地址、读写数据量等参数。
DMA控制器自动控制键盘与主存的数据读写,没完成一整块数据读写,才向CPU发出一次中断请求。
主存地址:读/写的数据存在内存中什么位置
磁盘地址:从磁盘的什么位置开始读/写
读写数据量:要读/写多少信息。
有的商用中、大型机可能会街上超多的I/O设备,如果都让CPU来管理,那么CPU就太累了。
所以为了出现了通道控制方式。
通道:是一种特殊的处理器,通道可以识别并执行一系列通道指令。
通道控制方式的执行:
DMA是每处理完一次数据块后就执行一次中断,而通道是全部数据处理完后才向CPU发出中断。
一般来说,I/O系统由I/O软件和I/O硬件两部分组成。
I/O硬件:包括外部设备、I/O接口、I/O总线等。
**数据缓冲寄存器:**用于缓冲数据,以匹配CPU与外部设备之间的速度差异。
**设备状态寄存器:**用于反馈设备状态,常见的状态信息入设备忙、设备就绪、设备错误等。供CPU查用。
**设备命令寄存器:**用于接收CPU发送的设备控制命令
统一编址:把I/O端口当作存储器的单元进行地址分配,用统一的访存指令就可以访问I/O端口,又称 存储器映射方式。
靠不同的地址码区分内存和I/O设备,I/O地址要求相对固定在地址的某部分。
优点:不需要专门的输入/输出指令,所有访存指令都可直接访问端口,程序设计灵活性高。端口有较大的编址空间。读写控制逻辑电路简单。
缺点:端口占用了主存地址空间,使主存地址空间变小,外设寻址时间长(地址位数多,地址译码速度慢)
独立编址:I/O端口地址与存储器地址无关,独立编址CPU需要设置专门的输入/输出指令,又称I/O映射方式。是靠不同的指令区分内存和I/O设备。
模拟:打印三个字符
先将要打印的数据存放到CPU的寄存器中,然后去查询打印设备的IO控制器中的状态寄存器,检查该设备此时是否准备就绪,如果不是则继续查询,否则就启动设备,然后将打印设备的地址通过地址线传送到地址译码器,然后将写命令通过控制线传送到I/O逻辑中,I/O逻辑会将该命令存到控制寄存器中。然后再将字符通过数据线传送到数据缓冲寄存器中,然后CPU的工作就完成了,但是他要一直查询状态寄存器的状态,查看设备是否已经打印完成,如果打印完成就继续下一个操作。I/O控制器将控制寄存器中的命令告诉打印设备,然后将数据缓冲寄存器中的数据送到该设备,设备完成之后就会将打印完成的状态告诉I/O逻辑。这样打印一个字符就算完成了。
慢速设备(比如鼠标):使用程序查询方式对CPU的工作影响不大
快速设备(比如硬盘):使用程序查询方式对CPU影响极大,CPU需要花费大量的时间去检查。
程序查询方式分为两种:
请解释一下中断(Interrupt)。
程序中断是指在计算机执行现行程序的过程中,出现某些继续处理的异常情况或特殊请求。CPU暂时中止现行程序,而转去对这些异常清理或特殊请进行处理,在处理完毕后CPU又自动返回到现行程序的断点处,继续执行原程序。
中断流程:
CPU执行完一条指令后,会去判断是否有中断信号,如果此时处于关中断,则不会去处理那些中断信号。那CPU是如何判断是否处于关中断呢?
关中断会被存放在CPU的状态寄存器中。
CPU检测到了中断,那又是如何判断是哪个设备发来的中断信号?
每个中断源向CPU发出中断请求的时间是随机的。
为了记录中断时间并区分不同的中断源,中断系统需对每个中断源设置 中断请求标记触发器。
当其状态为 1 时,标识中断源有请求。
这些触发器可以组成中断请求标记寄存器,该寄存器可集中在CPU中,也可分散在各个中断源中。
对于外中断,CPU实在统一的时刻即每条指令执行阶段结束时向接口发出中断查询信号。以获取I/O的中断请求,也就是说,CPU响应中断的时间实在每条指令执行阶段的结束时刻。
CPU响应中断必须满足以下3个条件:
如果有多个中断源发来的信号,那么应该先执行哪一个呢?
中断判优既可以用硬件实现,也可以用软件实现;
硬件实现是通过硬件排队器实现的,它既可以设置在CPU中,也可以分散在各个中断源中。
中断隐指令:保存原程序的PC值,并让PC指向终端服务程序的第一条指令
进入中断服务程序的方法是把该程序第一条指令的地址放入PC
回到主程序的方法是把K+1放入PC
如何判断一个中断信号所对应的中断服务程序在内存中的什么地方?
硬件向量法:由中断向量地址形成部件产生向量地址,向量地址中存储着中断处理程序的起始地址。
那为什么不直接指向中断处理程序的地址呢?
如果中断处理程序在内存中的地址发生变化的话,那么修改中断向量地址形成部件很麻烦,可以直接修改对应的中断向量就可以了,主要为了方便操作。
中断服务程序的主要任务:
单重中断:执行中断服务程序时不响应新的中断请求。
多重中断:执行中断服务程序时可响应新的中断请求。
为什么开中断要在保护现场之后呢?
如果在之前的话,那么原程序中寄存器的值就有可能丢失,就没办法回到原程序了,所以必须要保护完现场之后才能开中断。
CPU向DMA控制器指明要输入还是输出;要传送多少个数据;数据在主存、外设中的地址。
DMA控制器相当于是CPU的外包,CPU把任务告诉DMA控制器,然后把使用总线的权力分配给它,剩下就让它自己处理,等结束之后告诉CPU。
预处理:
数据传送:
后处理:
主存和DMA控制器之间有一条数据通路,因此主存和I/O设备之间交换信息时,不通过CPU。但当I/O设备和CPU同时访问主存时,可能发送冲突,为了有效地使用主存,有山中方法使用: