ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

搞懂DMA(直接存储器存取):原理、流程与408考研易错点全解析

搞懂DMA(直接存储器存取):原理、流程与408考研易错点全解析 搞懂DMA直接存储器存取基本等于啃下了计算机组成原理I/O方式这一章最硬的一块骨头。408考研里I/O控制方式几乎年年出现而DMA又是绕不开的绝对核心程序查询、程序中断、DMA、通道这条线最后几乎都要收束到DMA上来对比、出题。我备考那阵子DMA这几个词在真题、模拟卷、王道书里反复刷脸一开始我也被那些“周期挪用”“总线请求”“预处理后处理”绕得晕头转向后来把它的来龙去脉嚼碎了才发现DMA并没有想象中那么玄本质上就是一组硬件逻辑替CPU完成“搬数据”这种脏活累活。这篇东西写给正在被408折磨的考研人、期末突击的本科生也写给想弄明白设备数据到底怎么进内存的开发同学尽量用大白话把DMA的原理、流程、考点和易错点一次讲透。1. 为什么会有DMAI/O设备与主机之间的“效率困局”1.1 程序查询和程序中断方式到底慢在哪想理解DMA存在的意义得先看清楚它前面的两种方式为什么让人抓狂。程序查询方式简单粗暴地说就是CPU“死等”CPU不断读取设备状态寄存器看设备准备好没有没有就继续读有就开始传数据。这个过程里设备的速度往往比CPU慢好几个数量级CPU绝大多数时间都在空转等设备资源浪费非常明显。哪怕设备准备好了之后的数据传输也完全靠CPU执行指令来完成每传一个字节或者一个字CPU都要干一堆杂活。程序中断方式表面上解决了“等待”的问题设备准备好了主动发中断请求CPU接到请求后暂停当前程序跳去执行中断服务程序把数据传输完再回来。这样CPU不用傻等了可以一边跑程序一边等设备。但问题是中断方式本质上仍然是“程序控制”方式数据还是要从设备寄存器读到CPU寄存器再从CPU寄存器写入主存CPU亲自当“搬运工”。而且中断一次的代价不低保护现场、识别中断源、转到中断服务程序、恢复现场这些开销都落在CPU身上传一个字节就要折腾一趟。遇到磁盘、网卡这种高速成块设备中断方式的效率低到让人无语CPU会被中断风暴淹没大部分时间都花在处理中断上而不是执行用户程序。所以说程序查询和程序中断的效率瓶颈根源都在同一个地方数据通路必须经过CPUCPU既是发号施令的指挥官又是埋头搬货的苦力。只要数据量一大、传送频率一高CPU就别想干正事了。1.2 DMA的核心思路CPU只做开头和结尾DMA全称Direct Memory Access直译是“直接存储器存取”。它做的事情就是在I/O设备与主存之间建立一条直接的数据通路由DMA控制器习惯称DMAC来接管总线的使用让设备与主存之间能成块地搬运数据。而CPU要做的只是在传送开始前把参数设置好在传送结束后处理一下结果传送过程本身基本不参与。用一个生活化的类比来理解老板CPU要往仓库主存里搬一批货但他不想自己动手于是雇了一个专职搬运工DMA控制器。老板只告诉搬运工“去哪个仓库取货、放哪个货架、搬多少箱”然后自己回办公室处理别的业务。搬运工自己找车、装货、卸货忙完之后来跟老板汇报一声“搬完了这是签收单”。整个过程里老板没有亲自搬任何一箱货只是开头下指令结尾听汇报。这就是DMA和中断方式最本质的差别中断是“CPU亲自搬搬一会儿来一趟”DMA是“CPU派专人搬开头结尾各管一次”。这个“专人”不是软件而是一套硬件逻辑所以考试里常说DMA是“硬件方式”而中断属于“程序控制方式”。把这条主线抓住后面很多细节都不会乱。2. 一台DMA控制器里都有什么部件、流程、三种访存方式2.1 DMA控制器的核心部件与各自分工要把DMA讲清楚得先认识DMA控制器内部那几个“干活的人”。不同教材叫法略有差别但核心部件基本是这么几块主存地址寄存器MAR有些书叫AR用来存放当前要访问的主存地址。每次传送一个数据地址会按方向自动加一或减一相当于搬运工手里的“门牌号”。数据缓冲寄存器DR用来暂存设备与主存之间要传送的数据。设备和外设速度不匹配时先用这个缓冲寄存器过渡一下相当于临时中转站。数据计数器DC记录还需要传送多少数据初始值由CPU在预处理阶段写入每传一个字/字节就减一减到零说明成块传送结束它会触发中断机构向CPU报告。控制/状态寄存器CR记录传送方向读/写、传送方式、启动/停止等控制信息。DMA是让设备往主存写还是从主存读出来靠它来定义。中断机构在数据计数器归零、整块数据传送完成后向CPU发出中断请求请CPU来做善后处理。记住一点DMA之所以叫DMA不等于它完全抛弃中断它恰恰需要一次“结束中断”。设备地址寄存器/设备选择电路DAR指明当前要控制的I/O设备是哪一个多台设备各配一套DMA请求逻辑时这里用来区分设备。把这些部件联合起来看DMA控制器就是一台“小型专用处理器”它能产生主存地址、能计数、能判断结束、能发中断请求唯独不能执行通用的复杂指令。所以很多教材会强调DMA方式是“靠硬件逻辑实现的数据传送控制方式”它没有自己的程序。2.2 一次DMA传送的三个阶段预处理、数据传送、后处理DMA的完整工作过程考试喜欢让你写步骤或判断“某一步是谁做的”。标准的三阶段划分很清晰第一阶段是预处理干活的只有CPU。CPU执行I/O指令把这次传送需要的参数写入DMA控制器的寄存器数据传送的方向输入还是输出、主存起始地址、需要传送的数据个数、要操作的设备编号。这一步相当于老板向搬运工交代任务去几号仓库、搬什么货、搬多少件。参数写好后设备就可以启动一旦设备准备好数据输入场景或准备好接收数据输出场景就会向DMAC发出DMA请求。第二阶段是数据传送干活的换成DMAC。DMAC接到设备的DMA请求后会向CPU发出总线请求申请使用总线。CPU在当前总线周期结束后让出总线控制权DMAC获得总线后直接管理设备和主存之间的数据流动每传一个数据它都要向总线发送主存地址、发出读/写控制信号、把数据写进主存或从主存取出然后修改数据计数器和主存地址寄存器最后判断整块数据是否传完。这个过程CPU全程不参与数据也不经过CPU的通用寄存器这正是DMA效率高的原因。第三阶段是后处理CPU重新登场。数据计数器归零后整块传送完成DMAC向CPU发出中断请求。CPU响应后执行中断服务程序做一些善后工作比如检查传送过程有无错误、记录状态信息、决定是否启动下一次传送。这就可以看出DMA引用了中断机制但是目的是“传送结束汇报”而不是“逐字逐句搬数据”。2.3 三种主存访问方式停止CPU访存、周期挪用、交替访问DMAC获得总线之后怎么跟CPU协调使用主存教材里给出了三种方式考研真题经常考到它们的概念和取舍。停止CPU访问主存是最简单粗暴的一种。DMAC在传送整块数据期间一直占用总线CPU完全无法访问主存。这个方法控制简单适合I/O设备传送速率非常高、一次成块传完的场景比如高速磁盘大批量读写。代价是CPU在传送期间基本“瘫痪”只能让出总线等DMAC干完如果设备不是特别快这种方式对CPU的浪费就很可惜。周期挪用也叫周期窃取是目前理解起来最关键的一种。它利用CPU不访问主存的间隙期让DMA插入一个或几个主存周期来传送数据。CPU平时并不是每个周期都在访存比如它执行寄存器运算指令时根本不需要用总线这时候DMAC就可以“偷”一个总线/主存周期来传一次数据。这种方式对CPU的干扰小不会长期占用总线是很多实际系统采用的做法。但也因为每次只能“见缝插针”传一部分对设备侧的FIFO缓冲要求更高。考试里算“周期挪用对CPU执行时间的影响”基本就是基于这种方式出的。交替访问又叫透明DMA方式。把主存的一个存取周期分成两个时间片一片固定给CPU一片固定给DMAC两边各用各的互不干扰甚至不需要总线仲裁。听起来很完美但代价是要求主存的工作速度足够高因为主存周期被强行拆成了两份。这种方式理解起来不难做题时主要抓住“交替”“透明”两个关键词。三种方式放在一张表里对比结论很清晰停止CPU访存最影响CPU、周期挪用最均衡、交替访问最“无感”但对硬件要求最高。真题无论怎么问“某某方式的缺点是什么”答案基本都在这三个方向里。3. DMA与中断、通道的关系别把概念搅成一锅粥3.1 DMA与程序中断的对比一张表解决大半选择题DMA和程序中断是考试里最爱放在一起对比的两个概念。很多同学学完中断再学DMA脑子里的线就缠住了总觉得DMA“也是中断的一种”。真不是。用一个多维表格来看就特别清楚对比维度程序中断方式DMA方式数据传送单位字节/字一次中断传一个数据块一次DMA传一批传送控制主体CPU执行中断服务程序DMA控制器硬件逻辑数据通路设备→CPU寄存器→主存绕经CPU设备→主存直接传送不绕经CPUCPU的参与程度全程参与逐次搬数据预处理和后处理参与中间不参与响应时机指令执行阶段每条指令结束后查询总线周期结束或其他特定时机等总线空闲处理内容除数据传送外还能处理异常、设备状态主要做数据传送异常处理需借中断对CPU的打扰频繁每次传送都要打断相对少整块传完才打断一次并行性CPU与设备不能充分并行传数据传送期间CPU可以执行非访存操作从这张表可以提炼出两个常考论断第一中断方式下每传一个“小单位”数据CPU都要被卷入一次DMA方式下整块数据传完才打扰CPU一次所以DMA的中断频率比程序中断低得多。第二中断方式的数据要“流经CPU”DMA的数据“绕过CPU”这是效率差异的根本原因。答题的时候先写这两点再展开细节基本就拿住分了。3.2 容易被忽略的三个细节第一DMA传送结束后仍然要发中断请求。有人会误以为DMA完全不依赖中断这不对。DMA利用的是“传送结束中断”来通知CPU做后处理只是它不像程序中断那样用中断来处理每一次数据传送。所以做题时看到“DMA结束后需要中断吗”要答“需要”但性质是“善后汇报型”中断。第二DMA的响应时机不是随便什么时候都行。程序中断一般是在指令执行结束后响应而DMA请求的响应时机通常是在总线空闲或者CPU不访存的时刻。也就是说DMA请求具有比中断请求更高的优先级但它只能“插空”执行并不是立刻抢占一切。多个外部设备同时发DMA请求时还需要总线仲裁来决定谁能先获得总线。第三DMAC获得总线控制权不等于CPU停止工作。如果是周期挪用方式CPU在DMA传送的间隙里照样可以执行不访存的指令比如做算术运算、访问内部寄存器。CPU只是暂时不能访问主存并没有完全“停机”。这一条在计算题里特别关键很多同学觉得DMA工作期间CPU效率就是0其实要看具体訪存方式。3.3 DMA与通道、I/O处理机的关系考研大纲里通道和I/O处理机属于了解性内容但考卷常把它们和DMA放在一起做“关系题”。通道的定位可以理解为“增强版DMA”DMA只能完成一个设备、一段数据的简单搬运通道是一个能执行通道程序的部件它可以控制多台同类或异类设备执行较复杂的I/O操作。换句话说DMA的“程序”就是CPU帮忙预设的几个寄存器参数而通道有自己的通道指令能独立组织I/O操作更智能。I/O处理机则是通道的进一步升级它本身就是一个有完整指令系统的处理器能独立执行I/O程序管理大量设备甚至可以处理码制转换、差错校验。从DMA到通道再到I/O处理机主线就是“把I/O控制从CPU手里一点点剥离出去让独立的硬件/处理器专管设备和数据的对接”。在简答题里只要抓住这条主线再把“通道能执行程序、DMAC不能执行程序”这个关键差异写出来分数就到手了。4. 应试怎么看DMA真题题型、答题模板和易错点4.1 408真题怎么考DMA四种题型拆解DMA这个点在408试卷里题型的分布很规律基本逃不出这四类。第一是概念辨析题一般出现在选择题。比如给四个说法让你判断“DMA方式下CPU完全不参与数据传送”“DMA传送结束后需要中断”“DMA响应一定比中断快”哪个对哪个错。这类题考的就是对DMA本质概念的理解难度不大但特别爱抠细节比如“响应快慢”和“传送效率”是两码事DMA响应需要等总线空闲不能说它“无条件比中断快”。第二是阶段归属题让你判断某个动作发生在预处理、数据传送还是后处理阶段。选项中经常出现“设置主存起始地址”“修改数据计数器”“检查传送错误”“发出中断请求”这类动作你得能分辨出谁干的、什么时候干的。这种题最好的应对办法就是死记三阶段动作表预处理是CPU写参数、数据传送是DMAC控总线搬数据、后处理是CPU收尾。第三是计算题围绕周期挪用和停止CPU访存展开。给出一块主存周期、DMA请求频率、每次传送数据量让你算“CPU受到影响的百分比”或者“DMA占用总线的比例”。这类题看起来吓人其实只要抓住“占用周期数/总周期数”这个核心比例把单位统一好基本就能算对具体例子放到下一节展开。第四是综合大题通常把DMA与中断方式放在同一情景里对比让你回答为什么某设备适合DMA而不适合中断或者画一幅DMA传送流程图或者分析数据通路的差异。24年考题方向其实延续了这几年“注重基础原理工程场景分析”的风格题干不会特别绕但要求你能把三阶段流程和硬件组成讲明白这种大题靠背模板加理解完全可以应付。4.2 按步骤拆一道典型计算题我挑一道常见的“周期挪用对CPU影响”的计算题来做完整拆解这类题几乎每年都会以某一种变形出现。假设条件某设备的DMA请求以周期挪用方式传送数据每次挪用主存一个存取周期主存存取周期为100ns设备每1μs产生一次DMA传送请求每次传送1个字32位。问DMA占用主存的时间比例是多少再问CPU因此受影响的比例是多少思路很简单先把时间单位统一。1μs1000ns所以每1000ns里DMA要挪用1次每次100ns。那么DMA占用主存的比例就是100÷100010%。这里的“占用比例”指的就是在总的时间线里DMA使用主存周期所占的比例CPU因此受影响的比例在同一条件下也是10%因为CPU在DMA占用主存的那个周期里无法访问主存。如果题目换到“停止CPU访存”方式比如DMA连续传送1024个字每次传送占一个主存周期那么传送期间CPU就是完全不能访存的受影响比例往往就是100%或者按传送时长占总时长的比值来算。这道题真正的坑在于单位换算出错比如把“1μs产生一次请求”看成“1ms”或者把主存周期和CPU时钟周期混着用一混准错。做这种题我习惯在草稿纸上先把两个时间量写出来传送间隔、单次传送占用时间然后只管做除法。4.3 五个高分答题模板与高频易错点有些结论类的题提前准备好“话术”考场上能省很多时间。问“为什么磁盘适合DMA而不适合程序中断”标准答法是一句话结构磁盘以块为单位批量传送、速度快、要求高实时性中断方式每传一个字节就要打断一次CPU且数据绕经CPU开销极大DMA支持成块传送、数据不经过CPUCPU仅预处理和后处理各参与一次因此适合磁盘这类高速块设备。问“DMA传送的完整流程”标准答法是三阶段展开CPU预处理设置方向、首地址、字数DMAC控制总线完成一次组数据的直接传送期间每次传送后自动修改地址和计数器传送结束DMAC发中断请求CPU后处理。每阶段附一句“此时谁在工作”得分点就齐了。问“DMA和中断在CPU参与上的区别”别只写一句“DMA不用CPU”要拆开说程序中断是CPU执行程序完成传送每次传送CPU都要进入中断服务程序DMA由硬件控制器直接传送CPU只在预处理和后处理介入传送过程CPU可以执行其他指令。这样至少两个得分点。高频易错点里最坑的是这几个第一DMA传送单位是“数据块”不是“字”或“字节”虽然是一次一个字地传但一次DMA成块传送由很多字组成。第二CPU在周期挪用方式下不是完全空闲只是暂时不能访存。第三“挪用”的主存周期不等于CPU周期答案语言不要写混。第四预处理阶段CPU要设置的寄存器参数是设备地址、传送方向、主存首地址、传送字数四个一个都不能漏考填空题时漏一个就可惜了。第五多个DMAC或设备同时请求时要总线仲裁这一条在判断题里容易拿来挖坑。5. 从“看不懂”到“做对题”我的DMA学习路径与避坑笔记5.1 自己给自己讲一遍胜过刷十道题我备考时对DMA真正开窍不是因为在书上反复看那个结构图而是因为做了一件事在纸上画了一条总线把CPU、DMAC、主存、一台磁盘画上去然后对自己完整讲了一遍数据从磁盘到内存的搬家过程。讲着讲着就会发现很多以前模模糊糊的点突然就串起来了。比如为什么DMA请求优先级比中断高、为什么DMAC需要MAR和DC、为什么传送完了还要中断——这些点在书上是一行行文字在动手“演示”的时候就是一组必然的因果关系。具体操作步骤可以这样第一步画出四大部件主存、DMA控制器、I/O设备、CPU中间用一根粗粗的总线连起来。第二步用三种颜色的笔分别标注“预处理阶段CPU做的事”“传送阶段DMAC做的事”“后处理阶段CPU做的事”。第三步用手比划一个数据从设备流到主存的轨迹先在设备缓冲寄存器里再经DMA的数据缓冲寄存器中转最终写到主存地址寄存器指定的单元。你能把这个轨迹完整说出来哪怕不看书DMA这套机制也稳了。5.2 王道、唐朔飞怎么搭配使用手边资料常见的是王道和唐朔飞的教材两本各有定位搭配起来效率更高。唐朔飞的《计算机组成原理》对DMA底层细节讲得透三阶段流程、三种访存方式甚至DMA控制器的内部逻辑都有细致的解释适合第一遍理解原理时啃。王道的辅导书则更应试表格归纳到位DMA与中断的对比、真题规律、常考易错点都收得很齐适合第二轮刷题前快速过知识框架。我自己的经验是第一遍看书先把“为什么需要DMA”这个问题想透彻第二遍直接用王道表格建立答题体系第三遍再回到真题做错题归类。不要一上来就抱着唐朔飞死磕底层逻辑DMA毕竟不是设计题408考不到那么深的硬件实现细节。反过来如果一上来只刷王道不翻课本又容易把DMA理解成几个表格结论遇到新角度的大题就发虚。两本结合原理和应试恰好互补。5.3 我踩过的四个真实坑第一个坑是把“DMA请求”和“中断请求”的响应条件说反。DMA请求通常比中断请求优先级高响应时机是总线空闲或CPU访存间隙中断请求是在指令执行结束后被CPU查询。很多判断题就喜欢在这里做文章比如“DMA请求可以在任意时刻立即得到响应”显然不对因为必须等总线周期结束或总线空闲。这类选项我当初都是靠画一个“ CPU执行—访存—执行—访存 ”的时间轴往轴上标“DMA可以插入的位置”才彻底想明白。第二个坑是画传送流程图时漏掉“总线请求/总线仲裁”环节。很多同学画DMA流程从设备请求直接跳到数据传送把DMAC向CPU申请总线、CPU让出总线控制权这一大段全跳过去。可真题的大题评分点里总线请求与总线仲裁恰恰是关键步骤。以后再遇到画流程我会习惯性写下五步设备发DMA请求→DMAC向CPU发总线请求→CPU让出总线→DMAC控制完成一次字传送→判断计数器是否归零。第三个坑是计算题里把“主存周期”和“CPU时钟周期”混为一谈。有一道模拟题给的是CPU主频100MHz主存周期200ns我直接用主频去算周期结果比例差了一倍。实际上DMA挪用的是一个主存存取周期跟CPU时钟周期是两码事。做题前先判断题目问的是“总线占用比例”还是“CPU执行时间受影响比例”单位参考物不一样结论也不一样。第四个坑是预处理阶段参数答不完整。答题时我总写“设置主存首地址和字数”漏了“传送方向和设备号”。后来总结发现预处理四参数可以编成口诀“方、设、址、数”——方向、设备、首地址、数据个数考场默写时按口诀逐一对位再也不漏。5.4 再分享一个“代入角色”的理解技巧如果前面这些还是觉得抽象我建议你用“角色扮演”的方式去理解DMA把CPU当成你的大脑DMAC当成一个靠谱的助理主存当成一个档案柜设备当成一台复印机。你想复印一份几十页的资料并归档如果自己一份一份复印、一份一份塞进柜子那这一下午就没了如果派助理去复印机一页页出来助理一页页按编号放进柜子你只需要提前告诉助理“从第几号柜抽屉开始放、放多少页”等助理做完再听一句“放好了有3页卡纸需要你看看”。这个场景里的“大脑—助理—复印机—档案柜”的配合和CPU—DMAC—设备—主存的关系几乎是同构的。用这个画面去理解“周期挪用”也很有帮助你做其他事不访问档案柜的时候助理就趁机放一页进去你正要用档案柜助理就等一等。我个人在实际复习中的体会是DMA这套知识点最怕的是“一看就懂、一做就错”。看懂了表格、记住了流程并不等于能在考场上拿到分。真正有效的办法是像前面说的那样把数据通路画出来、把三阶段流程讲顺、把四参数口诀背牢然后在真题里反复验证。等你能闭着眼睛说清楚“预处理谁干、传送中谁干、结束后谁干、CPU在其中哪几个节点出现”这道题对你来说就再也没有秘密了。DMA之后还有通道、I/O处理机但我可以负责任地说只要DMA这个原点搞透了后面那些内容只是同一套思路的“扩展包”而已。把这个章节拿下408的I/O部分你就已经踩实了大半剩下的不过是用题目反复磨手感罢了。
返回列表