📕:参考王道
目录
一、程序查询方式
CPU不断轮询检查I/O控制器中“状态寄存器”,检测到状态为“已完成”之后,再从数据寄存器取出输入数据。
过程:
1.CPU执行初始化程序,并预置传送参数;设置计数器、设置数据首地址。
2. 向I/O接口发送命令字,启动I/O设备
3.CPU从接口读取设备状态信息
4.CPU不断查询I/O设备状态,直到外设准备就绪
5.传送一次数据,一般为一个字
6.修改传送参数,修改地址和计数器参数
⭐CPU一旦启动I/O必须停止现行程序的运行,并在现行程序中插入一段程序。
主要特点:CPU有“踏步”等待的现象,CPU与I/O串行工作。
二、程序中断方式
1.中断的概念
程序中断是指在计算机执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂时中止现行程序,而转去对这些异常情况或特殊请求进行处理,在处理完毕后CPU又自动返回到现行程序的断点处,继续执行原程序。
2.中断的工作流程
中断请求→中断响应→中断处理
(1)中断请求
中断源向CPU发送中断请求信号。
(2)中断响应
响应中断的条件。
中断判优:多个中断源同时提出中断请求的话需要进行中断判优。
(3)中断处理
中断隐指令。
中断服务程序。
3.中断请求标志
为了记录中断事件并区分不同的中断源,中断系统需要对每个中断源设置中断请求标记触发器INTR。
CPU响应中断的时间,是在每条指令执行阶段的结束时刻。
4.中断判优优先级设置
5.中断处理过程
5.1 隐指令
中断隐指令,不是一条具体的指令,而是CPU检测到中断请求时自动完成的一系列动作。
主要任务:
(1)关中断
(2)保存断点
(3)引出中断服务程序
5.2 向量地址
确定中断服务程序它的入口地址的方法有两个:硬件向量法、软件查询法
(1)硬件向量法
第一步:得到中断类型号
首先,根据某个中断请求信号通过硬件,得到对应的中断向量的保存地址。
(中断向量,把指向中断服务程序起始地址的地址信息称为中断向量)
第二步:得到中断服务程序的入口地址
向量地址对应的主存里保存了JMP无条件转移指令,这个无条件转移指令指明了当前中断请求对应的中断服务程序的入口地址 。
5.3 中断服务程序
(1)保护现场
(2)中断服务
(3)恢复现场
(4)中断返回
6.多重中断
6.1 中断屏蔽字
“1” 表示屏蔽该中断的源的请求,即继续执行当前正在执行的中断。
“0” 表示正常申请,停止当前程序去执行新的中断程序。
三、DMA方式
1.DMA简介
DMA方式是一种完全由硬件进行成组信息传送的控制方式。
在数据准备阶段,CPU与外设并行工作。
DMA方式在外设与内存之间开辟一条“直接数据通道”,信息传送不再经过CPU,降低了CPU在传送数据时的开销,因此称为直接存储器存取方式。
优点:
(1)DMA方式传送数据不需要经过CPU,所以不必中断现行程序
(2)I/O与主机并行工作,程序和传送并行工作
2.DMA控制器
当I/O设备需要进行数据传送时,通过DMA控制器向CPU提出DMA传送请求,
CPU相应之后将让出系统总线,由DMA控制器接管总线进行数据传送。
2.1 DMA控制器功能
1.接收外设发出的DMA请求,并向CPU发出总线请求。
2.CPU响应并发出总线响应请求,DMA接管总线控制权,进入DMA操作周期。
3.确定传送数据的主存单元地址及长度,并自动修改主存地址计数和传送长度计数。
4.规定数据在主存和外设间的传送方向,发出读写等控制信号,执行数据传送操作
5.向CPU报告DMA操作结束。
2.2 DMA控制器组成
1.主存地址计数器
2.传送长度计数器
记录传送数据的长度,技术溢出时,数据即传送完毕,自动发中断请求信号。
3.数据缓冲寄存器
4.DMA请求触发器
每当I/O设备准备好数据后,给出一个控制信号,使DMA请求触发器置位。
3.DMA传送方式
主存和I/O设备之间交换信息时,不通过CPU。
但当I/O设备和CPU同时访问主存时,可能发生冲突。
1.停止CPU访存
2.周期挪用
(1)CPU不访存,未发生冲突
(2)CPU在访存,等存取周期结束后,CPU让出总线占有权
(3)CPU和I/O设备同时请求访存,I/O访存优先级高于CPU
3.DMA与CPU交替访存
4.DMA传送过程
第一步:预处理
⭐注意:I/O设备先准备好发送的数据(或接受的数据),然后I/O设备向DMA控制器发送DMA请求,然后再由DMA控制器向CPU发送总线请求
I/O设备准备好数据后,发送DMA请求。
第二步:数据传送
⭐注意:数据传送阶段完全由DMA硬件控制
第三步:后处理
数据传送完毕后,DMA控制器向CPU发送中断请求,CPU执行中断服务程序做DMA结束处理。
⏰易错点:I/O设备准备后数据后发送DMA请求,数据传送完成后DMA控制器向CPU发送中断请求。
4.DMA和中断方式的区别
⭐对中断请求的响应只能发生在每条指令执行结束时,而对DMA请求的响应可以发生在任意一个机器周期结束时。