尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

DMA控制器工作原理与访存冲突仲裁:从408考点到STM32实战

发布时间:2026/9/27 1:32:18

资讯中心
01
ARTICLE

DMA控制器工作原理与访存冲突仲裁:从408考点到STM32实战

DMA控制器工作原理与访存冲突仲裁:从408考点到STM32实战
我在复习计算机组成原理I/O这一章的时候前三种控制方式——程序查询、中断、DMA——本来是顺下来的但到了DMA这里很多人第一次卡住。卡住的原因很有意思前面两种方式都是CPU亲力亲为DMA突然说CPU可以不干活了于是“到底谁在搬运数据”“CPU什么时候被闲置”“为什么传送完了又要中断一次”这类问题全冒出来了。尤其这几年408真题里DMA几乎成了I/O部分的固定考点选择题会抠细节、大题会结合中断和总线带宽一起考光背结论根本不够用。这篇内容我会把DMA从设计动机、控制器结构、完整传送流程、访存冲突仲裁到考研真题的典型陷阱一次讲透最后还用STM32和PC内核里的DMA保护做个现实对照。不管是正在备考408的考生还是准备做嵌入式开发、想搞懂DMA IP核怎么用的工程师按这个思路过一遍基本能把DMA这块焊死。1. 从查询到DMAI/O控制方式演进中“效率”是怎么一步步逼出来的很多教材喜欢按“程序查询→中断→DMA→通道”的顺序铺开讲看起来像是在罗列知识点其实这四条路线的背后是一条清晰的主线——怎么把CPU从繁重的I/O搬运工作中解放出来。不理解这条主线后面的寄存器、时序全都是在背天书。1.1 程序查询方式CPU成了外设的贴身保姆程序查询方式的核心逻辑很简单CPU不断读取外设的状态寄存器判断外设是否准备好准备好了就传一个数据没准备好就继续循环等待。// 程序查询方式的伪代码示意 while (1) { if (STATUS_REG READY) { DATA_REG buffer[i]; // 传一个数据 } // 否则空转等待 }这种方式最大的问题在于外设的速度远慢于CPU。磁盘转一圈、串口收一个字节可能都要几千甚至几万个时钟周期CPU在这段时间里只能空转。也就是说CPU把大量本该用来执行程序的时间浪费在了“等外设”上。这也是为什么教材里画程序查询流程时永远有一个循环判断的框——那个判断过程的时间开销基本全是损耗。1.2 中断方式节省了等待但没省掉单字节搬运中断方式的改进是在“等待”这个环节外设准备好了就主动拉一个中断请求线CPU收到后再响应而不是傻乎乎地轮询。这一点确实把CPU从“陪等”中解放了出来外设在准备数据的时候CPU可以跑其他程序。但问题还在。中断方式一次只能传送一个字节或一个字。CPU收到中断后要执行一整套动作保存现场、识别中断源、跳转到中断服务程序、完成数据读写、恢复现场、返回断点。这一套下来几百几十个时钟周期就没了结果只搬了一个字节。如果外设的数据率很高比如磁盘每秒钟要传几百万字节CPU的时间几乎全被这一次次的“中断欢迎仪式”吃掉了。所以中断方式适合“数据量小、不频繁”的场景比如键盘按键但遇到磁盘、显示器这类“大批量连续数据”的外设中断方式就是杯水车薪。DMA的诞生就是冲着这个痛处来的。1.3 DMA的设计思路把“搬运工”从CPU里独立出来DMA全称Direct Memory Access直接存储器存取。它的核心思想是在I/O设备和主存之间建立一条不经过CPU内部寄存器的直接数据通路由DMA控制器这个专门的硬件来接管数据搬运工作。CPU只负责在传送开始前设置参数以及在整块数据传送完成后处理一次收尾中断。你可以把CPU想象成一个公司老板程序查询方式是老板亲自盯着生产线中断方式是有事才叫老板但一件事就要老板跑一趟。DMA则是老板雇了一个专职物流主管把整批货从A仓库搬到B仓库这件事一次性打包交代给主管主管自己搬完搬完再向老板汇报一声。老板从头到尾不用搬任何一件货。这个思路带来的变化是结构性的DMA控制器不再像中断那样只能被动响应它要能主动接管总线发出主存地址、控制读写时序所以在硬件上它必须是“总线主设备”。这一点后面讲数据通路时还会细说。2. DMA控制器的内部构造与数据通路寄存器各司其职DMA不是凭空变出来的法术它是由一堆寄存器加控制逻辑组成的硬件模块。只有把这些寄存器各自的职责搞清楚你才能真正看懂“DMA能搬数据”这件事是怎么发生、怎么结束的。2.1 核心寄存器的职责与初始化不同教材、不同芯片厂商对DMA控制器寄存器的命名会有差异但核心的几个职责是固定的我把通用叫法和职责对应起来寄存器常见别名核心职责主存地址寄存器MAR内存地址寄存器、SAR存放本次要访问的主存起始地址每传送一个数据自动加1或按需不变外设地址寄存器DAR设备地址寄存器存放外设接口中数据寄存器的地址或外设设备的标识字计数器WC传送计数器记录还需传送的数据个数每传一个减1减到0表示整块传送完成数据缓冲寄存器DBR数据暂存寄存器暂存从外设读到或即将写入外设的数据控制/状态寄存器CSR存放传送方向、中断允许位、DMA启动位等控制信息以及DMA忙闲状态这里要特别留意一个点DAR在很多408教材里被写成“外设地址寄存器”但在ARM芯片的DMA外设里它对应的往往是“外设基地址”比如USART的数据寄存器地址。MAR对应的是“内存缓冲区的首地址”。每次DMA传送后MAR会自增内存地址递增而DAR通常保持不变因为外设的数据寄存器地址是固定的。这一增一不变正是“外设到内存连续搬运”的本质。预处理阶段做的事情用一句话说就是CPU向DMA控制器的这些寄存器“写初值”。比如从磁盘读入内存CPU先把主存缓冲区首地址写入MAR把磁盘设备地址和操作命令写入DAR/控制寄存器把传送字节数写入WC然后置启动位。之后DMA控制器就按照这些参数自己跑。2.2 数据通路谁把数据从磁盘送到了内存数据通路的理解建议沿着“外设→主存”这个方向梳理外设准备好一个数据后通过DMA请求线向DMA控制器发出请求。DMA控制器向CPU发出总线请求HRQ/BUSREQ争取总线的使用权。CPU在合适的时机让出总线DMA控制器获得总线控制权后直接向地址总线发出主存地址来自MAR同时向外设接口发出读信号把数据从外设数据寄存器读到DMA内部的数据缓冲寄存器DBR。DMA控制器再向主存发出写信号把DBR中的数据写入MAR指向的存储单元。写完一个数据MAR加1WC减1如果WC不为0继续下一轮如果WC为0DMA发出中断请求通知CPU传送完毕。注意整个过程中数据确实经过了DMA控制器的DBR但DBR只是一个中转站并不需要CPU的ALU参与运算也不需要CPU寄存器中转。所以它比“中断方式里CPU亲手搬运”快得多因为省掉了保护现场、恢复现场这一整套软件开销。2.3 为什么DMA控制器必须能当总线主设备这是很多考生会卡住的点DMA控制器凭什么能让主存听它的答案是它必须具有总线主设备能力。普通的外设接口是总线从设备只能被动接受CPU发来的地址和控制信号。DMA控制器在获得总线控制权后会变成总线上的主设备主动向地址总线发送地址、向控制总线发出读/写信号。所以DMA控制器内部必须有“地址输出”和“控制信号输出”的能力。这也是它和普通外设接口最本质的区别。理解了这个你就能解释为什么DMA控制器需要和CPU做“总线仲裁”因为总线同一时刻只能有一个主设备DMA要接管总线就必须经过请求—应答—让出—使用的完整握手过程。这也是下一章要讲的访存冲突仲裁问题的硬件根源。3. 一次DMA传输的完整生命周期从预处理到后处理DMA的一次完整传送严格来说分为预处理、数据传送、后处理三个阶段。很多同学只盯着中间的数据传送阶段忽略了前后的软件开销做计算题时就会漏项。3.1 预处理阶段CPU把“传送任务单”交给DMA预处理阶段由CPU执行程序完成。CPU通过执行一条I/O指令或对DMA控制器端口的一组写操作把下列信息写入DMA控制器传送方向是外设→内存读/输入还是内存→外设写/输出写入控制寄存器。主存首地址写入MAR。传送的数据个数写入WC。外设地址及启动命令写入DAR和控制寄存器。预处理完成后DMA控制器进入“待命/传送状态”。这时候CPU可以继续执行自己的程序比如做计算、跑指令而外设一旦准备好数据DMA就会启动传送。预处理是软件和硬件的交接点它的代价是若干个时钟周期通常按“块”计与块大小无关。3.2 数据传送阶段总线上的“闯红灯”细节数据传送阶段全由DMA控制器硬件自动完成每传送一个数据的典型步骤如下外设通过DMA请求线发出“数据就绪”信号。DMA控制器接到请求后向CPU发出总线请求。CPU在当前总线周期结束后让出总线具体让出时机取决于仲裁策略见第4章。DMA控制器接管总线把MAR中的地址送上地址总线并发出相应的读写控制信号。数据经DBR中转或在外设与主存间直通完成一次读写。MAR加1或保持不变WC减1。若WC不为0回到第1步继续若WC为0传送阶段结束。这一阶段最容易被误解的地方是“CPU完全被闲着”。在成组连续传送方式下确实CPU不能访存但在周期挪用方式下CPU只是暂时让出一个存储周期绝大部分时间仍在执行程序。所以“DMA传送时CPU一定不能干活”这句话严格说是错的要看仲裁策略。3.3 后处理阶段传完了为什么还要中断一次当WC的值为0时说明整块数据已经传送完成DMA控制器向CPU发出中断请求。CPU响应该中断后执行中断服务程序做后处理工作检查数据传送过程中是否有错误比如校验失败。判断是否还有下一块数据需要传送如果有则重新初始化寄存器启动下一次DMA。记录或更新状态信息返回原程序继续执行。这就是很多人常说“DMA传送完成后会中断CPU一次”的原因。但注意这个“一次”是针对“一整块数据”而言的不是每个字节都中断。对比中断方式“每个字节都中断”DMA的巨大优势就体现在这里。3.4 和中断方式逐项对比别再混淆这两条路线我把两种方式的重要差异用一张表列出来做选择题时可以直接对着判断对比项中断方式DMA方式数据传送单位一个字节/字一个数据块每次中断次数每传一个数据中断一次每传完一块数据中断一次数据传送执行者CPU执行中断服务程序搬运DMA控制器硬件自动搬运传送期间CPU状态中断处理中被占用于传送大部分时间可执行其他程序取决于仲裁响应过程需要保护/恢复现场数据传送阶段不需要适用场景低速、少量数据高速、大批量数据一个很典型的题目是这样问的“DMA方式和中断方式相比主要优势是什么”答案核心就是用硬件代替软件把一次一字节的搬运变成一次一整块的搬运从而大幅降低CPU参与I/O的时间开销。4. DMA与CPU访存冲突的三种仲裁策略性能和代价怎么权衡DMA要访问主存CPU也要访问主存但主存只有一个总线也只有一套。怎么协调双方的使用权教材里讲了三种基本策略本质上是“效率”和“复杂度”之间的权衡。4.1 停止CPU访存成组连续传送简单但霸道这种策略的做法是DMA一旦获得总线控制权就在整个数据块传送期间一直占着总线CPU在此期间不能访问主存。优点是控制逻辑最简单DMA传送的连续性和完整性最好适合磁盘这类需要高速连续传送数据的设备。缺点也很明显CPU被长时间剥夺访存权。但注意这里说的是“不能访存”不是“完全不能工作”。CPU内部寄存器操作、运算器内部运算等不访问主存的工作理论上仍可进行但因为指令在执行时要不断取指令、读写操作数长期不能访存CPU实际执行会处于停顿状态。所以在成组连续传送下系统整体吞吐率会明显下降。4.2 周期挪用周期窃取见缝插针的折中方案周期挪用也叫周期窃取是目前应用最广的思路DMA在CPU不访问主存的时间间隙里“偷偷”挪用一两个存储周期来完成一次数据传送。现代CPU执行一条指令通常需要多个存储周期比如取指周期、取操作数周期。在这些周期之外CPU可能正在进行内部运算并不访问主存DMA就在这种间隙插入自己的访存操作。所以周期挪用最大的好处就是“偷时间”对CPU执行程序的影响远小于停止CPU访存。它也有代价如果外设数据率很高DMA请求频繁可能出现“DMA每次还没传完新的请求就来了”的情况导致传送被拉长而且DMA不一定能恰好赶上CPU的访存间隙可能要多等一会儿这叫“挪用等待”。从408考题角度周期挪用经常作为单选题里“CPU影响最小/折中方案”的答案出现要能跟另外两种区分开。4.3 交替分时访问硬件换并发交替分时访问也叫透明DMA是一种更理想化的方案把CPU的一个存取周期一分为二前半段给CPU访存后半段给DMA访存。这样两级互不干扰从CPU看来完全不需要等待也不需要DMA请求总线、仲裁让权控制反而简单。但天下没有免费的午餐它要求主存的工作速度至少提高一倍而且CPU周期本身要能拆。现代很多高性能系统里类似的思想会以“多端口存储器”或“总线矩阵分时”的形式存在但纯透明的交替分时在实际工程中很少单独出现更多是理论上的一种“极限方案”。4.4 三种方式一张表理清仲裁策略总线使用权分配对CPU的影响硬件复杂度适合场景停止CPU访存DMA独占总线直到整块传完大CPU长时间不能访存简单高速大批量连续存储设备周期挪用DMA在CPU访存间隙插入访问小每次仅挪用1~2个周期中等多数实际系统交替分时访问CPU和DMA按固定节拍分时访问几乎无影响依赖高速主存理想化/高端设计考试时遇到“某系统采用周期挪用方式”要能画出时间线CPU访存周期、DMA插入周期交替出现。遇到“某设备要求连续传送”则优先考虑停止CPU访存方式因为周期挪用可能因等待间隙而破坏连续性。5. 考研408里DMA的高频考法与典型陷阱DMA在408里几乎是I/O控制方式中分值最重的点。选择题考概念和计算大题常结合中断、地址计算、总线带宽一起出。历年比如2024年的真题已经把DMA放到更综合的IOCache场景里考了这类题的本质仍然是DMA基本流程与访存冲突分配但题干信息更多更需要把原理吃透。5.1 概念类陷阱状态位、流程顺序与“谁在搬数据”概念类陷阱集中在几个经常被想当然的地方“DMA期间CPU被完全占用”——错。周期挪用方式下CPU大部分时间照常执行程序。“DMA传送结束后不需要中断”——错。后处理阶段CPU必须响应一次中断做收尾。“DMA是软件实现”——错。DMA是硬件控制器预处理和后处理才需要软件配合。“DMA传送的数据要经过CPU寄存器”——错。数据经DMA控制器的DBR不进CPU通用寄存器。“DMA请求中断请求”——本质不同。DMA请求是“请求总线搬数据”在传送过程中多次产生中断请求是“请求CPU处理I/O完成事件”在整块传送完后产生一次。考试里经常把这几种说法排列组合成选项抓住“谁搬数据、搬多大一块、搬完谁收尾、什么时候CPU闲”这四条线基本能排除掉所有错误项。5.2 计算类题型数据率、总线宽度、占用比例计算题的核心是对准“每次DMA传送”和“每块传送”的开销口径。我做一个教学示例参数自己设的不带真题数字但思路是完全一样的假设某外设数据率为200MB/s总线宽度32位总线时钟100MHz。每传送一个32位数据需要1个时钟周期。DMA每次成组连续传送128KB数据完成一块传送后CPU的预处理后处理共需5000个时钟周期。求DMA方式下总线被数据传送和DMA处理器开销占用的时间占比。先算每秒传送次数200MB/s ÷ 128KB/块 1600块/s按1MB1024KB128KB131072B200MB200×1024×1024B除下来约1600。块级开销1600 × 5000 8000000周期/s800万周期/s。数据级传送开销每秒要传的32位数个数 200MB ÷ 4B 50M次/s每个数占1个总线周期所以是50M周期/s。总占用周期 50M 8M 58M周期/s。总线总共100M周期/s占用率58%。也就是说在这样的速率和块大小下系统仍然有约42%的总线余量可用。如果把块降为32KB块数变成4倍块级开销也会变成4倍32M周期/s占用率就会升到82%左右。这就是为什么DMA块大小选得越大CPU和总线I/O开销占比越低。5.3 综合题思路DMA在完整I/O流程中的定位近年大题喜欢把DMA和Cache、中断优先级甚至流水线串起来考。拿到这类题我一般建议在草稿纸上先画两条线一条是CPU执行主线一条是DMA传送线。然后在时间轴上标出“预处理”“多轮数据传送”“后处理中断”三个区段再看题目问的是哪一段的代价。比如题目说“采用DMA从磁盘读入数据到内存完成后触发一次中断”它实际上在描述“数据传送阶段由DMA执行后处理阶段由CPU执行”的完整故事。只要把“CPU时间”和“DMA时间”从流程图上拆开就不会漏算。6. 章节之外的现实从试卷走向STM32与PC内核学408的时候容易产生一种错觉觉得DMA是课本里的“理想模型”。实际上你随便打开一个STM32工程DMA就在那里等你配置PC上还在用IOMMU做DMA防护。理论模型和工程实现的差异恰恰能反过来帮你加深对概念的理解。6.1 单片机里的DMA外设到内存的直接通道在STM32里DMA外设做的事和408教材描述的逻辑几乎完全一致。配置一个USART接收DMA核心参数是DMA_InitTypeDef DMA_InitStructure; // 外设地址串口数据寄存器固定不变 DMA_InitStructure.PeriphBaseAddr (uint32_t)USART1-DR; // 内存地址接收缓冲区可递增 DMA_InitStructure.MemoryBaseAddr (uint32_t)rx_buffer; // 方向外设 - 内存 DMA_InitStructure.Direction DMA_DIR_PeripheralToMemory; // 要接收的数据个数等价于408里的WC初值 DMA_InitStructure.BufferSize 64; // 外设地址不自增内存地址自增 DMA_InitStructure.PeriphInc DMA_PInc_Disable; DMA_InitStructure.MemoryInc DMA_MInc_Enable; // 数据宽度、模式、优先级 DMA_InitStructure.PeriphDataSize DMA_PeripheralDataSize_Byte; DMA_InitStructure.MemoryDataSize DMA_MemoryDataSize_Byte; DMA_InitStructure.Mode DMA_Mode_Circular; // 循环模式 DMA_InitStructure.Priority DMA_Priority_High; DMA_Init(DMA1_Channel5, DMA_InitStructure); DMA_Cmd(DMA1_Channel5, ENABLE);对照着看就很清晰PeriphBaseAddr对应DARMemoryBaseAddr对应MARBufferSize对应WC外设地址不自增对应“DAR不变”内存地址自增对应“MAR自动加1”传输完成中断对应后处理阶段。你在课本上背了半天“MAR、DAR、WC”到这里就是结构体的三个字段而已。我当年就是在STM32上跑了一回UART的DMA接收突然把课本里的抽象图看懂了。6.2 内核DMA保护理论模型在系统安全中的延伸PC上有个常见蓝屏项叫“Driver Verifier DMA Violation”本质就是DMA在绕过CPU运送数据的过程中也绕过了常规的内存权限检查。DMA控制器只认物理地址如果驱动程序配错了缓冲区DMA就可能写到不该写的内存区域。所以现代系统里引入了IOMMUSMMU做DMA重映射DMA发出的地址先过一个“翻译权限检查”的关卡再把物理地址放到总线上。可以理解为给DMA这位“物流主管”加了门禁系统货可以照搬但哪个仓库能搬、哪个不能搬由门禁统一管控。这正好说明DMA不是“免费超能力”它在获得高带宽的同时也需要额外的保护机制来保证安全边界。6.3 我对学DMA的一点体会我个人实际操作中的体会是备考和工程实践别互相割裂。你是考研党不一定要会写STM32代码但哪怕只是看一眼MCU参考手册里的DMA框图书上的MAR、DAR、WC立刻就会具象化。你是嵌入式开发者如果当年没认真学过计组也可以回头翻翻唐朔飞或者王道书里“访存冲突仲裁”的那一页因为MCU里外设什么时候能发DMA请求、什么时候会被总线仲裁卡住书里讲得比芯片手册更直白。DMA这个知识点考试考的是流程对不对、开销算不算得清、概念分不分得开工程上考的是缓冲区配置准不准、总线带宽扛不扛得住、内存保护开没开。两边的底层逻辑是同一个让专用硬件去搬数据CPU只做决策和验收。把这个核心逻辑想明白了408的大题和嵌入式的中断调试都能少走很多弯路。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。