☰
DMA方式深度拆解:从总线占用到408真题考点全解析
2026/9/28 1:14:27 网站建设 项目流程

DMA这三个字母,如果你正在啃408的计算机组成原理,大概率已经在输入输出系统那一章被它绊过一跤。教材上给的定义很干脆——直接存储器存取,数据在内存和外设之间搬运时不经过CPU。但真到了做题,尤其是24年45题那种综合考查方式与中断、程序查询对比的题目,很多人还是会卡在"到底谁在控制总线""周期挪用和停止CPU访存差在哪""为什么DMA传送结束还需要中断"这几个点上。这篇内容就是围绕DMA方式做一次彻底的拆解,从为什么需要它、它怎么抢总线、三种时序方案的取舍,到和中断方式的本质区别,再到408真题里反复出现的考查角度,尽量把每一个容易含糊的地方都讲透。不管你是第一遍学、第二遍刷题,还是已经进入冲刺阶段想查漏补缺,都能从这里找到可以直接用的分析框架和记忆抓手。

1. 为什么程序查询和中断方式撑不起高速外设

要理解DMA存在的意义,得先看清楚它前面两种方式的硬伤。408教材把I/O设备与主机之间的信息传送控制方式分成四类:程序查询、程序中断、DMA、通道。前两种本质上都是"CPU亲自参与每一次数据搬运",区别只在于CPU是主动轮询还是被动响应。这个区别在低速场景下够用,但一旦外设速度上来,问题就暴露得非常彻底。

1.1 程序查询方式的CPU利用率陷阱

程序查询方式的工作逻辑很直白:CPU不断读取设备状态寄存器,判断设备是否就绪,就绪了就传一个数据,然后继续循环。它的优点是硬件结构极其简单,几乎不需要额外的控制逻辑,一个状态端口加一个数据端口就能跑起来。但代价是CPU被完全绑死在轮询循环里。

假设一个外设的数据传输率是每秒传送N个字节,CPU每轮询一次加传送一个字节需要消耗k个时钟周期,那么CPU为了维持这个外设的数据流,每秒至少要花N×k个周期在轮询上。如果外设速度很慢,比如键盘,这个开销可以忽略;但如果换成磁盘或者高速网卡,N大到一定程度,CPU基本就没有余力干别的了。这就是程序查询最致命的地方——CPU的时间被大量浪费在"等待"和"确认"上,而不是真正的计算任务。

从408考试的角度,程序查询方式常考的接口电路组成包括:数据缓冲寄存器、状态寄存器、设备选择电路、命令译码电路。数据传送时CPU需要执行一条输入或输出指令,把数据从缓冲寄存器读到通用寄存器,再写入内存,或者反过来。整个过程CPU全程在场,每一步都要它亲自执行指令。

1.2 中断方式解决了等待,但没解决搬运

中断方式往前迈了一大步。CPU不再傻等,而是发完I/O命令后继续执行主程序,设备准备好数据后主动发中断请求,CPU响应中断,暂停当前程序,转去执行中断服务程序完成数据传送,然后再返回。这样CPU在设备准备数据的那段时间里可以干别的事,利用率明显提升。

但问题在于,中断方式下每一次数据传送仍然需要CPU执行指令来完成。设备每准备好一个数据(或者一小批数据),就要打断CPU一次,CPU要保存现场、跳转服务程序、执行传送指令、恢复现场。这个过程的指令开销是固定的,数据量越大,中断次数越多,CPU花在"进出中断"上的时间就越可观。

更关键的是,中断服务程序里传送数据这个动作本身,还是CPU在执行指令。也就是说,数据从外设到内存这条路径,物理上可以走总线直接传,但控制这条路径的每一步——读缓冲、写内存、修改地址指针、计数减一——都是CPU在跑指令。对于磁盘这种一次要传几百上千字节的设备,如果每个字节都中断一次,CPU的开销会大到不可接受。所以实际系统中中断方式通常配合数据缓冲,一次中断传一批数据,但即便如此,CPU的指令开销仍然和传送次数成正比。

1.3 DMA要解决的核心矛盾

把上面两条捋清楚,DMA要解决的核心矛盾就浮出水面了:数据传送的控制权能不能从CPU手里拿走,交给一个专门的硬件控制器?

DMA的思路是,在内存和外设之间架一条直接通道,由DMA控制器(DMAC)来接管总线和地址、计数等控制信号,数据直接在内存和外设之间流动,CPU只在传送开始前做初始化(告诉DMAC源地址、目的地址、传送长度、方向),传送结束后收个尾(处理完成中断)。传送过程中CPU完全不参与,可以继续执行自己的程序。

这就带来一个本质变化:数据传送不再消耗CPU指令,而是消耗总线周期。CPU和DMAC共享内存总线,谁需要用谁申请。这个"抢总线"的机制,正是DMA最核心也最容易考的地方。

注意:DMA方式并不是完全不需要CPU,它需要CPU做初始化,也需要CPU在传送结束后响应中断做善后。但传送过程中的每一个字节,CPU确实不碰。

2. DMA控制器的内部结构与总线接管逻辑

很多人学DMA只记了个"不经过CPU",但408的题目经常往DMAC内部结构上挖,比如问你地址寄存器的作用、计数器什么时候减、命令/状态寄存器都存什么。这些细节不搞清楚,选择题很容易在两个看起来都对的选项之间摇摆。

2.1 DMAC里到底有哪些寄存器

一个典型的DMA控制器内部包含以下几类寄存器,每一类都有明确的职责:

  • 内存地址寄存器(AR):存放数据在内存中的起始地址。传送过程中每传一个数据,这个寄存器自动加一(或减一),指向下一个内存单元。注意它是"自动"修改的,不需要CPU干预,这是DMA能脱离CPU的关键之一。
  • 字计数器(WC):存放本次要传送的数据个数。每传一个数据自动减一,减到零时表示传送完成,触发中断。这个计数器决定了DMA传送的边界。
  • 设备地址寄存器(或I/O端口寄存器):存放外设的接口地址,指明数据从哪个设备来或往哪个设备去。
  • 命令/状态寄存器(CR/SR):命令寄存器存放CPU发来的控制信息,比如传送方向(读/写)、是否启动、工作模式等;状态寄存器反映DMAC当前的工作状态,比如是否正在传送、是否出错、是否完成。
  • 数据缓冲寄存器:暂存一次传送的数据,起缓冲和同步作用。

这组寄存器的存在,是DMA能够"自主"完成传送的物质基础。CPU初始化时把起始地址、传送长度、方向写进去,剩下的加减、判断、申请总线,全由DMAC的硬件逻辑完成。

2.2 DMA的三种总线占用方式

DMAC要传数据,必须占用内存总线。但总线是CPU和DMAC共享的,怎么分配使用时间,直接决定了DMA对CPU的影响程度。408教材里讲了三种方式,每一种的取舍逻辑都值得掰开说。

停止CPU访存方式:DMAC一旦获得总线控制权,就独占总线直到整批数据传完,期间CPU完全不能访存。这种方式控制简单,数据传送率最高,因为不需要反复申请释放总线。但缺点是CPU在传送期间被完全"冻结",如果传送的数据量很大,CPU的停顿时间会很长,影响主程序执行。它适合数据块很大、传送速度要求极高的场景。

周期挪用方式(也叫周期窃取):DMAC每次只占用一个或几个总线周期来传一个数据,传完立刻把总线还给CPU。当CPU和DMAC同时请求访存时,DMAC的优先级更高,CPU让出一个周期。这种方式对CPU的影响小,CPU只是在个别周期被"偷走",整体程序执行基本不受影响。缺点是DMAC需要频繁申请和释放总线,控制逻辑相对复杂,而且每个数据的传送都可能插入等待。它是实际系统中最常用的方式。

DMA与CPU交替访存方式:把总线时间分成固定长度的时隙,一部分给CPU,一部分给DMAC,两者交替使用,互不干扰。这种方式不需要总线申请和仲裁,控制简单,但要求CPU的访存周期和DMA的传送周期有固定的比例关系,灵活性差,实际中用得不多。

方式总线占用对CPU影响控制复杂度适用场景
停止CPU访存整批独占大,CPU完全停顿低大数据块、高速传送
周期挪用单周期占用小,个别周期被占中通用场景,最常用
交替访存固定时隙交替可预测,无仲裁低但灵活性差时序固定的特定系统

2.3 周期挪用里那个容易被忽略的细节

周期挪用方式有个细节,408选择题考过不止一次:当CPU正在使用总线执行一个访存周期时,DMAC的请求要等到这个周期结束才能被响应,不能打断CPU正在进行的访存。也就是说,DMAC偷的是"下一个"空闲的总线周期,而不是当前正在用的。

这个细节决定了周期挪用对CPU的影响是"插入等待周期"而不是"打断当前操作"。CPU执行一条指令可能包含多个机器周期,其中只有访存的那几个机器周期才可能被DMAC挪用。如果CPU当前执行的是不需要访存的指令(比如寄存器间的运算),DMAC可以更顺畅地拿到总线。

理解这一点,对分析"周期挪用方式下CPU执行一条指令的时间会不会变长"这类问题很关键。答案是:如果这条指令涉及访存,且恰好和DMAC的请求冲突,那么指令执行时间会延长一个或几个总线周期;如果不涉及访存,则基本不受影响。

3. DMA传送的完整流程与中断收尾

DMA传送不是"启动了就完事",它有一个完整的生命周期:预处理、数据传送、后处理。三个阶段里,CPU的角色完全不同,考试也经常针对每个阶段设问。

3.1 预处理阶段CPU做了什么

预处理阶段是CPU唯一深度参与的阶段。CPU需要完成以下动作:

  1. 测试设备状态,确认外设就绪;
  2. 向DMAC的命令寄存器写入控制字,设定传送方向(是设备到内存还是内存到设备)、工作方式等;
  3. 向内存地址寄存器写入数据在内存中的起始地址;
  4. 向字计数器写入本次传送的数据个数;
  5. 向设备地址寄存器写入外设接口地址;
  6. 启动DMAC,之后CPU就可以去执行别的程序了。

这一阶段的关键在于,CPU把"要传什么、从哪传到哪、传多少"这些信息一次性交代清楚,之后就不再过问。这就像你给快递员一个地址和一堆包裹,剩下的揽收、运输、派送他自己搞定,你该干嘛干嘛。

3.2 数据传送阶段谁在控制

数据传送阶段完全由DMAC控制。DMAC按照预设的方向,从外设读数据写入内存,或从内存读数据写入外设。每传一个数据,内存地址寄存器自动加一,字计数器自动减一。当字计数器减到零时,DMAC知道这批数据传完了,于是向CPU发出中断请求。

这个阶段有几个常考的点:

  • 数据不经过CPU的通用寄存器,直接在内存和外设之间流动;
  • 地址的修改和计数的递减由硬件自动完成,不需要执行指令;
  • DMAC需要申请总线,具体采用哪种总线占用方式取决于系统设计;
  • 传送过程中如果出现错误(比如设备故障),DMAC会在状态寄存器里置位,并在中断时报告。

3.3 后处理阶段为什么还要中断

很多人会问:既然DMA已经脱离CPU了,为什么传送结束还要发中断?直接让CPU过一段时间来查状态不行吗?

答案是:中断是为了让CPU知道"这批数据传完了,你可以进行下一步处理了"。比如磁盘读操作完成后,CPU需要校验数据、唤醒等待该数据的进程、决定是否发起下一次DMA传送。如果不用中断而用查询,CPU就得周期性地来检查DMAC状态,这又回到了程序查询的老路,失去了DMA的意义。

所以DMA方式的中断和程序中断方式的中断,作用完全不同:程序中断方式的中断是"每个数据(或每批数据)都要打断CPU来传送",中断本身就是传送手段;DMA方式的中断是"传送已经由DMAC完成了,中断只是通知CPU来做善后",中断是完成通知,不是传送手段。这个区别是408选择题的高频考点。

提示:DMA传送结束后,CPU响应中断,执行中断服务程序,主要工作是校验数据是否正确、处理传送过程中记录的错误、修改相关数据结构、启动下一次传送或唤醒等待进程。它不负责搬运数据本身。

4. DMA与中断方式的本质区别,以及408怎么考

把DMA和中断方式放在一起对比,是408这一章的经典考法。两者都涉及"中断",但中断在两种方式里的地位截然不同。理清这个区别,很多题目就能一眼看穿。

4.1 从数据传送的控制权看区别

中断方式下,数据传送的控制权在CPU手里。设备准备好数据后发中断,CPU响应,执行中断服务程序,在服务程序里用指令把数据从设备缓冲读到内存。每一次传送都需要CPU执行指令,中断是传送的触发信号,也是传送过程的一部分。

DMA方式下,数据传送的控制权在DMAC手里。CPU只做初始化和善后,传送过程由DMAC的硬件逻辑完成。中断只在整批数据传完后发生一次,作用是通知CPU善后,而不是触发每一次数据搬运。

这个区别可以用一句话概括:中断方式是CPU用指令搬数据,DMA方式是DMAC用硬件搬数据。前者消耗CPU指令周期,后者消耗总线周期。

4.2 从优先级和响应时机看区别

DMA请求的优先级通常高于中断请求。原因很简单:DMA请求对应的是数据传送,如果得不到及时响应,数据可能丢失(比如外设缓冲溢出);而中断请求对应的是CPU对事件的善后处理,稍微延迟一般不会造成数据丢失。所以在总线仲裁中,DMAC的优先级被设得更高。

响应时机上,中断请求通常在一条指令执行完毕后被响应(因为要保存现场,需要在指令边界进行);DMA请求则可以在一个总线周期结束时被响应,粒度更细。这也是DMA能高效利用总线的原因之一。

4.3 408真题里的典型考法

24年45题那种综合题,往往会把DMA、中断、程序查询放在一起,让你判断某种场景下应该用哪种方式,或者计算某种方式下的时间开销。常见的考法包括:

  • 给出外设传输率和数据块大小,问用程序查询、中断、DMA分别需要多少时间,或者CPU占用率是多少;
  • 问DMA传送过程中CPU能否响应中断,答案是能,因为DMA占用的是总线,不是CPU;
  • 问DMA传送结束后CPU如何知道,答案是DMAC发中断;
  • 问周期挪用方式下CPU访存和DMA访存冲突时谁优先,答案是DMA优先;
  • 问DMAC中的地址寄存器和计数器由谁修改,答案是硬件自动修改,不需要CPU执行指令。

这些题目看似零散,但背后都是同一个知识框架:谁控制传送、谁占用总线、中断在哪个环节起作用。把这个框架建起来,题目怎么变都不怕。

对比维度程序查询程序中断DMA
数据传送控制者CPUCPUDMAC
CPU参与程度全程轮询每次传送都参与仅初始化和善后
中断的作用无触发每次传送通知整批完成
优先级无较低较高
适用场景低速、简单中低速、随机高速、大批量
消耗资源CPU时间CPU指令周期总线周期

5. 学DMA时最容易含糊的几个问题

这一章专门收拢那些"看教材觉得懂了,一做题就犹豫"的点。这些都是我在反复刷题和给别人讲题时,发现大家最容易卡住的地方。

5.1 DMA传送时CPU到底能不能访存

这个问题要分总线占用方式回答。停止CPU访存方式下,DMAC独占总线,CPU不能访存;周期挪用方式下,DMAC只占用个别周期,CPU在其余周期可以正常访存;交替访存方式下,CPU在分配给它的时隙里可以访存。所以笼统地说"CPU不能访存"是错的,关键看采用哪种方式。

但有一点是确定的:无论哪种方式,CPU都可以继续执行不需要访存的指令,也可以响应中断(如果中断优先级高于当前程序)。DMA占用的是内存总线,不是CPU本身。

5.2 字计数器减到零之后发生了什么

字计数器减到零,表示预定数量的数据已经全部传送完毕。此时DMAC会做两件事:一是停止申请总线,释放总线控制权;二是在状态寄存器中置"完成"标志,并向CPU发出中断请求。CPU响应中断后,读取状态寄存器确认完成,然后进行善后处理。

注意,计数器减到零这个动作是硬件自动完成的,不需要CPU执行比较指令。这也是DMA效率高的原因之一——连"判断是否传完"这件事都由硬件做了。

5.3 DMA方式下数据经过CPU的寄存器吗

不经过。这是DMA和中断方式最直观的区别。中断方式下,数据从外设缓冲寄存器读到CPU通用寄存器,再从通用寄存器写到内存,中间要过CPU的手。DMA方式下,数据通过系统总线直接在内存和外设之间流动,CPU的通用寄存器完全不参与。

这个区别也解释了为什么DMA适合大批量数据传送:数据不经过CPU,就不占用CPU的寄存器资源,也不消耗执行指令的时间,传送速度只受内存和外设本身速度以及总线带宽的限制。

5.4 DMA和通道有什么区别

408教材在DMA之后还会讲通道,两者容易混。简单说,DMA控制器管理的是"一台或几台设备与内存之间的数据传送",它一次只能控制一台设备(或少数几台)的传送;通道则是一个更强的I/O处理器,它能执行通道程序,控制多台设备并行工作,功能更接近一个小型CPU。

从控制方式看,DMA是"硬件直接控制传送",通道是"通道程序控制传送"。通道的智能化程度更高,但硬件也更复杂。在408的考查里,通道通常只考概念和与DMA的对比,不会深入到通道程序的细节。

6. 把DMA放进整章知识网络里记

孤立地记DMA,很容易忘;把它放进"输入输出系统"这一章的整体框架里,记忆会牢固得多。这一章的主线其实是"CPU如何越来越从I/O中脱身":程序查询是CPU全程盯着,中断是CPU只在数据来时动手,DMA是CPU只做开头结尾,通道是CPU几乎完全放手。沿着这条"脱身"主线,四种方式的演进逻辑就非常清晰了。

6.1 四种方式的演进逻辑

  • 程序查询:CPU主动轮询,设备被动响应。CPU利用率最低,硬件最简单。
  • 程序中断:设备主动通知,CPU被动响应。CPU利用率提升,但每次传送仍需CPU执行指令。
  • DMA:DMAC主动搬运,CPU只做初始化和善后。CPU从数据搬运中解放,但每次传送仍需CPU初始化。
  • 通道:通道程序控制,CPU只需发出I/O指令启动通道。CPU从I/O控制中进一步解放。

这条演进线的驱动力,是外设速度的不断提升和对CPU利用率要求的不断提高。理解了驱动力,就理解了为什么会有这些方式,以及它们各自适合什么场景。

6.2 和存储器、总线章节的交叉点

DMA和存储器章节的交叉点在于:DMA传送会占用内存的访问带宽,如果DMA传送过于频繁,会影响CPU的访存效率。在多核或高并发场景下,这个影响需要被认真评估。

DMA和总线章节的交叉点在于:DMA的总线占用方式、总线仲裁、总线优先级,都是总线章节的内容。408喜欢把DMA和总线仲裁放在一起考,比如问"当CPU和DMAC同时请求总线时,仲裁器如何决定谁先使用"。答案通常是DMA优先级更高,因为数据传送的实时性要求更强。

6.3 一个实用的记忆框架

我自己的记忆框架是三个问题:谁发起、谁搬运、谁收尾。

  • 程序查询:CPU发起、CPU搬运、CPU收尾(全程CPU);
  • 程序中断:设备发起、CPU搬运、CPU收尾(CPU搬但设备触发);
  • DMA:CPU发起、DMAC搬运、CPU收尾(DMAC搬,CPU只做头尾);
  • 通道:CPU发起、通道搬运、CPU收尾(通道程序控制,CPU更放手)。

用这三个问题去套任何一种方式,都能快速定位它的本质特征。做题时如果拿不准,就把这三个问题默念一遍,答案往往就出来了。

7. 刷题时怎么用这套框架快速定位答案

最后说点实操层面的东西。408的I/O章节题目,很多不是考你背没背定义,而是考你能不能把定义用到一个具体场景里。下面这套定位流程,是我自己做题时总结的,基本能覆盖这一章的大部分选择题和综合题。

7.1 先判断题目问的是哪个阶段

DMA相关题目,先看它问的是预处理、传送中还是后处理。问预处理,答案通常和CPU写寄存器、初始化参数有关;问传送中,答案通常和DMAC控制、总线占用、地址计数自动修改有关;问后处理,答案通常和中断、状态检查、善后处理有关。阶段定位准了,答案范围就缩小了一大半。

7.2 再判断考的是哪种总线占用方式

如果题目提到"CPU停顿""独占总线""传送期间CPU不能访存",大概率是停止CPU访存方式;如果提到"窃取周期""插入等待""CPU个别周期被占用",大概率是周期挪用方式;如果提到"固定时隙""交替使用",就是交替访存方式。不同方式下CPU受影响的描述不同,选项往往就是在这里设陷阱。

7.3 最后核对中断的作用

凡是选项里说"DMA传送过程中每个数据都中断CPU"的,直接排除,这是把DMA和中断方式搞混了。DMA只在整批传送结束后中断一次。凡是说"DMA不需要中断"的,也要小心,DMA确实需要中断来通知完成,只是中断的频率远低于中断方式。

7.4 常见错误选项的特征

根据我刷题的经验,DMA题目的错误选项通常有这几个特征:把DMA说成"完全不需要CPU"(忽略了初始化和善后);把DMA说成"数据经过CPU寄存器"(混淆了DMA和中断);把DMA的中断说成"每次传送都中断"(混淆了中断的作用);把周期挪用方式说成"CPU完全不能访存"(混淆了三种总线占用方式)。看到这些表述,基本可以判定是错的。

把这套流程走熟之后,DMA这一块的题目基本可以做到看完题干就有方向,不用在选项之间反复纠结。真正需要动笔算的,通常是程序查询、中断、DMA三种方式的时间开销对比,那种题目把每种方式的单位开销算清楚,列个式子就能出结果。

我个人在做这类对比计算时的习惯是,先把"传送一个数据需要哪些操作、每个操作消耗多少时间"列成表,再乘以数据总量。程序查询是"轮询开销加传送开销",中断是"中断响应开销加传送开销",DMA是"初始化开销加总线传送开销加一次中断开销"。把这三条式子摆出来,题目给什么参数就代什么参数,不容易漏项。这个习惯帮我避开了不少因为漏算某一项而选错的坑。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询