计算机408组成原理:DMA方式与I/O信息传送全解析
1. 为什么DMA是408大题里最容易丢分的“送分题”如果你正在啃计算机组成原理尤其是唐朔飞或者白中英那套教材里“I/O设备与主机信息传送控制方式”这一章大概率会在DMA这里卡一下。不是因为它难而是因为它的细节太密周期挪用、周期窃取、中断请求、DMA请求、三种传送方式、四种传送模式还有和中断方式的本质区别。408考卷上这部分内容既可以出选择题也可以出大题比如24年45题就考了DMA和中断的配合逻辑。很多人复习时觉得“DMA不就是让外设直接访问内存吗”结果一到做题就分不清谁先谁后、谁响应谁。我当年第一次学DMA的时候脑子里全是问号为什么DMA传送前还要CPU预处理为什么DMA控制器也要发中断周期挪用和停止CPU访存到底差在哪后来自己画了几遍数据通路、把一次完整的DMA传送过程拆成时间轴才真正搞明白。这篇文章我就按一个408考生的视角把DMA方式从“为什么需要”到“怎么考”全部拆开讲一遍。不管你是刚开始学组成原理还是已经刷完一轮题想回头补漏这篇内容都能直接拿来当复习提纲用。核心关键词我先摆出来计算机408、计算机组成原理、DMA、I/O设备、信息传送。这几个词贯穿全文你读的时候可以对照自己的笔记看看哪些地方之前理解偏了。2. DMA方式到底解决了什么问题2.1 从程序查询到中断方式的进化逻辑要理解DMA得先知道它前面两种方式为什么不够用。程序查询方式最简单CPU不断读设备状态寄存器设备准备好了就传一个数据。这种方式的问题太明显了CPU完全被I/O绑死传一个字节就要循环等半天效率低到令人发指。后来有了中断方式设备准备好之后主动给CPU发中断请求CPU暂停当前程序跳去执行中断服务程序传数据。这比查询强多了至少CPU不用一直盯着设备。但中断方式有个硬伤每传一个数据都要打断CPU一次。你想想如果磁盘要传4KB数据按中断方式就是4K次中断每次中断都要保存现场、跳转、执行服务程序、恢复现场。CPU大部分时间都花在“保护现场”和“恢复现场”上了真正传数据的开销反而很小。这就好比你要搬100箱货每搬一箱就有人拍你肩膀让你停下来签个字搬完再拍一次你光签字就累死了。DMA的思路很直接让一个专门的控制器来搬数据CPU只负责开头和结尾。DMA控制器直接连接内存和I/O设备数据传送不经过CPU寄存器也不需要CPU执行指令。CPU只需要在传送前告诉DMA“从哪搬到哪、搬多少”传送结束后DMA再给CPU一个中断说“我搬完了”。中间那几千次数据搬运CPU完全不参与。2.2 DMA与中断方式的本质区别这里必须把DMA和中断的区别说透因为408特别喜欢考这个对比。我整理了一个表你直接记对比维度中断方式DMA方式数据传送方向通过CPU寄存器中转直接在内存和I/O之间传送CPU参与程度每个数据都要CPU执行指令仅预处理和后处理请求响应时机一条指令执行结束后响应每个机器周期结束后可响应优先级低于DMA高于中断中断作用传送数据传送完成通知适用场景低速设备、随机数据高速设备、大批量数据最关键的一点DMA请求的优先级高于中断请求。为什么因为DMA传送的是高速设备的数据如果被中断打断数据可能丢失。而中断处理的是低速事件晚一点响应问题不大。这个优先级关系在408选择题里反复出现你一定要记牢。还有一个容易混的点DMA控制器在传送结束后也会向CPU发中断请求。但这个中断和中断方式里的中断完全不是一回事。中断方式里的中断是“我要传数据了你来处理”DMA里的中断是“我已经传完了你来做收尾”。一个是请求服务一个是汇报完成。3. DMA控制器的内部结构与工作寄存器3.1 DMA控制器的核心组成DMA控制器不是一块简单的逻辑电路它内部有一组寄存器和控制逻辑。408考试里经常考“DMA控制器中有哪些寄存器”或者“哪个寄存器负责什么功能”。我按唐朔飞教材的体系给你拆开内存地址寄存器AR存放当前要访问的内存地址。每传送一个数据这个寄存器自动加一或减一指向下一个内存单元。字计数器WC记录还要传送多少个数据。每传一个数据减一减到零表示传送完成触发中断。数据缓冲寄存器DR暂存从设备读入或要写到设备的数据。有些教材叫数据寄存器。设备地址寄存器DAR存放I/O设备的地址用来选中具体设备。控制与状态寄存器存放控制命令和状态信息比如传送方向、是否允许中断、是否出错等。这些寄存器里AR和WC是必须掌握的因为大题里经常让你计算传送过程中AR和WC的变化。比如“传送1000个字节起始地址2000H问传送结束后AR和WC的值是多少”。答案AR 2000H 1000 23E8HWC 0。注意AR是加还是减取决于传送方向但408默认按加处理。3.2 DMA控制器的两种工作状态DMA控制器在系统中有两种身份这一点很多人没注意第一种是作为总线从设备。CPU在预处理阶段要读写DMA控制器的寄存器这时候DMA控制器就像普通I/O接口一样接受CPU的读写命令。CPU把起始地址写入AR把传送长度写入WC把控制字写入控制寄存器。第二种是作为总线主设备。当DMA开始传送数据时它要主动占用总线向内存发地址、发读写命令。这时候DMA控制器是总线的主控者CPU反而变成了旁观者。这个“双重身份”是理解DMA工作过程的关键。很多408大题就是围绕“什么时候DMA是从设备、什么时候是主设备”来出题的。4. DMA的三种传送方式与四种传送模式4.1 停止CPU访存方式这是最简单的一种。DMA要传送数据时直接向CPU发一个信号要求CPU放弃总线控制权。CPU收到信号后在当前机器周期结束后交出总线DMA独占总线进行数据传送。传送完一组数据后DMA再把总线还给CPU。这种方式的好处是控制简单DMA可以连续传送速度最快。坏处是CPU在DMA传送期间完全不能访存如果DMA传送时间很长CPU就被晾在那了。实际系统中很少用这种方式因为CPU的利用率太低。4.2 周期挪用方式也叫周期窃取。DMA控制器在需要传送数据时向CPU申请占用一个机器周期。CPU在当前机器周期结束后响应DMA借用这个周期完成一次数据传送然后马上把总线还给CPU。下一个周期CPU继续执行程序DMA如果需要再传再申请。这种方式的好处是CPU和DMA交替使用总线CPU不会长时间停工。坏处是DMA传送一个数据就要申请一次如果设备速度很快DMA频繁申请CPU的指令执行会被频繁打断效率也会下降。这里有个细节DMA申请周期时CPU可能正在使用总线。这时候DMA要等CPU当前机器周期结束。如果CPU正在执行一条需要多个机器周期的指令DMA只能等这个机器周期结束不能打断指令的执行。这就是为什么DMA请求的响应时机是“机器周期结束后”而不是“指令执行结束后”。4.3 交替访问方式这种方式把CPU的工作周期分成两部分一部分给CPU访存一部分给DMA访存两者交替进行不需要申请和归还总线。这种方式对CPU和DMA的时间要求比较严格实际中用的不多但408选择题里出现过。4.4 四种传送模式除了上面三种总线占用方式DMA还有四种数据传送模式单字节传送每传一个字节WC减一AR加一然后释放总线。下次传送再重新申请。块传送一次申请总线连续传送一整块数据直到WC减到零才释放总线。请求传送DMA申请总线后连续传送直到设备没有数据可传或者WC减到零才释放。级联传送多个DMA控制器级联用来扩展通道数量。408考试里最常考的是单字节传送和块传送的区别。单字节传送每次都要申请总线块传送只申请一次。块传送效率高但占用总线时间长。5. 一次完整DMA传送的全过程拆解5.1 预处理阶段CPU都做了什么DMA传送不是一上来就搬数据CPU必须先做预处理。这一步在408大题里经常被忽略但恰恰是得分点。CPU要做的预处理包括测试设备状态检查I/O设备是否就绪有没有故障。设置DMA寄存器把内存起始地址写入AR把传送字数写入WC把设备地址写入DAR把传送方向和控制信息写入控制寄存器。启动DMA向DMA控制器发启动命令DMA开始工作。继续执行主程序CPU做完这些就回去干自己的事了不需要等待。这里有个关键点CPU预处理完成后DMA传送期间CPU不参与。CPU继续执行主程序直到DMA发来中断请求。5.2 数据传送阶段DMA如何接管总线DMA控制器启动后开始向CPU申请总线。以周期挪用方式为例DMA向CPU发总线请求信号HRQ。CPU在当前机器周期结束后发总线响应信号HLDA交出总线控制权。DMA获得总线后向内存发地址AR中的值发读写命令在内存和I/O设备之间传送一个数据。传送完成后AR加一或减一WC减一。DMA释放总线CPU继续执行。如果WC不为零DMA再次申请总线重复上述过程。这个过程会一直重复直到WC减到零。注意DMA传送数据不经过CPU寄存器数据直接在内存和I/O设备之间流动。这是DMA和中断方式最本质的区别。5.3 后处理阶段中断请求与CPU收尾当WC减到零时DMA控制器向CPU发中断请求。CPU响应中断后执行中断服务程序做以下事情检查DMA状态确认传送是否正常完成有没有出错。处理数据如果传送的是输入数据CPU可能要校验数据如果是输出数据CPU可能要释放缓冲区。恢复现场准备下一次DMA传送或继续其他任务。这个中断和普通中断的处理流程一样但它的作用不是传送数据而是通知CPU“DMA传送结束了”。5.4 完整时间轴示例假设用周期挪用方式传送100个字节每个字节传送需要一个机器周期。时间轴大致如下时间点CPU动作DMA动作T0执行预处理设置AR、WC等待启动T1执行主程序申请总线T2当前机器周期结束响应请求获得总线传送第1个字节T3继续执行主程序释放总线T4执行主程序申请总线.........Tn执行主程序传送第100个字节WC0Tn1响应中断执行后处理发中断请求这个时间轴能帮你理解为什么DMA效率高CPU只在T0和Tn1参与中间Tn个周期都在干自己的活。6. 408真题里DMA的常见考法与解题套路6.1 选择题高频考点408选择题里DMA的考点非常集中我刷了近几年真题总结出以下几个必考方向考点一DMA与中断的优先级。题目通常问“DMA请求和中断请求同时发生时CPU先响应哪个”。答案永远是DMA因为DMA传送的是高速数据不能等。考点二DMA控制器的寄存器功能。题目会问“哪个寄存器存放传送字数”或者“AR的作用是什么”。你只要记住AR管地址、WC管计数、DR管数据、DAR管设备。考点三DMA传送的响应时机。题目问“DMA请求在什么时候被响应”。答案每个机器周期结束后。注意不是指令执行结束后这是和中断响应的关键区别。考点四DMA方式的数据传送路径。题目问“DMA传送时数据经过哪些部件”。答案内存和I/O设备之间直接传送不经过CPU。考点五三种传送方式的比较。题目会问“哪种方式CPU利用率最高”或者“哪种方式控制最简单”。停止CPU访存最简单但CPU利用率最低周期挪用CPU利用率较高但控制复杂。6.2 大题解题模板DMA大题通常分几问我总结了一个答题模板第一问CPU预处理要做什么答测试设备状态设置AR、WC、DAR和控制寄存器启动DMA。第二问DMA传送过程中CPU是否参与答不参与。CPU继续执行主程序DMA直接控制内存和I/O之间的数据传送。第三问传送结束后DMA如何通知CPU答WC减到零时DMA向CPU发中断请求CPU执行中断服务程序做后处理。第四问计算AR和WC的变化。答AR每传一个数据加一WC每传一个数据减一。传送N个数据后AR 初始地址 NWC 0。这个模板能覆盖大部分DMA大题。你答题时按这个逻辑写基本不会丢分。6.3 24年45题复盘24年45题考的是DMA和中断的配合。题目大意是一个系统用DMA方式从磁盘读数据到内存传送完成后DMA发中断CPU响应中断后做后处理。问的是DMA传送期间CPU能否响应其他中断以及DMA中断和普通中断的优先级关系。这道题的坑在于DMA传送期间CPU可以响应其他中断。因为DMA占用的是总线不是CPU。CPU在执行主程序如果有更高级的中断请求CPU可以响应。但DMA中断的优先级高于普通中断因为DMA传送完成需要及时处理否则可能影响下一次DMA传送。很多考生误以为DMA传送期间CPU完全不能响应中断这是错的。DMA只占用总线不占用CPU。CPU的中断响应逻辑和DMA的总线请求是两套独立的机制。7. 实操中容易踩的坑与排查技巧7.1 常见理解误区误区一DMA传送不需要CPU参与。错。CPU要做预处理和后处理只是传送过程中不参与。没有CPU的预处理DMA根本不知道从哪搬到哪。误区二DMA请求和中断请求是一回事。错。DMA请求是总线请求中断请求是CPU请求。DMA请求的优先级高于中断请求。误区三DMA传送的数据要经过CPU寄存器。错。数据直接在内存和I/O之间传送不经过CPU。这是DMA效率高的根本原因。误区四DMA传送结束后不需要中断。错。DMA传送结束后必须发中断通知CPU做后处理否则CPU不知道传送完成了。误区五周期挪用方式下DMA可以打断CPU的指令执行。错。DMA只能在机器周期结束后获得总线不能打断当前机器周期的执行。7.2 计算题易错点DMA计算题最容易错的地方是AR和WC的初始值和变化方向。我总结了几条规则AR的初始值是内存起始地址每传一个数据加一或减一取决于传送方向。WC的初始值是传送数据的总数每传一个数据减一。传送结束后AR 初始地址 传送数据数按加一计算WC 0。如果题目问“传送结束后AR的值”直接算初始地址加数据数。如果题目问“传送过程中AR的变化”注意是每个数据传送后变化不是每个机器周期变化。还有一个坑WC减到零时触发中断但最后一个数据已经传送完成。所以中断是在最后一个数据传送后发出的不是传送前。7.3 与中断方式对比的速查表问题中断方式DMA方式谁发起传送设备发中断请求CPU预处理后DMA发起数据经过CPU吗经过不经过CPU参与程度每个数据都参与仅预处理和后处理响应时机指令执行结束后机器周期结束后优先级低高中断作用请求传送数据通知传送完成适用设备低速高速这张表你考前背下来选择题基本秒杀。8. 从408到实际系统DMA在嵌入式里的影子虽然408考的是原理但DMA在实际系统里无处不在。你如果学过STM32或者Linux驱动肯定见过DMA的身影。STM32的串口DMA接收、ADC多通道DMA采集、SPI DMA传输本质上都是408里讲的DMA方式。Linux内核里的DMA引擎框架也是同样的原理。我拿STM32的串口DMA接收举个例子。你配置好串口和DMA后CPU只需要初始化DMA通道设置源地址串口数据寄存器、目的地址内存缓冲区、传送长度。然后CPU就可以去干别的事了。每来一个字节DMA自动把数据从串口搬到内存不需要CPU干预。接收完指定长度后DMA触发中断CPU再来处理数据。这和408里讲的DMA流程一模一样预处理、传送、后处理。如果你正在学408同时又玩嵌入式可以把这两者对照起来理解。408讲的是原理STM32讲的是实现。原理搞懂了看STM32的DMA配置寄存器就会觉得理所当然。9. 复习DMA的实操建议9.1 画图法把数据通路画出来我复习DMA时最有效的方法是画图。拿一张白纸画出CPU、内存、DMA控制器、I/O设备四个部件然后画出数据通路。重点画三条线CPU到DMA控制器的控制线预处理和后处理DMA控制器到内存的地址线和数据线传送阶段DMA控制器到I/O设备的数据线传送阶段画完之后用不同颜色的笔标出预处理阶段、传送阶段、后处理阶段分别用到哪些线。这样一遍画下来DMA的工作过程就刻在脑子里了。9.2 时间轴法把一次传送拆成时间点找一道DMA大题把题目里的传送过程按时间点拆开。每个时间点标注CPU在做什么、DMA在做什么、总线被谁占用。拆完一遍你对“周期挪用”和“停止CPU访存”的区别就彻底清楚了。9.3 对比法把DMA和中断放在一起背不要单独背DMA要把DMA和中断放在一起对比。我前面给的那张对比表你考前默写三遍。默写的时候注意数据传送方向、CPU参与程度、响应时机、优先级、中断作用这五个维度一个都不能少。9.4 真题法把近十年DMA真题刷三遍408真题里DMA的考法很固定刷三遍就能摸清套路。第一遍按知识点分类做第二遍按年份做第三遍只做错题。每道题做完后把涉及的知识点在教材上找到对应位置标记出来。这样你就能知道408到底考哪些点哪些点从来没考过。10. 我个人踩过的坑和最后的小技巧我第一年考408的时候DMA部分丢了不少分。后来复盘发现问题出在“想当然”上。我以为DMA传送就是“设备直接访问内存”忽略了CPU预处理和后处理的存在。结果大题里问“CPU在DMA传送中做了什么”我只写了“不参与”漏掉了预处理和后处理直接丢了一半分。第二年我调整了方法把DMA的每个阶段都拆开用时间轴的方式理解。我发现最有效的记忆方法是把DMA想象成一个搬家公司。CPU是房东内存是旧房子I/O设备是新房子。房东只需要告诉搬家公司“从旧房子搬哪些东西到新房子”预处理然后就可以去上班了。搬家公司自己搬传送阶段搬完后给房东打电话说“搬完了”中断请求房东回来检查后处理。这个类比帮我记住了DMA的完整流程。最后分享一个小技巧记DMA寄存器的时候用“地址、计数、数据、设备”四个词串起来。AR管地址WC管计数DR管数据DAR管设备。四个词首字母连起来是“地计数设”你多念几遍就记住了。考试时一看到DMA寄存器相关的题先默念“地计数设”然后对应到具体寄存器基本不会错。DMA这部分内容说难不难说简单也不简单。关键是你要把“为什么需要DMA”“DMA怎么工作”“DMA和中断有什么区别”这三个问题彻底搞懂。搞懂了这三个问题408里DMA的题基本就是送分题。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →