1. 从一道408真题说起DMA到底在考什么如果你正在准备计算机408统考或者本科学到《计算机组成原理》的I/O系统这一章大概率会在选择题里反复遇到DMA相关的题目。尤其是2024年那道第45题把DMA方式和中断方式放在一起对比考的就是“谁在什么时候向CPU要总线”“数据传送的单位是什么”“CPU到底有没有被完全解放”这几个核心点。很多人背了“DMA是直接存储器访问”这句话但一到做题就分不清DMA请求和中断请求的触发时机也搞不明白周期挪用和停止CPU访存这两种方式的区别。这篇文章就是冲着这个痛点来的。我会把DMA方式从“为什么需要它”开始拆一直讲到三种DMA传送方式的时序差异、DMA控制器的内部结构、与中断方式的本质区别以及408考试里常见的出题角度。不管你是考研党、期末突击的本科生还是想从底层理解I/O传送机制的开发者这篇内容都能帮你把DMA这条线彻底理清楚。先给一个最简结论DMA方式的核心价值在于让数据传送过程不经过CPU的寄存器中转由专门的硬件控制器直接在I/O设备和主存之间搬运数据。CPU只需要在传送开始前做初始化传送结束后处理一下收尾工作中间的大批量数据搬运它完全可以不管。这就是为什么磁盘、网卡、显卡这些高速设备都离不开DMA。但“不管”不等于“完全不参与”。DMA控制器要占用总线而总线是CPU和主存通信的公共通道所以DMA和CPU之间必然存在总线争用问题。怎么争、争多久、争的时候CPU怎么办这就是三种DMA传送方式要解决的问题也是408最爱考的地方。2. DMA控制器的内部构造与工作流程拆解2.1 DMA控制器里到底装了哪些寄存器要理解DMA怎么工作先得知道DMA控制器DMAC内部有哪些关键部件。你可以把它想象成一个专门负责搬货的小工他手里必须拿着几张单子才能干活。主存地址寄存器AR记录当前要读写的主存地址。每传送一个数据这个地址会自动加一或减一指向下一个存储单元。初始值由CPU在初始化阶段写入。字计数器WC记录还剩多少个数据要传送。每传送一个数据计数器减一。当计数器减到零时DMA控制器会向CPU发出一个“传送结束”的信号通常表现为中断请求。初始值也是CPU写入的等于要传送的数据块长度。数据缓冲寄存器DR暂时存放每次传送的数据。对于输入方向设备的数据先进入DR再写到主存对于输出方向主存的数据先读到DR再送到设备。设备地址寄存器DAR存放I/O设备的地址或设备号用来选中本次传送的目标设备。控制与状态逻辑包括DMA请求触发器、中断机构、控制电路等。它负责接收设备的DMA请求向CPU发出总线请求信号在获得总线控制权后产生读写命令和地址选通信号控制整个传送过程。中断机构当字计数器归零时向CPU发出中断请求通知CPU“这批数据搬完了你可以来做收尾了”。这几部分协同工作的流程用一句话概括就是CPU初始化参数设备发出请求DMAC向CPU申请总线拿到总线后直接在设备和主存之间搬数据搬完后通过中断通知CPU。2.2 一次完整的DMA传送经历了什么我把一次DMA传送的完整过程拆成三个阶段这样你在做题时能清楚地知道每个阶段谁在控制总线。第一阶段预处理阶段。CPU执行几条I/O指令把主存起始地址写入AR把传送字数写入WC把设备地址写入DAR把传送方向读还是写和控制信息写入控制寄存器。然后CPU启动设备继续执行主程序。这个阶段CPU是主动的但它只做了参数配置没有搬运任何数据。第二阶段数据传送阶段。I/O设备准备好一个数据后向DMAC发出DMA请求。DMAC向CPU发出总线请求BRCPU在当前总线周期结束后释放总线发出总线允许信号BG。DMAC获得总线控制权后向设备发出读写命令同时把AR中的地址送到地址总线完成一个数据在设备和主存之间的直接传送。每传送一个数据AR加一WC减一。这个阶段完全由DMAC控制总线CPU不能访存。第三阶段后处理阶段。当WC减到零时DMAC向CPU发出中断请求。CPU响应中断后执行中断服务程序检查传送是否出错处理善后工作然后继续原来的程序。这个阶段CPU重新拿回总线控制权。注意DMA方式下CPU并没有完全“闲着”。预处理和后处理都需要CPU参与只是中间大批量数据搬运不需要CPU介入。408选择题经常在这里设陷阱说“DMA方式下CPU完全不参与I/O过程”这是错的。2.3 DMA请求和中断请求的本质区别很多人分不清DMA请求和中断请求其实它们解决的是完全不同的问题。中断请求是设备告诉CPU“我有一件事需要你处理”比如键盘按下了、磁盘读完了一个扇区需要CPU来取数据。中断请求的响应发生在一条指令执行完毕之后CPU需要保存现场、跳转到中断服务程序、执行指令来搬运数据。数据传送必须经过CPU的寄存器。DMA请求是设备告诉DMAC“我准备好了一个数据你可以来搬了”。DMAC再向CPU申请总线。DMA请求的响应发生在总线周期结束时不需要CPU执行任何指令来搬运数据数据直接在设备和主存之间流动。用一个生活类比中断方式就像你每次收快递都要亲自下楼去拿拿上来还要拆开放到指定位置DMA方式就像你雇了一个搬运工快递到了他直接帮你搬到仓库你只需要告诉他仓库地址和一共几件货搬完了他会通知你一声。这个区别直接决定了两种方式的适用场景中断方式适合低速、少量、随机出现的I/O请求DMA方式适合高速、大批量、连续的数据块传送。3. 三种DMA传送方式CPU到底什么时候让出总线这是408考试的核心考点也是实际硬件设计中最关键的取舍。三种方式分别是停止CPU访存、周期挪用也叫周期窃取、交替访问。它们的区别本质上是“DMAC和CPU怎么分时使用总线”的问题。3.1 停止CPU访存方式简单粗暴但浪费严重这种方式下当DMAC需要传送数据时它向CPU发出一个停止信号CPU收到后完全放弃总线控制权把总线让给DMAC。DMAC可以连续不断地传送整个数据块直到全部传完才把总线还给CPU。优点控制简单DMAC不需要复杂的时序逻辑数据传送速率很高因为DMAC可以独占总线连续工作。缺点CPU在DMA传送期间完全不能访存如果数据块很大CPU会被“冻结”很长时间。实际上CPU在此期间只能做一些不需要访存的操作比如执行寄存器之间的运算但现代程序几乎每几条指令就要访存所以CPU实际上处于停滞状态。适用场景数据块传送速率极高、CPU在此期间确实没有紧急访存需求的场合。实际中很少单独使用因为浪费太严重。从408出题角度看这种方式的关键特征是DMAC独占总线CPU在传送期间无法访存传送结束后CPU才恢复。题目可能会问“这种方式下CPU是否参与传送”答案是CPU不参与数据搬运但被强制暂停访存。3.2 周期挪用方式像“插空”一样抢总线周期挪用Cycle Stealing是目前实际系统中最常用的方式。它的核心思想是DMAC每次只申请一个总线周期传送一个数据后就释放总线CPU可以继续访存。如果下一个数据准备好了DMAC再申请下一个总线周期。这里有一个关键的优先级问题当DMAC和CPU同时请求访存时谁的优先级更高答案是DMAC的优先级更高。因为I/O设备的数据传送有严格的时间要求如果数据没有及时取走可能会被后续数据覆盖导致丢失。而CPU的访存请求可以推迟一两个周期对程序执行影响很小。周期挪用方式下DMAC的请求可能遇到两种情况第一种CPU正在执行不需要访存的指令比如寄存器运算DMAC可以直接获得总线不影响CPU。第二种CPU正在访存DMAC需要等待当前总线周期结束后才能获得总线这会“挪用”一个或几个CPU的访存周期。优点既满足了I/O设备的数据传送需求又让CPU在DMAC不传送数据的间隙正常访存总线利用率高。缺点DMAC每传送一个数据都要走一遍“请求-授权-传送-释放”的流程控制逻辑比停止CPU方式复杂。另外每次挪用都会让CPU的指令执行延长一个或几个周期虽然单次影响小但大量传送时累积起来也会降低CPU效率。适用场景绝大多数实际系统包括早期的磁盘控制器、网卡等。408考试中周期挪用方式最爱考的点是DMAC和CPU争用总线的优先级、每次传送的数据量一个数据、对CPU的影响延长访存周期但不停止程序执行。3.3 交替访问方式把总线时间切片交替访问方式也叫透明DMA的设计思路更巧妙它把总线时间固定地分成两个交替的时段一个时段给CPU访存一个时段给DMAC传送数据。两者像火车时刻表一样轮流使用总线互不干扰。这种方式下DMAC不需要向CPU申请总线也不需要CPU发出总线允许信号。它只需要在属于自己的时间片到来时直接使用总线即可。CPU甚至感觉不到DMAC的存在因为它的访存时间片是固定的不会被DMAC打乱。优点CPU和DMAC都不需要等待对方总线利用率达到最高控制逻辑也相对规整。缺点对CPU的访存时间有额外要求需要CPU的存取周期大于DMAC传送一个数据所需的时间这样才能在CPU的存取周期内插入DMAC的访存时段。如果CPU本身很快存取周期很短这种方式就不太适用。另外如果DMAC没有数据要传送它的时间片就浪费了。适用场景CPU存取周期较长、I/O设备传送速率较高的系统。实际中不如周期挪用方式常见。三种方式的对比总结对比维度停止CPU访存周期挪用交替访问总线控制权DMAC独占每次一个周期固定时间片交替CPU是否停止访存完全停止仅被挪用周期不受影响数据传送速率最高较高较高控制复杂度最简单较复杂中等总线利用率低高最高实际使用频率很少最常用较少4. DMA方式与中断方式的对比408选择题的高频陷阱4.1 从数据传送路径看本质差异中断方式下数据传送的路径是设备 → CPU寄存器 → 主存。设备准备好数据后向CPU发中断请求CPU响应中断后执行中断服务程序用指令把设备数据读入CPU寄存器再从寄存器写入主存。每传送一个数据都需要CPU执行若干条指令。DMA方式下数据传送的路径是设备 → DMAC → 主存或反向。数据不经过CPU寄存器由硬件直接搬运。CPU只在开始和结束时参与。这个差异带来几个直接后果第一DMA的传送速率远高于中断方式因为不受CPU指令执行速度的限制第二DMA方式下CPU的寄存器不需要保存和恢复因为没有中断服务程序来搬运数据第三DMA方式需要额外的硬件DMAC成本更高。4.2 响应时机和优先级的区别中断请求的响应时机是当前指令执行结束后CPU检查中断请求如果有则响应。这意味着中断响应至少延迟一条指令的时间。DMA请求的响应时机是当前总线周期结束后CPU释放总线。DMA请求的优先级高于中断请求因为DMA请求对应的是数据传送的硬实时需求如果延迟可能导致数据丢失。在408题目中经常出现这样的选项“DMA请求的响应发生在一条指令执行结束后”——这是错的DMA请求发生在总线周期结束后。“中断请求的响应发生在一条指令执行结束后”——这是对的。4.3 中断方式能处理异常事件DMA不能这是两者功能定位的根本区别。中断方式不仅能用于数据传送还能处理各种异常事件比如除零错误、缺页异常、设备故障等。中断服务程序可以根据不同的中断源执行不同的处理逻辑。DMA方式只负责数据搬运它不能处理异常事件。如果传送过程中出现错误比如设备故障DMAC通常只能记录错误状态然后通过中断通知CPU来处理。也就是说DMA方式在出错时仍然需要借助中断机制来通知CPU。408常见陷阱说“DMA方式可以处理所有I/O操作不需要中断方式”——这是错的。DMA只负责数据传送异常处理、控制命令的发送、状态检查等仍然需要CPU通过中断方式或程序查询方式来完成。4.4 优先级和屏蔽问题在中断系统中每个中断源有优先级高优先级中断可以打断低优先级中断。DMA请求也有优先级而且通常高于所有中断请求。但DMA请求不能被中断请求打断因为DMAC一旦获得总线就会完成当前数据传送。另外DMA传送期间CPU不能响应中断吗实际上CPU在DMA传送期间如果收到中断请求它可以在DMAC释放总线的间隙响应中断。但中断服务程序中如果也要访存就需要和DMAC争用总线。所以实际系统中DMA传送期间通常会屏蔽某些中断或者中断服务程序尽量不访存。5. 408考场上的DMA典型题型与解题思路5.1 概念辨析题抓住“谁控制总线”这条主线这类题目通常给出几个关于DMA和中断的陈述让你判断正误。解题的关键是抓住“谁控制总线”和“数据经不经过CPU”这两条主线。比如这样一道题“在DMA方式中数据传送方向由CPU控制数据传送过程由DMAC控制。”前半句对后半句对。CPU在预处理阶段设置传送方向DMAC在传送阶段控制具体的数据流动。再比如“DMA方式下CPU和DMAC不能同时访存。”这个说法在停止CPU访存和周期挪用方式下是对的但在交替访问方式下CPU和DMAC是分时使用总线的严格来说也不能同时访存只是时间片交替。所以这个说法基本正确但要注意交替访问的特殊性。5.2 时序分析题画出总线使用时间轴这类题目给出CPU的存取周期、DMAC传送一个数据所需的时间、数据块大小等参数让你计算DMA传送对CPU执行时间的影响。解题步骤通常是第一确定使用哪种DMA传送方式第二计算DMAC传送整个数据块需要多少个总线周期第三根据方式不同计算CPU被暂停或挪用的周期数第四把这段时间加到CPU原本的执行时间上。以周期挪用方式为例假设CPU存取周期为100nsDMAC传送一个数据需要一个存取周期数据块大小为1000个数据。那么DMAC需要挪用1000个CPU存取周期总共100000ns。如果CPU原本执行这段程序需要1ms那么加上DMA传送后变成1.1ms。如果是停止CPU访存方式DMAC连续传送1000个数据每个数据需要一个存取周期总共也是100000ns但CPU在这段时间完全停止影响和周期挪用方式在总量上相同但分布不同。周期挪用是分散影响停止CPU是集中影响。5.3 硬件设计题DMAC的寄存器配置和信号连接这类题目可能要求你画出DMAC与CPU、主存、设备之间的连接图或者说明DMAC需要哪些寄存器、每个寄存器的作用。核心连接包括DMAC与CPU之间的总线请求线BR和总线允许线BGDMAC与主存之间的地址总线、数据总线和读写控制线DMAC与设备之间的DMA请求线和DMA允许线。寄存器配置方面必须能说清楚AR、WC、DR、DAR各自的作用和初始化时机。408考试中这类题目通常以选择题形式出现问“哪个寄存器用于存放传送字数”答案是WC。5.4 综合题DMA与中断的配合使用实际系统中DMA和中断经常配合使用。比如磁盘读操作CPU先通过程序查询或中断方式向磁盘控制器发送读命令和参数磁盘控制器准备好数据后通过DMA方式把数据传送到主存传送完成后通过中断通知CPU。CPU在中断服务程序中检查传送结果然后唤醒等待该数据的进程。408综合题可能会让你描述这个过程或者分析其中DMA和中断各自的作用。答题时要明确命令发送和状态检查用中断或程序查询数据传送用DMA传送结束通知用中断。6. 从408到实际系统DMA在现代硬件中的影子6.1 磁盘控制器中的DMA机械硬盘和固态硬盘的控制器都支持DMA方式。操作系统在发起磁盘读操作时会构造一个DMA描述符包含主存缓冲区地址、传送长度、传送方向等信息然后写入磁盘控制器的DMA寄存器。磁盘控制器完成数据读取后通过DMA直接把数据写入主存最后发中断通知CPU。这种方式下CPU不需要逐字节地从磁盘控制器读取数据大大降低了CPU占用率。如果没有DMA磁盘读操作会消耗大量CPU时间在数据搬运上系统响应速度会急剧下降。6.2 网络接口卡中的DMA网卡接收数据包时也是通过DMA把数据包写入主存中的接收缓冲区。现代网卡通常支持多队列DMA每个队列对应一个CPU核心这样可以实现网络数据的并行处理减少单个CPU核心的负担。网卡的DMA描述符环是一个经典设计驱动程序在主存中维护一个描述符数组每个描述符指向一个数据缓冲区。网卡通过DMA读取描述符把数据写入对应的缓冲区然后更新描述符状态。驱动程序通过轮询或中断方式检查描述符状态处理已接收的数据包。6.3 显卡中的DMA显卡与主存之间的数据传送也大量使用DMA。比如纹理数据从主存传送到显存或者渲染结果从显存传送到主存。显卡的DMA引擎通常支持高带宽传送因为图形数据量非常大。在现代系统中显卡通常通过PCIe总线与CPU和主存连接PCIe总线本身就支持DMA操作。显卡的DMA引擎可以直接访问主存不需要CPU介入。6.4 DMA在嵌入式系统中的应用在STM32等嵌入式微控制器中DMA是一个非常重要的外设。比如ADC多通道采集时可以用DMA把ADC转换结果自动搬运到内存数组CPU不需要在每次转换完成后读取ADC数据寄存器。串口通信中也可以用DMA发送和接收数据减少CPU中断次数。STM32的DMA控制器通常有多个通道每个通道可以配置不同的外设和内存地址、传送方向、数据宽度、传送模式单次或循环。配置好之后DMA自动工作CPU可以去做其他事情。传送完成或出错时DMA可以产生中断通知CPU。如果你学过STM32的DMA配置再回头看408的DMA原理会发现两者完全对应AR对应外设地址和内存地址寄存器WC对应数据长度寄存器控制逻辑对应DMA配置寄存器。408讲的是原理STM32讲的是具体实现。7. 几个容易混淆的细节和踩坑提醒7.1 DMA传送的“数据块”到底有多大408题目中经常说“DMA传送一个数据块”这个数据块的大小由WC决定。但要注意DMA传送的基本单位是一个数据可能是字节、半字或字而不是整个数据块。DMAC每传送一个数据AR和WC更新一次。整个数据块传送完毕后WC归零产生中断。有些题目会问“DMA传送过程中每传送一个数据需要几个总线周期”答案是通常一个总线周期但具体取决于数据宽度和总线宽度。如果数据宽度小于总线宽度可能一个总线周期能传送多个数据如果数据宽度大于总线宽度可能需要多个总线周期。7.2 DMA请求和总线请求不是一回事DMA请求是设备发给DMAC的表示“我准备好了一个数据”。总线请求是DMAC发给CPU的表示“我要用总线”。两者发生在不同层级不要混淆。在周期挪用方式下设备每准备好一个数据就发一次DMA请求DMAC每收到一个DMA请求就发一次总线请求。在停止CPU访存方式下DMAC可能在收到第一个DMA请求后就一直占用总线直到整个数据块传送完毕。7.3 DMA传送期间CPU能不能响应中断这个问题要分情况。在停止CPU访存方式下CPU完全放弃总线但它仍然可以响应中断只是中断服务程序中如果涉及访存操作需要等待DMAC释放总线。在周期挪用方式下CPU在DMAC不占用总线的间隙可以正常响应中断和访存。实际系统中DMA传送期间通常会设置中断屏蔽或者中断服务程序尽量不访存以避免总线争用导致的复杂性。7.4 DMA控制器的优先级高于CPU吗在总线争用中DMAC的优先级高于CPU。这是因为I/O设备的数据传送有硬实时要求如果数据没有及时取走可能会被覆盖或丢失。而CPU的访存请求可以推迟一两个周期对程序执行影响很小。但DMAC的优先级高于CPU并不意味着DMAC可以无限期占用总线。在周期挪用方式下DMAC每次只占用一个总线周期然后释放总线给CPU访存的机会。这样既保证了I/O设备的实时性又不会让CPU饿死。7.5 408真题中的DMA考点分布从历年408真题来看DMA相关题目主要分布在选择题中偶尔出现在综合题中。高频考点包括DMA与中断的区别、三种DMA传送方式的特点、DMAC的寄存器作用、DMA请求的响应时机、DMA传送对CPU执行时间的影响。2024年第45题考的是DMA和中断在数据传送路径上的区别以及DMA请求和中断请求的响应时机。这道题的正确率不高很多考生在“DMA请求发生在总线周期结束后”这个点上出错。备考建议把DMA方式与中断方式、程序查询方式放在一起对比记忆抓住“谁控制总线”“数据经不经过CPU”“响应时机”“优先级”这四个维度基本就能覆盖所有考题。8. 把DMA学透之后再看I/O系统的整体图景学完DMA你应该能把三种I/O控制方式串起来程序查询方式下CPU不断轮询设备状态数据传送完全由CPU控制中断方式下设备主动通知CPUCPU执行中断服务程序搬运数据DMA方式下DMAC直接在设备和主存之间搬运数据CPU只做初始化和收尾。这三种方式没有绝对的优劣而是适用于不同的场景。程序查询方式最简单但CPU利用率最低适合非常简单的嵌入式系统中断方式适合低速、随机出现的I/O请求DMA方式适合高速、大批量的数据传送。在实际系统中这三种方式经常混合使用。比如一个磁盘读操作CPU可能先用程序查询方式检查磁盘控制器是否空闲然后用中断方式发送读命令最后用DMA方式传送数据传送完成后通过中断通知CPU。理解每种方式的适用场景和配合方式比单纯背诵定义更有价值。如果你正在准备408建议把DMA这一章的复习重点放在三种传送方式的时序对比和DMA与中断的区别上。这两块内容几乎每年必考而且容易出综合题。把DMAC的寄存器作用和初始化流程也记清楚选择题里经常考“哪个寄存器存放传送字数”这种细节。最后分享一个我自己的复习方法拿一张纸画出DMAC与CPU、主存、设备的连接图标出每根信号线的作用然后分别画出三种DMA传送方式的总线使用时间轴。画完之后你对DMA的理解会比单纯看书深得多。408考场上遇到DMA题目你脑子里会自动浮现出那张时间轴选项对错一目了然。