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需要完成以下动作测试设备状态确认外设就绪向DMAC的命令寄存器写入控制字设定传送方向是设备到内存还是内存到设备、工作方式等向内存地址寄存器写入数据在内存中的起始地址向字计数器写入本次传送的数据个数向设备地址寄存器写入外设接口地址启动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数据传送控制者CPUCPUDMACCPU参与程度全程轮询每次传送都参与仅初始化和善后中断的作用无触发每次传送通知整批完成优先级无较低较高适用场景低速、简单中低速、随机高速、大批量消耗资源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执行指令。DMADMAC主动搬运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搬但设备触发DMACPU发起、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是初始化开销加总线传送开销加一次中断开销。把这三条式子摆出来题目给什么参数就代什么参数不容易漏项。这个习惯帮我避开了不少因为漏算某一项而选错的坑。
企业数字化 ERP 产品动态
相关推荐
同步BUCK开关节点负压尖峰:成因、测量与六种量产抑制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/28 1:14:22
一文搞懂网站301重定向$:改需求拖一周?这招救急 一文搞懂网站301重定向$:改需求拖一周?这招救急 改个需求建站公司拖一周,这种憋屈事儿谁没遇到过?明明只是把旧域名切到新域名,或者调整一下目录结构,对方却以“涉及底层架构”为由拖延工期,生怕改坏了担责。其实, 网站301重定向$… · 2026/9/28 1:14:22
5个最佳实践:内容型网站的运营避坑指南 5个最佳实践:内容型网站的运营避坑指南 找建站公司最怕什么?怕被坑高价,怕付了钱做出来的东西搜不到人。很多甲方一上来就盯着报价单,觉得几千块和几万块的网站看起来差不多,其实差别在“运营底子”。内容型网站不是建完就结束,得靠持续更新和精准优化… · 2026/9/28 1:14:22
Spingboot启动预热的实现 启动预热的适用场景启动预热适合以下情况:数据主要来自第三方接口,无法直接从本地数据库读取。第三方接口响应较慢,首次访问容易超时。一个页面需要调用多个第三方接口或逐项查询。数据读取频繁,但变化不频繁。希望服务启动后&… · 2026/9/28 3:40:12
学Java别走弯路,这5个方向最吃香 学Java的人很多,但学明白的人不多。有人学了半年还在写控制台程序,有人一年就能独当一面。差别不在天赋,而在方向。Java生态太庞大了,什么都学等于什么都没学。选对方向,事半功倍。今天盘点当前最吃香的5个Java方向&am… · 2026/9/28 3:32:15
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
制作网页比较方便的软件怎么选?一文搞懂避坑指南 制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25