一、前言本章节为计算机组成原理第四篇输入输出系统I/O 系统。在计算机系统中CPU 与内存之间的数据交换速度极快而外部设备键盘、鼠标、显示器、磁盘、网卡等的工作速度往往比 CPU 慢几个数量级且种类繁多、控制方式各异。围绕“数据如何从外设进入主机、又如何从主机送往外部设备”这一核心问题本章将依次介绍以下内容IO 接口说明接口的功能、基本结构与端口编址方式理解接口在主机与外设之间起到的桥梁作用。程序查询方式介绍 CPU 通过不断查询设备状态来完成数据传送的控制方式分析其原理与效率瓶颈。程序中断方式说明中断请求、中断响应与中断处理的基本流程理解中断方式如何提高 CPU 的利用率。DMA 方式介绍直接存储器访问的工作原理与传送过程理解其在大批量高速数据传输中的优势。二、I/O接口CPU 和外设之间速度、电平、数据格式差异巨大不能直接连在系统总线上I/O 接口适配器就是主机和外设之间的桥梁电路用来解决两边不匹配的问题I/O接口的功能和组成基本构成CPU与输入设备的信息交互过程CPU—IOCPU寻找目标设备A选择设备IO接口的设备选择电路判断是否是设备A你CPU正在写作业突然想起来还没吃早饭于是在手机上打开某APP精准选中了“好评第一”的跑腿小哥A寻找目标设备ACPU—IO发送启动外设的控制命令启动设备ACPU发完命令后转去执行其他任务不再等待若设备已就绪发送控制命令你给外卖小哥发了一条语音“去xxx老字号给我带一份双蛋肠粉”启动命令发完之后你把手机锁屏扔在一边继续写作业CPU不等待去执行其他任务IO—外设命令寄存器和命令译码器翻译外设CPU needs your data, please input.暂存命令并转换为外设的控制信号外卖小哥A的手机响了某APP平台把你的语音转成了文字并且用小哥看得懂的导航路线展示出来外卖小哥客户需要一份双蛋肠粉请到某某店取货。命令寄存器把指令翻译成了外设看得懂的控制信号外设—IOok, I will input my data...输入数据 finish! 完成输入数据送入接口缓存寄存器外卖小哥到了店里跟老板说“单号001一份双蛋肠粉” 老板打包好后递给小哥小哥接过肠粉把它放在电动车后面的保温箱里设备输入数据完毕把数据放入了接口缓冲寄存器IO—CPU数据输入完毕发起中断请求小哥确认后立刻通过APP平台发出强提醒“外卖正在送出”IO接口向CPU发起中断请求INTR 1CPU—IO收到中断请求满足条件后给出中断响应信号取走数据你正在写作业突然手机一震、门铃响了。你可怜放下笔响应了这次呼叫满足条件给出中断响应信号打开门把外卖接了过来CPU读取数据完成IO操作I / O接口结构框图三、程序查询方式程序查询方式Programmed I/O是最简单的一种 I/O 控制方式数据的传送完全由 CPU 执行程序来控制CPU 通过不断读取设备状态寄存器来判断设备是否就绪就绪后再完成一次数据传送。有“强迫症”的你CPU一直在写作业但每隔几秒钟就抬头看一眼门口看看外卖小哥到了没基本工作流程CPU→IOCPU 通过地址总线选中目标设备B发出设备地址选择设备。你CPU正在写作业突然饿了。你从手机上指定“速度排名榜上第一”的外卖小哥设备B选中了他的电话发出设备地址*这里的手机 状态寄存器 数据总线是CPU和I/O设备沟通的渠道CPU→IO向接口的命令寄存器发送启动命令启动外设工作。你给外卖小哥打电话“我要一份猪脚饭再带份辣椒酱”CPU→IO循环查询CPU 反复读取接口的状态寄存器检查设备B是否就绪。若未就绪则继续循环查询此期间 CPU 一直处于忙等状态。打完电话就根本没办法专心写作业了你每隔十几秒就忍不住拿手机看下外卖小哥的行程手机显示“正在取餐......”状态未就绪继续死等一直循环看手机显示“正在配送......”状态还是没就绪继续死等CPU一直忙碌手机显示“距离还有200米.....”还在循环看你明明在等外卖但什么都干不了只能干盯着看IO→CPU设备B就绪后状态寄存器置位CPU 退出查询循环。手机显示“外卖已送达”设备就绪你心里一喜方下手机不再反复看行程了立刻站了起来CPU退出查询循环数据传送CPU 从接口的数据缓冲寄存器读取数据输入或把数据写入数据缓冲寄存器输出。你打开门外卖小哥把外卖数据递给你从接口的缓冲区读取数据结束本次传送完成后CPU 继续执行后续程序若还有数据则重复上述过程。你关上门提着外卖回到书桌前终于能安心地继续写作业了CPU继续执行后续程序CPU 的时间被大量浪费在等待上。当外设速度远低于 CPU 时这种浪费尤为明显因此引出了后续的程序中断方式与DMA 方式。四、程序中断方式中断CPU暂时终止现行程序的执行转而去执行处理更加紧迫的事件服务程序处理完后又自动返回原程序继续执行的过程。把CPU想象成正在自己卧室写作业的你1.基本过程中断请求由 I/O 接口中的中断请求触发器产生。当设备完成一次数据输入数据已送入接口的数据缓冲寄存器或输出缓冲寄存器已空时接口将中断请求标志位置 1并通过中断请求线向 CPU 发出请求信号。为了便于 CPU 识别请求来源每个中断源都需要有唯一的中断类型号中断向量号。外卖小哥按门铃你在房间写作业执行程序。这时候你的外卖到了外卖小哥I/O设备按了你家门铃发送中断请求。门铃灯响了INTR 1中断判优实际系统中往往有多个中断源同时提出请求而 CPU 在某一时刻只能响应其中一个因此需要中断判优中断优先级排队。常见的判优方式有硬件判优——链式排队器分散在各个中断源的接口电路中硬件判优——并行优先级编码器集中在CPU内一般来说高速设备、实时性要求高的设备优先级较高而低速设备优先级较低。此外故障类中断如电源掉电通常具有最高优先级。假设你家同时有快递小哥、外卖小哥和修水管师傅三个人一起按门铃多个中断源同时请求。你开门只能一个个接待排队规则修水管故障中断最急不管它就一直停水外卖高速设备第二怕饭凉了快递低速设备最后中断响应CPU执行程序时在每条指令结束之前都要检测中断请求信号。if有请求信号CPU在当前指令结束后暂停现行程序执行响应I/O的中断请求把这道题写完指令执行结束再看一眼门铃中断隐指令CPU响应中断后转去执行中断服务程序。完成操作保存程序断电、硬件关中断、将中断服务程序入口地址送PC起身去拿外卖前必做几件本能的事保存程序断点记一下刚刚写到第几页第几行了硬件关中断拿外卖前先把卧室门关上防止空调冷气出去中断服务CPU进入与I/O设备交换数据的阶段。打开门确认外卖拿过外卖跟外卖小哥说声谢谢CPU与I/O设备交换数据中断返回CPU完成与I/O设备的数据交换返回到原来执行的程序我又回到书桌前看一眼页码继续接着刚才的地方写作业。2. 中断服务程序入口地址中断向量所有中断服务程序在主存中的入口地址总称中断向量表存放中断向量表所有的中断服务程序入口地址组织成一个一维的表格存放在一段连续的存储区中。中断向量地址读取中断向量所需的地址CPU 并不是在任何时刻都能响应中断必须同时满足以下条件处理器允许中断EINT 1外设有中断请求且没有被屏蔽D 1且MASK 0在每条指令执行周期结束时CPU发中断查询信号INTR 1整个流程可以用下面的流程图表示中断方式虽然显著提高了 CPU 的利用率但每次数据传送都要经历中断响应、保护现场、恢复现场等开销对于大批量高速数据传输如磁盘读写仍然不够高效这引出了后续的DMA 方式。五、DMA方式DMA直接内存存取 解决CPU当苦力的问题让外设与主存之间直接成块搬运数据、不经过 CPU 逐字干预的传送方式DMA与主存交换数据的三种方式停止CPU访问主存解释DMA的大货车一来直接把路封死禁止CPU通行。大货车搬完箱子再把路让给你效果DMA效率最高但CPU会被彻底堵死效率极低。周期挪用方式周期窃取解释大货车在你不注意的时候见缝插针效果CPU几乎感觉不到停顿但大货车效率低了点只能插空这是最常用的方式DMA与CPU交替访存方式透明DMA解释路被划分成了“单行道”左边归CPU走、右边归大货车DMA走互不干扰同时通行效果两个的效率都很高但是对路要求太高需要更宽的总线硬件成本最贵DMA接口功能和组成DMA工作过程1. 预处理CPU交代任务你CPU把大货车司机DMA控制器叫来给了他一张详细清单把起点和终点地址写在纸上写入地址寄存器 AR。写上要搬的总箱数10000箱写入字计数器 WC。告诉他搬运模式写入控制字 DAR。交代完这些你就可以彻底锁屏去写作业了CPU交出总线控制权。2. 数据传送大货车自动搬司机按喇叭DREQ 1司机准备搬一箱货先按一声喇叭向系统申请占用大马路总线。调度室放行DACK 1马路调度室确认没车了挥手说“OK路归你了”批准DMA占用总线。司机搬货司机立刻搬起一箱货通过 BR 数据缓冲寄存器从起点搬到终点DMA控制器直接操控主存与外设传送数据。自动记账AR1, WC-1每搬完一箱司机会在清单上把地址划掉AR1再把箱数减一WC-1。如此循环直到10000箱全部搬完。3. 后处理司机交差交清单溢出信号搬完最后一箱清单上的数量正好减到 0。司机立刻按响最后一次门铃向中断机构发出中断请求。你CPU出来验收你听到门铃放下笔出来检查一下大仓库确认10000箱货都完好无损地躺在里面然后给司机结清运费。六、小结本章围绕“数据如何在外设与主机之间流动”这一主线依次介绍了 I/O 接口、程序查询方式、程序中断方式和 DMA 方式四种由浅入深的 I/O 控制方案核心思路可以概括为让 CPU 从“亲自搬数据”逐步解放出来。1. 四种方式回顾I/O 接口主机与外设之间的桥梁电路负责速度匹配、电平转换、数据格式转换、地址译码与状态/命令的暂存是后面所有控制方式共同的硬件基础。程序查询方式CPU 通过不断读取状态寄存器判断设备是否就绪就绪后再传送数据。原理最简单、硬件最省但 CPU 全程忙等时间被大量浪费在等待上。程序中断方式外设就绪后主动向 CPU 发中断请求CPU 在当前指令执行结束后响应经中断隐指令保存断点、硬件关中断、送中断服务程序入口地址到 PC转入中断服务程序完成数据交换再恢复现场返回原程序。CPU 不必死等利用率明显提高但每次传送都要付出中断响应、保护现场、恢复现场的开销。DMA 方式由 DMA 控制器接管总线在主存与外设之间直接成块搬运数据CPU 只在传送开始前做预处理设置地址寄存器 AR、字计数器 WC、控制字 DAR和传送结束后做后处理响应结束中断、校验数据整块传送过程几乎不占用 CPU。2. 四种方式对比对比项程序查询方式程序中断方式DMA 方式数据传送控制者CPU 执行程序CPU 执行中断服务程序DMA 控制器硬件CPU 参与程度全程参与忙等每次传送都要打断 CPU仅预处理与后处理参与传送单位字字节字字节数据块CPU 利用率最低较高最高硬件开销最小中等最大适用场景外设少、速度慢、实时性要求低中低速设备、需要及时响应的场合磁盘、网卡等大批量高速数据传输3. 一句话记忆查询是“我盯着你”中断是“你叫我”DMA 是“你俩自己搬搬完告诉我一声”。理解这四种方式的演进逻辑也就理解了 I/O 系统设计的核心矛盾CPU 与外设之间的速度鸿沟。实际系统中这几种方式往往并存使用——键盘、鼠标等低速设备多用中断方式磁盘、网卡等高速设备则交给 DMA从而在成本与效率之间取得平衡。