☰
计算机组成原理难点:DMA方式详解,一次讲清与中断方式的区别
2026/9/28 19:33:45 网站建设 项目流程

计算机408、计算机组成原理、DMA方式,这三个词放在一起,基本就是考研人熟悉的噩梦配方之一。我当年复习408时,在I/O这一章卡得最久的恰恰就是DMA方式——不是因为它难到学不会,而是因为它和中断方式的对比太容易混。今天这篇就把这块硬骨头拆开揉碎,从DMA为什么诞生、内部结构是什么样,到完整传送流程、真题考向和常见做题误区,一次说清楚。

1. 为什么需要DMA方式:一场“CPU被绑架”的进化史

1.1 程序查询方式:CPU全程保姆式服务

先看最原始的I/O控制方式:程序查询方式。这种方式下,CPU需要不断读取设备状态寄存器,不停轮询“数据准备好没有”。设备没准备好,CPU就一直在循环里空转等待;数据来了,CPU再把数据从设备寄存器搬到主存或从主存搬到设备。

这种方式的致命问题在于:CPU把大量时间花在了“等待”和“反复检查状态”上,真正干活的效率极低。假设一台打印机每秒能传100个字符,CPU每传一个字符要查询几十次状态位,其中大部分查询都白费——因为设备还没就绪。外设速度越慢,CPU的浪费越严重,整个系统性能被外设死死拖住。

这种方式在某些简单嵌入式场景还能用,但在通用计算机里,CPU是大爷不是保姆,绝不能在低速外设上耗时间。教材上经常说它“实现简单、硬件成本低”,但这句话的反面是“CPU利用率极低、系统效率差”,408选择题偶尔会考这种方式的优缺点对比。

1.2 中断方式:引进“外卖员”但一次只送一份

为了解决轮询浪费的问题,人们引入了中断方式。核心思路是:CPU不再主动等待设备,而是设备准备好之后主动“敲门”,通过中断请求告诉CPU“数据到位了,赶紧处理”。

中断方式确实解放了CPU的等待时间,它可以在设备工作的间隙去执行其他程序。但是中断方式有个天生不足:每传输一个数据(比如一个字节或一个字)都要触发一次中断,CPU每次都要做现场保护、转去执行中断服务程序、取数、存数、恢复现场。这一整套操作都是靠CPU执行指令完成的,开销非常大。

打个比方:把中断方式理解成点外卖,外卖员(设备)每次只送一个包子(一个字),CPU每顿要吃一百个包子,就得接一百次外卖电话,每次接电话放下手里的事情跑下楼去拿,这一百次折腾下来CPU基本没空干正事。高速外设,比如磁盘、网卡,每秒钟要传几十万甚至上百万字节,如果每字节都中断一次,CPU就彻底废了。

1.3 DMA方式:从“全托管”到“硬件搬运工”

于是,DMA方式应运而生。DMA的全称是Direct Memory Access,直接存储器存取。它的核心思路是:在I/O设备和主存之间直接开辟一条数据传送通道,由专门的硬件——DMA控制器(DMAC)来负责数据的搬运,CPU只在传送开始前做一次准备工作,在传送结束后处理一次收尾工作,中间的整个数据块搬运过程完全不需要CPU参与。

还是拿外卖做类比:如果说中断方式是“一次送一个包子”的外卖,DMA方式就是“一次性叫了一整桌宴席”,CPU只需要下单(预处理)和结账(后处理)两个动作,中间厨师怎么炒菜、传菜员怎么上菜,CPU一概不用管。

这就是为什么DMA方式特别适合磁盘、显卡、网卡这类高速块设备。它解决的核心问题有两个:第一,把CPU从逐字逐句的数据搬运中彻底解放出来;第二,让外设和主存之间的数据吞吐量不再受CPU指令执行速度的限制。

2. DMA控制器的内部结构拆解:一个迷你CPU

2.1 五大核心寄存器

DMA控制器能独立完成数据搬运,靠的是内部一组关键寄存器,把它们记住,后面做题全靠它们。

主存地址寄存器(MAR)用来存放当前要传送数据的主存地址。注意这个MAR和CPU内部的MAR不是同一个东西,DMA控制器里有自己独立的一套。每传送一个字,这个寄存器的内容自动加1,指向下一个地址。

字计数器(WC)记录本次传送还剩多少个字没传完。每传一个字,计数器减1,减到0说明整块数据都传完了。

外设地址寄存器(DAR)存放I/O设备的编号或设备内地址信息,告诉DMA控制器数据要跟哪个设备打交道。

数据缓冲寄存器(DBR)用来暂存从外设读来或要写往外设的一个字的数据,起中转站作用。

控制逻辑电路负责协调以上部件的工作,产生读写控制信号、总线请求信号等。

这五个部件是408教材里的标准配置,唐朔飞和王道的写法略有差异,但本质一致。主存地址寄存器、字计数器这两个最为常考,尤其是涉及传送字节数计算的题,基本都要用到字计数器的值。

2.2 三种数据传送模式

DMA获得总线使用权之后,在数据传送阶段有三种常见模式:

成组连续传送模式(也叫成组传送或块传):DMA控制器一旦获得总线使用权,就连续占用总线把一整块数据全部传完,中间不释放总线。这种模式传送效率最高,但缺点很明显:如果数据块很大,CPU和系统其他部件长时间无法使用总线,相当于是把总线独占了一段时间。

周期挪用模式(也叫周期窃取):DMA控制器每传送一个字节或一个字,就向CPU请求一次总线使用权,占用一个存取周期,传完一个数据立刻释放总线。CPU可能只被暂停一个存取周期,影响小得多,但每次请求总线都有额外开销,适合不太急迫的场合。

这两种模式在考试中出现频率很高,核心区分点是“一次占用总线传多少数据”。成组传送是传一个数据块,周期挪用是传一个数据单位(字节或字)。

2.3 DMA控制逻辑如何“抢”总线

DMA控制器要搬运数据,必须获得总线的使用权,这个过程叫总线请求与总线授权。流程是:DMA控制器向CPU发出总线请求信号;CPU在合适的时机(通常是一个机器周期结束、当前总线操作完成之后)响应请求,发出总线授权信号,同时把地址总线、数据总线、控制总线的使用权让给DMA控制器。DMA控制器使用完总线之后,再把控制权还给CPU。

这里有非常重要的一点:DMA控制器是通过“暂停CPU访问总线”来工作的,而不是靠提高优先级抢占。CPU和DMA都不能同时使用总线,必须分时。DMA每次占用总线的时间被严格限制,一般就是一个或几个存取周期,所以对CPU的影响在可控范围内。考试中经常问“DMA方式下CPU是否停止工作”——答案是否定的,CPU只是暂停使用总线,内部的运算、寄存器操作可能还在继续。

3. DMA完整工作流程:从预处理到后处理

3.1 预处理阶段:CPU做一次“初始化交代”

DMA传送不是凭空开始的,CPU必须先给DMA控制器“交代任务”。这个阶段CPU要做的事情包括:指定数据传送方向(是I/O设备到主存,还是主存到I/O设备);往主存地址寄存器写入主存起始地址;往字计数器写入本次要传送的数据个数;往外设地址寄存器写入设备地址并启动设备。

预处理完成后,CPU就可以回去继续执行原来的程序了,而I/O设备则开始准备数据。比如磁盘要读出数据到内部缓冲区,缓冲区准备好后就通知DMA控制器开始传送。这个过程CPU只需要执行少数几条指令,时间开销几乎可以忽略。

值得留意的是,预处理阶段依然需要CPU参与。很多初学者以为DMA是“全程无CPU参与”,这是不准确的。准确说法是:数据传送过程不需要CPU参与,但传送前的初始化和传送结束后的处理还是离不开CPU。

3.2 数据传送阶段:以磁盘块读取为例走一遍

我在复习的时候,总喜欢把一个典型场景走一遍,这样比死记硬背流程可靠得多。这里就以磁盘读一个扇区为例,把传送阶段完整过一遍:

第一步,磁盘设备把数据读入自己的内部缓冲区,当发现数据已就绪,就向DMA控制器发出请求信号。第二步,DMA控制器收到请求后,向CPU发出总线请求。第三步,CPU在恰当的时机释放总线控制权。第四步,DMA控制器取得总线使用权,把磁盘缓冲区中的一个字的数据读入DMA的数据缓冲寄存器。第五步,DMA控制器再向主存发起写操作,数据经数据总线写入主存地址寄存器所指向的单元。第六步,主存地址寄存器加1,字计数器减1。第七步,如果字计数器不为0,继续传送下一个字;如果已经减到0,说明整块数据传送完毕。

整个过程完全由DMA控制器内部的硬件逻辑控制,不执行任何程序指令,也不需要CPU介入。这就是DMA速度快、效率高的根本原因——数据搬运动作被交给了专用硬件,而不是由通用处理器逐条执行指令来完成。

3.3 后处理阶段:中断汇报“搬运完成”

当字计数器减到0,DMA控制器会做两件事:一是向CPU发出一个中断请求,报告“数据传输完成”;二是把状态寄存器的内容(比如传送过程是否出错、实际传送了多少数据)保存下来,供CPU检查。

CPU响应这个中断后,执行中断服务程序,做善后处理:比如检查传送结果是否正确、决定后续是否启动下一次传输、处理可能的错误状态。这个过程只对一整块数据做一次中断,而不是每个字都中断一次。

这就是DMA和中断方式配合的经典模型:DMA控制器负责“闷头干活”,CPU只在开始和结束时各处理一次。你可以把DMA理解成一个特别能干的快递员,从仓库(磁盘缓冲区)把一整批货(数据块)直接送到指定地点(主存),快递员自己开车去,不需要老板(CPU)全程打电话指挥,到货了才通知老板验货。

4. 高频考点:DMA方式与中断方式的五大区别

4.1 数据交换粒度不同

中断方式与DMA方式最本质的区别之一,是数据交换粒度。中断方式一次处理一个字节或一个字,每一次数据交换都要完整执行一遍中断流程。DMA方式一次处理一个数据块,整块数据作为一个整体连续传送。

这个区别直接决定了两种方式的应用场景。中断方式适合慢速或中速设备,比如键盘、鼠标、串口;DMA方式适合高速块设备,比如磁盘、光驱、网卡。408选择题经常给一个设备列表,问哪些适合用DMA方式,选磁盘和网卡基本没错。

4.2 CPU介入程度不同

中断方式下,数据从设备寄存器搬到主存(或反向)的操作,是由CPU执行中断服务程序中的指令来完成的。也就是说,搬运数据这件事CPU必须亲自干,一条一条指令地执行,哪怕这部分工作只是“取一个数再存一下”,也得占用CPU的指令周期。

DMA方式下,数据的实际传送由DMA控制器的硬件逻辑完成,CPU不执行搬运指令。CPU只在预处理阶段付出少量时间,传送期间CPU可以执行其他程序,只要不与DMA抢总线就行。教材上常说的“DMA方式下CPU利用率高”,指的就是这个阶段CPU可以继续算自己的东西。

4.3 利用总线的时机不同

中断方式下,CPU本来就是总线的控制者,处理中断时CPU天然地使用总线,不需要专门的“总线请求-总线授权”环节。DMA方式则不同,DMA控制器本身不是总线控制者,要使用总线必须主动申请,经过总线仲裁后获得使用权才能传送数据。

考试中如果问“DMA控制器申请的是哪个信号”,答案一定不是“中断请求”,而是总线请求信号。很多同学看到DMA会触发中断,就误以为DMA发出的是中断信号,这就掉坑了。DMA发出的总线请求是获取总线的控制权,中断请求是在整个数据块结束后用来通知CPU的,两者不是一回事。

4.4 处理异常情况的能力不同

中断方式可以处理I/O设备传来的各种异常,比如设备故障、数据校验错误、线路状态异常等等,因为这些异常都需要CPU通过执行程序来分析和响应。DMA方式本身不具备处理逻辑,它只是一个机械化搬运工,数据传错了它自己不会发现问题,也无法针对异常做出复杂决策。

所以在实际系统中,DMA方式常常和中断方式配合使用:正常的数据搬运交给DMA,传送结束后如果有异常状态,由中断向CPU报告。这一点408真题也特别喜欢考,选项里经常出现“DMA方式无法处理异常情况,需借助中断”这种表述。

4.5 优先级与用途搭配

从优先级角度看,DMA方式的中断请求与非屏蔽中断配合时,优先级通常比一般可屏蔽中断高得多。原因很简单:如果DMA请求不能及时得到总线,高速外设的数据可能会因长时间无法传送而丢失。所以当DMA请求和普通中断请求同时到达时,系统一般优先响应DMA,让数据先落地,再处理中断。

但这里也有一个容易混淆的细节:DMA控制器发出的是总线请求,而中断控制器发出的是中断请求,二者不是同一个仲裁体系。所谓“DMA优先级高于中断”,准确说是DMA的总线请求更容易获得总线授权,以及在同时到达时DMA相关的处理优先级别更高。

4.6 一张表看懂所有区别

我把高频考点整理成一张对比表,考前最后冲刺复习的时候,这张表可以当速查卡用:

对比维度中断方式DMA方式
数据交换单位字节/字数据块
数据搬运执行者CPU执行指令DMA控制器硬件
CPU介入频率每传一个数据中断一次仅预处理与后处理
总线控制CPU天然控制需扩展总线请求与授权
响应速度要求相对较慢响应要求高、优先级高
异常处理能力强,可处理复杂异常弱,无法自主处理异常
典型设备键盘、打印机等磁盘、网卡、显卡
对CPU利用率影响高开销、影响大影响小、效率高

5. 从24年45题看408命题风格与复习策略

5.1 真题常见考法类型

往年408考试对DMA的考查主要集中在几个固定方向。第一种是原理辨析题,给出关于DMA特点的描述,判断哪句正确,比如“DMA方式传送过程中不需要CPU干预”“DMA方式一次传送一个数据块”之类,难度不高但要抠字眼,稍不注意就选错。

第二种是流程排序题,给出一系列与DMA传送相关的操作,让考生排出正确顺序。典型选项包括:外设发出请求、DMA向CPU发总线请求、CPU释放总线、DMA传数据、字计数器减到0、DMA向CPU发中断请求。这类题考的就是主流程是否清晰。

第三种是参数计算题,让考生根据存取周期、数据块大小、总线频率等参数计算DMA传送时间或总线占用率。这类题需要掌握基本公式,然后逐项代入,计算本身不复杂,难在单位换算和中间步骤容易出错。

第四种是与中断、程序查询方式做对比的综合题,比如给一个高速外设,问哪种方式最合适并说明理由。近年来408的命题风格越来越强调“结合实际场景分析”,纯背诵的比重在下降,这一点要格外重视。

5.2 王道、唐朔飞、白中英三本教材怎么用

很多同学手头有多个版本的教材和资料,到底以哪本为主,我的经验是:以王道考研的I/O章节为主体框架,因为王道的表述最贴近408考纲和真题语言,选择题的陷阱设计也直击考点。

唐朔飞的《计算机组成原理》是经典教材,对DMA控制器的内部结构描述得更细致,尤其是寄存器级别的功能和时序,适合在理解不了“为什么DMA能自动传送”的时候去翻阅。书里关于DMA和中断的对比表格,我认为是三个版本中整理得最精炼的。

白中英的教材相较而言更偏向硬件实现,适合学有余力的同学拓展。比如白版会讲DMA控制器与CPU之间如何通过请求线和应答线握手,这些内容对做纯理论题帮助有限,但能帮你建立更扎实的底层理解,在面对多版本表述不一致时不至于晕头转向。

一句话总结:王道打底、唐朔飞补深度、白中英做拓展,顺序不要颠倒。

5.3 做题三步法

根据我个人复习和做题的经验,遇到DMA相关题目按以下三步走,正确率会高很多。

第一步,判断题目问的是“传送阶段”还是“全部过程”。如果是传送阶段,所有含“CPU执行指令搬运数据”的选项基本都可以排除;如果是全部过程,含“CPU参与预处理和后处理”的选项可能是正确表述,不要想当然认为DMA全程不用CPU。

第二步,识别设备类型和速度。题目如果明确说了是磁盘、网卡这类块设备,优先考虑DMA;如果是键盘、鼠标这类字符设备,优先考虑中断。设备类型往往就是命题人埋下的最大提示。

第三步,注意单位换算。计算题里“块”“字”“字节”“位”“周期”之间的关系必须理顺,尤其是“字”到底等价于多少字节,要根据题目给定的机器字长判断,不要死套一个固定倍数。

6. 踩坑实录:六个最容易错的DMA细节

6.1 “DMA不用CPU”是最经典的误解

我第一次做模拟题时就栽在这里。题干问“下列关于DMA方式的叙述中,正确的是”,其中一个选项赫然写着“DMA传送过程中CPU完全不参与”。表面看好像没错,毕竟DMA就是为了解放CPU,但这道题的正确答案恰恰不选它。

原因在于,CPU虽然在数据传送期间不执行搬运指令,但在整个DMA过程中参与了预处理和后处理。而且周期挪用模式下,DMA每传一个数据都要暂停CPU的总线使用权,CPU也会受到影响。精准的说法是:DMA传送期间不需要CPU执行程序来控制数据搬迁,但CPU并非全程置身事外。

6.2 周期挪用和成组传送别混淆

周期挪用是每传送一个数据单位就申请一次总线,传完一个就释放,对CPU的“打断”非常短,等价于每隔一段时间窃取一个存取周期。成组传送是一次申请总线后连续传送多个数据,对总线占用时间长,期间CPU几乎没法使用总线。

做题时如果题目中出现“DMA每传送一个数据就占用一个存取周期”,对应的应该是周期挪用,而不是成组连续传送。如果选项说“DMA连续占用总线直到数据传送完”,那描述的是成组方式。这两种模式的特点和适用场景,务必分开记忆。

6.3 总线请求与中断请求是两种信号

DMA工作时涉及两类请求信号。一类是DMA控制器向CPU发出的总线请求信号,目的是获得总线控制权;另一类是DMA控制器在传送结束时发出的中断请求信号,目的是让CPU来处理后续事务。很多题目会故意把这两者混写,比如选项写“DMA通过中断请求信号获得总线使用权”,看起来好像有点道理,实际上是错的。

记住一条:总线请求服务于数据传送阶段,中断请求服务于后处理阶段,两个阶段、两种信号、不能互替。

6.4 主存地址递增方向不要想当然

教材默认DMA每传一个数据,主存地址寄存器自动加1,这是个简化模型。实际上地址方向取决于设备类型和系统设计,磁盘读入主存通常逐地址连续存放,所以加1;但某些设备或某些应用可能会用递减方向甚至按固定跳变方式。

408题目一般还是按递增来考,但偶尔会留一个小坑:如果题干没有明确说明地址方向,默认按递增处理;如果题干特别强调了“地址递减方式”或者“按物理地址相邻连续存放”,那就按它的设定来做,不要惯性使用递增。

6.5 中断嵌套与DMA优先级别搞反

中断和DMA同时请求时谁优先,关键看在什么层面讨论。如果CPU正在执行低优先级中断服务程序时,DMA提交了总线请求,那么由于DMA响应快、利用率高,通常会被优先处理,这有点类似高优先级中断可以打断低优先级中断。但严格来说,DMA不是通过中断实现打断,而是通过总线请求暂时接管总线。

考试若考这个点,正确表述通常类似“DMA的优先级通常高于一般中断”,而错误选项常把DMA写成“可以屏蔽任何中断”或者“优先级低于非屏蔽中断”。做题时抓住“总线请求优先”这个本质就好。

6.6 计算题的字节传送时间是个重灾区

有一类经典计算题:某磁盘一个扇区512字节,DMA每次启动总线传送一个字节,总线频率为100MHz,求传送一个扇区的时间。很多同学直接把512乘以总线周期算完,忽略了DMA每次传送之间还有总线请求和释放的开销,还忽略了设备缓冲区就绪的时间。

我的建议是遇到这类题先列明各阶段时间:外设数据就绪等待时间、DMA申请总线的握手时间、实际数据传送时间。如果题目给的是总线的传送速率,那就用数据量除以速率;如果题目给的是额外握手开销,千万要记得把它们加进去。408考计算题通常数值不会太复杂,但单位陷阱每年都有人踩。

7. 一点私人总结

DMA方式这块内容,说难真不算难,说简单却特别容易丢分。我自己的体会是,只要把“为什么引入DMA”这个问题想透了——也就是CPU逐字搬运太浪费、中断方式每字节打断太频繁、必须把搬运交给专用硬件——后面那些寄存器、流程、优先级、计算题,全部是从这个出发点自然延伸出来的,不需要死记硬背。

复习的时候,我建议你亲手画一遍DMA传送的完整流程图,从外设请求到总线授权,再到地址增量和计数递减,最后中断收尾。画完这一遍,你对整个机制的理解会比刷十道题都深刻。还有一个小技巧:把王道和唐朔飞两本书里关于DMA的表述放在一起对比读,只要遇到表述不一致的地方(比如“周期挪用”和“周期窃取”只是译名之差),就用408真题的答案去倒推谁更贴近考纲口径。

最后再分享一条通用原则:组原这门课,难点从来不是某个单独的知识点,而是知识点之间的联系。DMA和中断、总线和计算题、预处理和状态字,这些内容单拎出来都不复杂,一旦被命题人组合进同一道大题,就非常考验框架是否完整。按本文梳理的这条线把DMA相关的前因后果串起来,配合历年真题练手,这块分数应该就能稳稳拿住了。

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

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

立即咨询