
DMA方式在408计算机组成原理里是个很“微妙”的考点教材上一讲就薄薄几页结构图看起来也不复杂可一做题周期挪用、总线请求、后处理中断这些概念全搅在一起选择题错、大题也写不完整。尤其在王道、唐朔飞、白中英这几本主流书里DMA的表述各有侧重背混了比不背还可怕。这篇就围绕DMA方式把整个逻辑链条讲透——它解决什么痛点、控制器内部靠什么部件工作、一次完整传送分几步、408真题喜欢怎么挖坑最后再落回STM32这类真实芯片里看一眼DMA是怎么配置的。无论你是刚开始学I/O章节的24届考生还是二刷三刷的老手这篇都能帮你把DMA这一块彻底收进知识体系里。1. 为什么得用DMA程序查询和中断都没解决的“搬运难题”1.1 程序查询方式CPU活成了“人肉轮询器”计算机组成原理教材在I/O控制方式上通常按“CPU参与程度从大到小”的顺序讲四类程序查询方式、程序中断方式、DMA方式、通道与I/O处理机方式。前两种是CPU亲自下场搬数据DMA开始把搬运工作外包给硬件到了通道和I/O处理机CPU连“外包合同怎么签”都不太想管了。程序查询方式最直观流程就是CPU不断读取设备状态寄存器判断设备是否准备好没准备好就继续查准备好了就传一个字节或一个字。它最大的问题不是速度慢而是CPU被彻底绑死。设备准备数据可能要好几毫秒CPU就卡在查询循环里干等即使设备准备好一次也只传一个数据传完又接着查。我常用一个比方解释程序查询就像你热饭时全程守在微波炉前盯着倒计时三分钟里什么也干不了。而且这种方式还有个隐含的致命点——如果设备永远没准备好CPU会一直空转循环中断和DMA都不存在整个系统几乎瘫痪。程序查询的优点是控制逻辑简单、硬件开销极小缺点则是CPU利用率极低完全扛不住高速设备的大批量数据交换。408选择题里关于程序查询的高频表述是“CPU与I/O设备串行工作”“CPU需要不断查询设备状态才能收发数据”看到这两个特征基本就能锁定答案。1.2 程序中断方式解决了“等待”但没解决“搬运”程序中断方式正是冲程序查询的“干等”去的。设备准备好之后主动向CPU发中断请求CPU暂停当前程序进入中断服务程序处理这次数据传送处理完再返回断点。好处很明显CPU不需要轮询了设备准备数据的这段时间它可以去执行其他程序。但中断方式有个绕不开的痛每传送一个数据都要经历一次完整的“请求—响应—保护现场—执行中断服务程序—恢复现场—返回断点”流程。这些环节全是开销。一次中断大概要消耗几十甚至上百个时钟周期数据却可能只传了4个字节。硬盘这种高速块设备一秒钟要传几百MB按一次中断传4字节算每秒要触发千万次中断CPU光是响应中断和处理现场就要被淹没用户程序根本跑不动。所以中断方式适合低速设备比如键盘、打印机这种交互频率低、单次数据量小的场景对高速块设备必须换一条路。这里还有一个容易被忽略的逻辑中断方式之所以“一次传一个数据”是因为数据必须经CPU的寄存器中转CPU的中断服务程序里干的本质是“从I/O端口读数据、写回主存”这条路天然限定了传输粒度。1.3 DMA的思路数据不走CPU硬件直接搬DMA全称Direct Memory Access直接存储器存取思想朴实得很在I/O设备和主存之间直接开一条数据通路由专用硬件——DMA控制器——负责整块数据的搬移CPU只在传送开始前设置好参数、传送结束后做善后传送过程中完全不碰数据本身。这样设计一次解决两件事。第一数据不经过CPU内部寄存器中转而是由DMA控制器驱动总线在设备与主存之间直接流动第二CPU在DMA传送期间可以继续执行自己的程序不像查询那样死等也不像中断那样被频繁打断。中断方式里CPU是快递员每件快递都亲手搬DMA方式里CPU把一整车快递的运输外包给物流公司只需要告诉对方“去哪个仓、装多少件、送到哪”然后转头忙自己的事。把三种方式放一张表里对比这张表是408的高频考点值得默写控制方式CPU与I/O工作方式谁发起传送传送单位传送过程CPU角色程序查询串行CPU主动查询字节/字全程参与被绑定程序中断并行间隙设备主动发中断字节/字每传一个数据被打断一次DMA并行设备发DMA请求DMA控制器接管总线数据块预处理和后处理参与传送过程中不参与记忆口诀可以这样查询是“CPU跑腿”中断是“CPU每单都签收”DMA是“CPU只管发货和收货”。这里的“成块传送”是DMA区别于前两者的本质特征也是后面所有计算题的基础。2. 拆开DMA控制器它凭什么能“抢”总线2.1 寄存器组MAR、WC、DR各自扮演什么角色DMA控制器内部结构在唐朔飞和白中英的教材里画法略不一样但核心部件是统一的主存地址寄存器MAR保存本次传送要访问的主存单元地址。预处理阶段由CPU写入初值每传一个数据后自动加1或减1传送结束后指向最后一个数据地址的下一个位置。传送长度计数器WC保存待传送的数据个数。预处理阶段由CPU写入每传一个数据自动减1减到0时产生“计数归零”信号表示整块传送结束。数据缓冲寄存器DR暂存本次要写入主存或从主存读出的数据负责匹配设备和主存之间的速度差异。DMA请求触发器设备准备好数据时向DMA控制器发出“DMA请求”通过这个触发器记录请求状态。控制/状态逻辑负责协调访存、计数、产生各种时序信号是DMA控制器的“大脑”。中断机构传送结束时向CPU发中断请求请CPU做后处理。这个结构对应的数据通路是设备把数据送入DR同时让DMA请求触发器置位DMA控制器向CPU申请总线CPU让出总线后DMA把DR中的数据写入MAR指向的主存单元然后MAR加1、WC减1如此循环。注意一个细节WC减到0产生的不仅仅是“结束信号”在408大题里它经常被描述为“DMA传送结束信号”或“计数溢出信号”。这个信号同时做两件事——撤销DMA对总线的请求以及触发中断机构向CPU发出中断请求。这是极容易遗漏的点。2.2 DMA请求与总线请求两个信号不能搞混教材和真题里经常会冒出两个相似的概念DMA请求和总线请求有的书叫HOLD请求、总线请求/总线响应。很多人复习的时候混在一起结果选择题一出来就翻车。DMA请求是设备发给DMA控制器的信号意思是“我这边有一个数据准备好了请开始搬运”总线请求是DMA控制器收到设备请求后再发给CPU的信号意思是“我需要用一下主存总线”。CPU看到总线请求会在当前机器周期结束时让出总线回复总线响应信号DMA控制器随后接管总线完成一次数据传送。说白了DMA请求是“业务请求”总线请求是“资源申请”。设备不能直接对CPU发声必须通过DMA控制器代为申请总线。这个“两级请求”的结构在中断和DMA对比题目里经常出现问“下列哪个信号是发给CPU的”时答案往往是总线请求而不是DMA请求。2.3 三种DMA与主存配合方式停止访问、周期挪用、交替访问DMA设备要和主存交换数据必然要占用主存总线。教材给出了三种配合方式背后是“CPU访问主存和DMA访问主存如何错开”的取舍。第一种是停止CPU访问主存。DMA控制器在整块数据传送期间独占总线CPU完全无法访问主存只能做寄存器内部的运算。优点控制最简单传送速度最快适合数据量极大、速度极高的设备。缺点CPU被长时间挂起如果设备速度跟不上主存速度总线空等的时间很多反而浪费。这个方式在408考得不算多因为计算价值不大。第二种是周期挪用也叫周期窃取。DMA不是独占总线而是只在CPU访存的空闲间隙插入一次访存操作传完一个数据马上把总线还给CPU。这里有个经典细节唐朔飞教材把“挪用时机”分成了三种情况——CPU正在访存时DMA必须等当前存储周期结束CPU暂时不访存时DMA可以立即挪用CPU和DMA同时请求访存时DMA优先获得总线。这个“DMA优先”的原则要记住它是选择题的一个考点。周期挪用的优点是CPU损失小缺点是控制逻辑比停止访问复杂也是408计算题最偏爱的主战场。第三种是DMA与CPU交替访问。把主存的存取周期分成两半前半给CPU用后半给DMA用两边严格错开不需要申请和释放总线的过程。这种方式通常要配双端口存储器才能真正高效实现硬件成本最高适合CPU访存周期非常规律的场景。教材里常强调它“CPU既不停止访存也不等待”但在实际考题里更多是作为概念判断出现。3. 一次完整的DMA传送从预处理到后处理3.1 预处理阶段CPU填好面单再放手在DMA开始搬运数据之前CPU必须完成“面单填写”。具体要干四件事向MAR写入本次传送的主存起始地址向WC写入本次要传送的数据个数根据传送方向设置控制状态比如设备→主存还是主存→设备向设备发出启动传送命令让设备开始往DR里放数据。这个阶段CPU是在执行普通指令的理论上需要主动访问DMA控制器的寄存器所以它也会占用CPU时间。真题如果问“DMA方式下哪些阶段CPU必须参与”预处理和后处理是标准答案而数据传送阶段严格来说不需要CPU干预。有个很实际的类比预处理就像寄快递时填写面单收件地址MAR、件数WC、寄还是收方向填完交给快递员就出发。快递员在路上的时候CPU该干嘛干嘛。3.2 数据传送阶段DMA接管总线一个存储周期传一个数据设备准备好一个数据后向DMA控制器发出DMA请求DMA控制器收到后向CPU发出总线请求CPU在合适的时机让出总线向DMA控制器发出总线响应DMA控制器获得总线控制权后把DR中的内容写入MAR指向的主存单元写完后MAR加1、WC减1DMA控制器释放总线。每传送一个数据都要重复一遍“申请总线—获得总线—传送—释放总线”的循环。在周期挪用方式下DMA只是见缝插针地插一次访存所以CPU几乎感觉不到自己“被借走了一个存储周期”。这也是DMA能在高频率外设下仍然不拖垮CPU的原因。关于传送粒度还有一个点每传送一个数据到底占用几个存储周期取决于数据总线和DR的宽度。如果存储周期按“字”算、每次传一个字那一个数据就是一次挪用如果设备每次只准备好一个字节而主存按字访问就可能涉及拼装计算题里通常都在题干里注明做题时注意别默认。3.3 后处理阶段传送结束信号触发中断WC减到0时DMA控制器知道整块数据传完了会产生计数归零信号。这个信号一路触发中断机构向CPU发出中断请求CPU响应后进入中断服务程序做善后——校验数据、记录传送结果、决定是否继续传下一块、通知上层程序数据已就绪。这就是DMA方式依然需要中断机构的原因。DMA不是不用中断而是大幅降低了中断频率中断方式每传一个字节打一次断DMA传完一整块数据才打一次断。408里有一类题专门问“既然DMA可以成块传送为什么还需要中断”标准答案是“通知CPU进行后处理”。很多同学第一反应“DMA不用中断”是错的记住这一点选择题能救一分。3.4 把完整流程写成伪代码把三个阶段连起来用类似C的伪代码表示408不用写代码但逻辑很清楚// 预处理CPU设置DMA参数 DMA.MAR 主存起始地址; DMA.WC 要传送的数据个数; DMA.方向 设备 - 主存; 启动设备; // 数据传送循环执行CPU不参与 while (DMA.WC ! 0) { 等待设备数据就绪; DMA发出总线请求; 获得总线控制权; DR 设备数据; 主存[MAR] DR; MAR; WC--; 释放总线; } // 后处理传送结束 DMA产生计数归零信号; DMA向CPU发出中断请求; CPU执行中断服务程序完成善后;这段伪代码里的“MAR”和“WC--”是每次传送后的固定动作。408大题有时会让你写出“本次传送完成后MAR和WC的内容分别是多少”本质就是考察这两个寄存器的变化规律。4. 408真题考法选择题、周期挪用计算与综合场景4.1 选择题里的高频概念陷阱DMA相关的选择题最基础的是“I/O设备与主机交换信息时不需要CPU介入也能进行大量数据传输的方式是”答案DMA或通道。再难一档的是给一段描述让你判断属于哪种方式比如“传送前由CPU执行程序设置参数传送后由CPU执行中断服务程序做善后传送过程中CPU可执行其他程序”——这是DMA方式。“每传送一个数据都需要CPU执行中断服务程序”——这是程序中断方式。“传送过程中CPU与I/O设备串行工作CPU需要不断查询设备状态”——这是程序查询方式。我整理过一批高频辨析点几乎每年模拟题都会碰DMA是硬件方式程序查询和中断都依赖CPU执行程序或中断服务程序来搬数据中断方式每次传送都会打断CPUDMA是整块传送结束才打断一次DMA的传输路径是I/O设备→DR→主存不经过CPU内部寄存器DMA控制器要访问主存必须通过总线所以DMA也要参与总线的申请与仲裁。第4条是最容易被忽略的。很多同学以为DMA“自己有自己的存储”不需要总线其实DMA只是把数据从设备搬到主存通路还是总线只不过这条通路上的“搬运工”从CPU换成了DMA控制器。4.2 周期挪用类计算题的固定套路周期挪用计算题在真题和习题集里都很常见。典型题干是磁盘以DMA方式和主存交换数据每传送一个数据需要挪用一次存储周期已知存取周期为t微秒设备平均每d微秒请求一次DMA传送问DMA挪用存储周期的时间占比。做法极固定用设备请求频率乘以单次挪用时间。每d微秒一次每次挪用t微秒占比就是t/d。比如存取周期1μs设备每2μs请求一次DMA占用率为1/250%。如果改成“每秒传送N个数据每次挪用1个存储周期”则每秒挪用N次占用时间为N×t微秒占比再除以1秒对应的微秒数。真正容易错的不是公式而是“一个数据需要挪用几次存储周期”。题干给的是“每个数据块4KB每个存储周期可传送4字节”那传送一块需要挪用1024次不是一个数据块只挪用1次。做题时建议先在草稿纸上写单位链条设备传送速率→每秒数据个数→每秒挪用次数→每秒挪用总时间→占比。单位链条写清楚基本不会错。4.3 综合题磁盘DMA读数据的完整写法408大题给DMA的场景通常带着磁盘。典型问法某硬盘利用DMA方式将一个数据块读入主存缓冲区。请问一次数据读入过程分哪几个阶段每个阶段CPU是否参与DMA请求信号在什么时刻产生若磁盘转速和扇区大小已知计算平均每个扇区需要挪用多少次存储周期答这种题要按顺序展开先答三个阶段。预处理阶段CPU设置MAR初值、WC初值、传送方向然后启动磁盘读操作。数据传送阶段磁盘每准备好一个数据就发DMA请求DMA控制器申请总线、传送数据、更新MAR和WCCPU不参与。后处理阶段WC减到0DMA发中断请求CPU进入中断服务程序做善后。再答信号时序。DMA请求是设备把数据送入DR后产生的总线请求是DMA控制器收到DMA请求后产生的。这两个信号一前一后顺序不能反。最后答计算。每传送一个扇区大小的数据块就根据“扇区字节数/每次传送字节数”算出挪用次数。比如一个扇区512B每次传4B则挪用128次。如果还要算时间再乘存储周期。4.4 和Cache、总线、中断串起来考的综合性问题DMA很少单独出大题更多是和Cache、总线、中断串成综合小题。常见串法一是DMA与Cache一致性问题。DMA直接向主存写入数据如果Cache里还保存着该主存块的旧副本CPU再读Cache就会读到过期数据。这就是DMA传输导致的Cache一致性问题解决思路通常是写直达策略或者让设备在写入后使Cache对应块失效。408对这个问题一般只要求判断现象和解决方向不用写深。二是DMA与总线仲裁的关系。多设备都请求总线时DMA请求通常比CPU访存请求优先级高因为外设数据不及时取走可能丢失而CPU访存晚一个周期问题不大。这个优先级顺序在一些选择题里会作为背景信息出现。三是“中断方式数据块”的组合题。比如有的设备虽然用中断方式但每次中断处理里通过循环传送一批数据这种“中断软件循环”和“DMA硬件成块传送”在开销上的区别也常被拿来对比。做题时抓住本质只要数据搬运的每一步都要CPU执行指令无论循环多少次都还算中断方式只有由DMA控制器硬件完成每一步搬运才叫DMA。5. 常见问题与避坑实录5.1 周期挪用和交替访问的判别技巧备考时最容易搞混的就是周期挪用和交替访问。两者都让CPU“基本能继续执行程序”但机制完全不同。周期挪用有一个“申请—响应—借用存储周期—释放”的过程DMA是见缝插针交替访问则把存储周期固定切成两半CPU和DMA各用一半没有明显的申请释放过程通常还要以双端口存储器为前提。判别技巧就看题目关键词。出现“在CPU不访存时插入访存”“挪用存储周期”“DMA优先”这些描述选周期挪用出现“存取周期分为两部分”“CPU与DMA交替”“双端口存储器”这些描述选交替访问。这套关键词在王道习题里出现频率很高记牢能快很多。5.2 DMA传送期间CPU到底能不能执行程序这个问题几乎每次讲DMA都有人问。精确答案是分方式的周期挪用和交替访问下CPU可以继续执行程序停止CPU访问主存方式下CPU无法访存不能从主存取指令取数据只能做寄存器内部的运算整体是被阻塞的。408真题大多数时候默认讨论周期挪用场景所以标准结论“DMA传送过程中CPU可执行其他程序”一般是成立的。但考场如果选项里出现“CPU完全不能执行程序”这种绝对化表述要警惕它是不是在描述停止访问方式。5.3 从408到STM32真实芯片里的DMA长什么样学408的DMA理论容易觉得抽象但如果接触过嵌入式开发会发现整个理论在STM32这类芯片里被原封不动地实现了。STM32的DMA控制器有一组通道每个通道可以绑定串口、ADC、定时器等外设。配置DMA时你要设置源地址、目标地址、数据长度、传输方向外设到内存、内存到外设、内存到内存还要选择数据宽度、是否循环模式。这不就是408教材里的MAR、WC和DMA请求/总线请求吗比如常用的串口DMA接收外设数据寄存器作为源地址内存缓冲区作为目标地址DMA_CNDTR写入要接收的字节数数据收到一定长度后产生传输完成中断——中断里做的事就是“后处理”。ADC用DMA连续采集也一样采集完一波数据DMA把结果搬到内存数组主循环直接读数组。所以我一直建议备考同学如果时间充裕去翻一翻STM32官方库或HAL库里DMA相关的代码哪怕只是读注释也能把教材上的DMA结构和真实硬件对应起来。理论课最怕“背得下来但不知道是什么”以MCU视角看一次DMA配置记忆会牢得多。5.4 王道、唐朔飞、白中英怎么搭配用热词榜里“王道pdf”“唐朔飞课后题答案”“白中英”都是408考生的老朋友。我的建议是分工明确别一本啃到底。王道复习全书适合搭框架和刷题它对三种I/O控制方式的对比表格信息密度很高建议直接背成条件反射选择题速度全靠它。唐朔飞教材适合抠叙述细节尤其是中断周期、DMA周期、存储周期的时间层次课后周期挪用计算题质量很高值得二刷。白中英教材的系统结构图和例题更全适合补充理解DMA控制器在整机中的位置但它有些符号体系和408不一致复习时以考纲和王道为准别被它的表述带偏。5.5 最后的小技巧先默写再刷题复习DMA时我发现一个立竿见影的方法别急着刷题先在草稿纸上默写一遍从CPU预处理到中断后处理的完整流程包括MAR、WC、DR三个寄存器的变化DMA请求和总线请求两级信号的先后顺序以及三种配合方式的适用场景。能默出来说明知识真正进脑子了默不出来翻书再看一遍也不亏。默完再去做题速度和准确率都有质的提升。这个方法对I/O章节的其他内容也通用计算机组成原理说到底是一套组装了各种硬件的系统逻辑能把流程画出来比背一万句定义都管用。