- 有了存储器就足够了吗?不,还差最后一步的包装
- 即外设
- 诸如显示屏、键盘、鼠标、音响等等,这些才是我们直接可以接触到的计算机
- 这些设备,如显示屏,是接收图像的数据并显示出来;而鼠标、键盘则属于输入设备,这些数据是某程序运行所需要用到的,比如我现在正在打字的火狐浏览器
- 也就是说,外设也需要也需要数据,这些数据也要被CPU来处理,而这些数据的传输也需要在控制之下
I/O技术
无I/O技术
- 最初电脑的输入用……纸带……恐怕那个时候只有研究人员用电脑?……
程序查询I/O
- I/O设备的工作全由CPU来控制
- CPU主动查询I/O设备的状态,若检测到数据就绪,则交换/处理一个数据字,否则继续查询
- I/O设备直接与CPU相连导致更换I/O设备困难
- 而CPU在控制I/O设备的时候,只是在控制而已,CPU本身应该是用来运算的,而在I/O的时候却闲置了;而且由于需要CPU主动的查询,所以就算I/O设备没有准备好,也同样会消耗CPU时间
程序中断方式
- 首先改进的就是,让准备好的I/O设备来通知CPU
- CPU这个时候一般是在干活的,所以就需要先放下手头的工作来处理I/O。
- 不过一次只能处理一个数据字。
- 中断是需要保护现场的,即CPU当前工作的所有状态,以便可以恢复继续工作
DMA直接内存读取
- 后来发现,I/O操作和CPU的关系,只不过是I/O需要读/写命令、写入的主存地址、传送的数据个数,而已
- 这么简单的活交给CPU简直浪费啊
- 引入DMA控制器:CPU处理I/O是往DMA控制器写入外设地址、主存地址和计数器,剩下的由DMA控制器来控制
Channel通道技术
- DMA还不够强大
- 通常一个DMA只能服务一个外设
- DMA控制器一次控制传输的数据有限,还需要多次CPU的介入
- 通道则更为强大
- 它是一个协处理器
- CPU通过I/O指令来控制通道工作
- 而通道可以执行专门的通道指令来控制I/O的工作
PPU外围处理机
- 通道还是受限于CPU的控制
- PPU则完全独立于CPU,全权负责I/O
I/O接口
- 众多外设各不相同,其数据交换也不同
- 但本质都是外设的数据,所以就可以用一层I/O接口来屏蔽掉双方的差异
- CPU只需要考虑I/O接口的构成
- 外设也是只需要考虑I/O接口
功能
- 地址识别和设备选择:既然也是数据,就要有自己的地址;既然又是设备,就要对应好外设
- 接收、保存CPU的I/O控制命令:放在接口的控制寄存器
- 反应外设的工作状态:如数据状态(是否就绪)、工作状态(忙、空闲)
- 信号转换:屏蔽掉外设的工作逻辑、时序等等
- 数据格式、码制的转换及数据检错、纠错
- 传送数据
- 中断
组成
- 数据缓冲寄存器:数据端口:交换的数据
- 端口地址译码器
- 接口控制逻辑
- 中断逻辑
- 状态寄存器 :状态端口:外设状态
- 命令寄存器:控制端口:工作内容、工作方式
编址
- I/O端口是按地址来访问的
- 独立编址
- 单独外设的地址
- 需要专门的I/O指令来区分开主存地址
- 统一编址
- 主存地址空间一部分划为I/O端口的地址范围
- 将I/O端口视为主存的一部分
中断
- CPU如何处理中断请求信号
响应
- 信号
- 控制总线
- 接受中断请求针脚 INTR
- 发出中断响应针脚 INTA
- 中断允许标志 EINT(=1允许中断)
- 开中断命令 STI(置EINT为1)
- 关中断命令 CLI(置EINT为0)
- 控制总线
- 响应条件
- CPU收到中断请求
- EINT=1
- 指令刚刚执行完
- CPU工作
- 进入中断周期,置中断状态触发器INT为1
- 发出中断响应信号
- 保存断点和状态(即PC和标志寄存器,其余寄存器由中断服务程序的保护现场来保存)
- 关中断
- 接受中断类型码,生成中断服务程序的入口地址
- 软件查询法 :
- 硬件向量法:中断源收到INTA后生成一个特定的向量地址(中断类型号),CPU根据它来生成入口地址
- 执行中断处理程序
中断过程
- 中断请求:中断源通过INTR针脚向CPU发出请求信号
- 中断判优:多个中断信号的优先级排序
- 中断响应:若EINT为1,CPU会在指令执行完后扫描INTR看看是否有中断请求,有则置INT为1,进行上述的CPU工作
- 中断处理:由预先编制的中断服务程序完成
- 保护现场
- 中断服务
- 恢复现场
- 开中断:EINT置1
- 中断返回:IRET,将PC和标志寄存器恢复(恢复断点)
中断屏蔽
- 中断也可以被中断
- 这样就相当于改变了中断的优先级
- 需要设置中断屏蔽字,来判断当前中断能否被下一个中断来中断
DMA
组成
- 主存地址寄存器AR
- 字计数器WC
- 设备地址寄存器DAR
- 中断逻辑
- 控制/状态逻辑
工作
- 预处理:CPU执行I/O指令,选择DMA控制器和I/O接口,外设地址、主存地址和个数写入DMA控制器,I/O接口启动外设
- 数据传输:DMA控制器控制下,完成主存与I/O接口之间的传输
- 后处理:当WC的个数传输完,DMA控制器向CPU发出中断请求
- 如果数据有错,重新发送
- 如果还有数据,再启动新一轮DMA
- 如果结束,CPU向DMA控制器发送结束信号EOP
数据传送
- I/O接口在数据就绪时向DMAC发出DMA请求信号DREQ
- DMAC向CPU发出占用总线信号HOLD
- CPU决定是否让出总线,如果让出则发送总线允许信号HLDA
- DMAC接收到HLDA获取总线控制权,向I/O接口输出DMA应答信号DACK
- DMAC向系统总线发出读写命令和访存地址,I/O接口开始与系统总线交换数据
- DMA数据传输结束,AR增1,WC减1 (即一次传送一个数据字)
- DMAC撤销HOLD信号,释放总线
CPU和DMA和BUS
- DMAC接收到HLDA后一直占用BUS直到传输完毕
- DMAC在CPU不使用BUS的时候使用一个周期的BUS来传输一个数据字
- CPU和DMA交替使用BUS:CPU工作周期比主存访问周期长得多的时候使用这种方式,分为子周期,分别让CPU和DMA使用总线,此时DMA无须请求总线
Channel
- CPU管理DMA都是一些简单的命令,可以交给一个协处理器来完成
- 通道就是一个简单的微处理器和DMA控制器的集成
改进CPU
- CPU的管态、目态和访管指令
- I/O指令只能在管态下,由OS执行
- 广义I/O指令在目态下执行
- 启动I/O指令
功能
- 接受CPU的I/O指令,选择外设与通道相连
- 执行CPU编制的通道程序
- 给出外设地址
- 给出主存地址
- 控制交换个数
- 检查外设状态
- 格式转换
- 结束操作
工作
- 用户程序执行广义I/O指令,进入管态
- CPU响应中断,执行I/O管理程序,其根据广义I/O指令的参数,针对特定通道使用通道命令编写通道程序,该程序最后一条为“无链通道指令”——停止通道工作,并向CPU发中断。
- 通道程序写到主存中,将入口地址写入主存中预先划分的“通道地址字”单元,执行启动I/O指令。再由通道来执行通道程序
- 通道程序执行完,向CPU发送中断信号,CPU响应并进入管态,执行管理程序来完成结束操作