news 2026/9/27 1:11:02

计算机408组成原理:DMA方式与I/O信息传送全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
计算机408组成原理:DMA方式与I/O信息传送全解析

1. 为什么DMA是408大题里最容易丢分的“送分题”

如果你正在啃计算机组成原理,尤其是唐朔飞或者白中英那套教材里“I/O设备与主机信息传送控制方式”这一章,大概率会在DMA这里卡一下。不是因为它难,而是因为它的细节太密:周期挪用、周期窃取、中断请求、DMA请求、三种传送方式、四种传送模式,还有和中断方式的本质区别。408考卷上,这部分内容既可以出选择题,也可以出大题,比如24年45题就考了DMA和中断的配合逻辑。很多人复习时觉得“DMA不就是让外设直接访问内存吗”,结果一到做题就分不清谁先谁后、谁响应谁。

我当年第一次学DMA的时候,脑子里全是问号:为什么DMA传送前还要CPU预处理?为什么DMA控制器也要发中断?周期挪用和停止CPU访存到底差在哪?后来自己画了几遍数据通路、把一次完整的DMA传送过程拆成时间轴,才真正搞明白。这篇文章我就按一个408考生的视角,把DMA方式从“为什么需要”到“怎么考”全部拆开讲一遍。不管你是刚开始学组成原理,还是已经刷完一轮题想回头补漏,这篇内容都能直接拿来当复习提纲用。

核心关键词我先摆出来:计算机408、计算机组成原理、DMA、I/O设备、信息传送。这几个词贯穿全文,你读的时候可以对照自己的笔记,看看哪些地方之前理解偏了。

2. DMA方式到底解决了什么问题

2.1 从程序查询到中断方式的进化逻辑

要理解DMA,得先知道它前面两种方式为什么不够用。程序查询方式最简单:CPU不断读设备状态寄存器,设备准备好了就传一个数据。这种方式的问题太明显了,CPU完全被I/O绑死,传一个字节就要循环等半天,效率低到令人发指。后来有了中断方式,设备准备好之后主动给CPU发中断请求,CPU暂停当前程序,跳去执行中断服务程序传数据。这比查询强多了,至少CPU不用一直盯着设备。

但中断方式有个硬伤:每传一个数据都要打断CPU一次。你想想,如果磁盘要传4KB数据,按中断方式就是4K次中断,每次中断都要保存现场、跳转、执行服务程序、恢复现场。CPU大部分时间都花在“保护现场”和“恢复现场”上了,真正传数据的开销反而很小。这就好比你要搬100箱货,每搬一箱就有人拍你肩膀让你停下来签个字,搬完再拍一次,你光签字就累死了。

DMA的思路很直接:让一个专门的控制器来搬数据,CPU只负责开头和结尾。DMA控制器直接连接内存和I/O设备,数据传送不经过CPU寄存器,也不需要CPU执行指令。CPU只需要在传送前告诉DMA“从哪搬到哪、搬多少”,传送结束后DMA再给CPU一个中断说“我搬完了”。中间那几千次数据搬运,CPU完全不参与。

2.2 DMA与中断方式的本质区别

这里必须把DMA和中断的区别说透,因为408特别喜欢考这个对比。我整理了一个表,你直接记:

对比维度中断方式DMA方式
数据传送方向通过CPU寄存器中转直接在内存和I/O之间传送
CPU参与程度每个数据都要CPU执行指令仅预处理和后处理
请求响应时机一条指令执行结束后响应每个机器周期结束后可响应
优先级低于DMA高于中断
中断作用传送数据传送完成通知
适用场景低速设备、随机数据高速设备、大批量数据

最关键的一点:DMA请求的优先级高于中断请求。为什么?因为DMA传送的是高速设备的数据,如果被中断打断,数据可能丢失。而中断处理的是低速事件,晚一点响应问题不大。这个优先级关系在408选择题里反复出现,你一定要记牢。

还有一个容易混的点:DMA控制器在传送结束后也会向CPU发中断请求。但这个中断和中断方式里的中断完全不是一回事。中断方式里的中断是“我要传数据了,你来处理”,DMA里的中断是“我已经传完了,你来做收尾”。一个是请求服务,一个是汇报完成。

3. DMA控制器的内部结构与工作寄存器

3.1 DMA控制器的核心组成

DMA控制器不是一块简单的逻辑电路,它内部有一组寄存器和控制逻辑。408考试里经常考“DMA控制器中有哪些寄存器”或者“哪个寄存器负责什么功能”。我按唐朔飞教材的体系给你拆开:

  • 内存地址寄存器(AR):存放当前要访问的内存地址。每传送一个数据,这个寄存器自动加一或减一,指向下一个内存单元。
  • 字计数器(WC):记录还要传送多少个数据。每传一个数据减一,减到零表示传送完成,触发中断。
  • 数据缓冲寄存器(DR):暂存从设备读入或要写到设备的数据。有些教材叫数据寄存器。
  • 设备地址寄存器(DAR):存放I/O设备的地址,用来选中具体设备。
  • 控制与状态寄存器:存放控制命令和状态信息,比如传送方向、是否允许中断、是否出错等。

这些寄存器里,AR和WC是必须掌握的,因为大题里经常让你计算传送过程中AR和WC的变化。比如“传送1000个字节,起始地址2000H,问传送结束后AR和WC的值是多少”。答案:AR = 2000H + 1000 = 23E8H,WC = 0。注意AR是加还是减取决于传送方向,但408默认按加处理。

3.2 DMA控制器的两种工作状态

DMA控制器在系统中有两种身份,这一点很多人没注意:

第一种是作为总线从设备。CPU在预处理阶段要读写DMA控制器的寄存器,这时候DMA控制器就像普通I/O接口一样,接受CPU的读写命令。CPU把起始地址写入AR,把传送长度写入WC,把控制字写入控制寄存器。

第二种是作为总线主设备。当DMA开始传送数据时,它要主动占用总线,向内存发地址、发读写命令。这时候DMA控制器是总线的主控者,CPU反而变成了旁观者。

这个“双重身份”是理解DMA工作过程的关键。很多408大题就是围绕“什么时候DMA是从设备、什么时候是主设备”来出题的。

4. DMA的三种传送方式与四种传送模式

4.1 停止CPU访存方式

这是最简单的一种。DMA要传送数据时,直接向CPU发一个信号,要求CPU放弃总线控制权。CPU收到信号后,在当前机器周期结束后交出总线,DMA独占总线进行数据传送。传送完一组数据后,DMA再把总线还给CPU。

这种方式的好处是控制简单,DMA可以连续传送,速度最快。坏处是CPU在DMA传送期间完全不能访存,如果DMA传送时间很长,CPU就被晾在那了。实际系统中很少用这种方式,因为CPU的利用率太低。

4.2 周期挪用方式

也叫周期窃取。DMA控制器在需要传送数据时,向CPU申请占用一个机器周期。CPU在当前机器周期结束后响应,DMA借用这个周期完成一次数据传送,然后马上把总线还给CPU。下一个周期CPU继续执行程序,DMA如果需要再传,再申请。

这种方式的好处是CPU和DMA交替使用总线,CPU不会长时间停工。坏处是DMA传送一个数据就要申请一次,如果设备速度很快,DMA频繁申请,CPU的指令执行会被频繁打断,效率也会下降。

这里有个细节:DMA申请周期时,CPU可能正在使用总线。这时候DMA要等CPU当前机器周期结束。如果CPU正在执行一条需要多个机器周期的指令,DMA只能等这个机器周期结束,不能打断指令的执行。这就是为什么DMA请求的响应时机是“机器周期结束后”,而不是“指令执行结束后”。

4.3 交替访问方式

这种方式把CPU的工作周期分成两部分,一部分给CPU访存,一部分给DMA访存,两者交替进行,不需要申请和归还总线。这种方式对CPU和DMA的时间要求比较严格,实际中用的不多,但408选择题里出现过。

4.4 四种传送模式

除了上面三种总线占用方式,DMA还有四种数据传送模式:

  • 单字节传送:每传一个字节,WC减一,AR加一,然后释放总线。下次传送再重新申请。
  • 块传送:一次申请总线,连续传送一整块数据,直到WC减到零才释放总线。
  • 请求传送:DMA申请总线后连续传送,直到设备没有数据可传或者WC减到零才释放。
  • 级联传送:多个DMA控制器级联,用来扩展通道数量。

408考试里最常考的是单字节传送和块传送的区别。单字节传送每次都要申请总线,块传送只申请一次。块传送效率高,但占用总线时间长。

5. 一次完整DMA传送的全过程拆解

5.1 预处理阶段:CPU都做了什么

DMA传送不是一上来就搬数据,CPU必须先做预处理。这一步在408大题里经常被忽略,但恰恰是得分点。

CPU要做的预处理包括:

  1. 测试设备状态:检查I/O设备是否就绪,有没有故障。
  2. 设置DMA寄存器:把内存起始地址写入AR,把传送字数写入WC,把设备地址写入DAR,把传送方向和控制信息写入控制寄存器。
  3. 启动DMA:向DMA控制器发启动命令,DMA开始工作。
  4. 继续执行主程序:CPU做完这些就回去干自己的事了,不需要等待。

这里有个关键点:CPU预处理完成后,DMA传送期间CPU不参与。CPU继续执行主程序,直到DMA发来中断请求。

5.2 数据传送阶段:DMA如何接管总线

DMA控制器启动后,开始向CPU申请总线。以周期挪用方式为例:

  1. DMA向CPU发总线请求信号(HRQ)。
  2. CPU在当前机器周期结束后,发总线响应信号(HLDA),交出总线控制权。
  3. DMA获得总线后,向内存发地址(AR中的值),发读写命令,在内存和I/O设备之间传送一个数据。
  4. 传送完成后,AR加一(或减一),WC减一。
  5. DMA释放总线,CPU继续执行。
  6. 如果WC不为零,DMA再次申请总线,重复上述过程。

这个过程会一直重复,直到WC减到零。注意:DMA传送数据不经过CPU寄存器,数据直接在内存和I/O设备之间流动。这是DMA和中断方式最本质的区别。

5.3 后处理阶段:中断请求与CPU收尾

当WC减到零时,DMA控制器向CPU发中断请求。CPU响应中断后,执行中断服务程序,做以下事情:

  1. 检查DMA状态:确认传送是否正常完成,有没有出错。
  2. 处理数据:如果传送的是输入数据,CPU可能要校验数据;如果是输出数据,CPU可能要释放缓冲区。
  3. 恢复现场:准备下一次DMA传送或继续其他任务。

这个中断和普通中断的处理流程一样,但它的作用不是传送数据,而是通知CPU“DMA传送结束了”。

5.4 完整时间轴示例

假设用周期挪用方式传送100个字节,每个字节传送需要一个机器周期。时间轴大致如下:

时间点CPU动作DMA动作
T0执行预处理,设置AR、WC等待启动
T1执行主程序申请总线
T2当前机器周期结束,响应请求获得总线,传送第1个字节
T3继续执行主程序释放总线
T4执行主程序申请总线
.........
Tn执行主程序传送第100个字节,WC=0
Tn+1响应中断,执行后处理发中断请求

这个时间轴能帮你理解为什么DMA效率高:CPU只在T0和Tn+1参与,中间Tn个周期都在干自己的活。

6. 408真题里DMA的常见考法与解题套路

6.1 选择题高频考点

408选择题里DMA的考点非常集中,我刷了近几年真题,总结出以下几个必考方向:

考点一:DMA与中断的优先级。题目通常问“DMA请求和中断请求同时发生时,CPU先响应哪个”。答案永远是DMA,因为DMA传送的是高速数据,不能等。

考点二:DMA控制器的寄存器功能。题目会问“哪个寄存器存放传送字数”或者“AR的作用是什么”。你只要记住AR管地址、WC管计数、DR管数据、DAR管设备。

考点三:DMA传送的响应时机。题目问“DMA请求在什么时候被响应”。答案:每个机器周期结束后。注意不是指令执行结束后,这是和中断响应的关键区别。

考点四:DMA方式的数据传送路径。题目问“DMA传送时数据经过哪些部件”。答案:内存和I/O设备之间直接传送,不经过CPU。

考点五:三种传送方式的比较。题目会问“哪种方式CPU利用率最高”或者“哪种方式控制最简单”。停止CPU访存最简单但CPU利用率最低,周期挪用CPU利用率较高但控制复杂。

6.2 大题解题模板

DMA大题通常分几问,我总结了一个答题模板:

第一问:CPU预处理要做什么?答:测试设备状态,设置AR、WC、DAR和控制寄存器,启动DMA。

第二问:DMA传送过程中CPU是否参与?答:不参与。CPU继续执行主程序,DMA直接控制内存和I/O之间的数据传送。

第三问:传送结束后DMA如何通知CPU?答:WC减到零时,DMA向CPU发中断请求,CPU执行中断服务程序做后处理。

第四问:计算AR和WC的变化。答:AR每传一个数据加一,WC每传一个数据减一。传送N个数据后,AR = 初始地址 + N,WC = 0。

这个模板能覆盖大部分DMA大题。你答题时按这个逻辑写,基本不会丢分。

6.3 24年45题复盘

24年45题考的是DMA和中断的配合。题目大意是:一个系统用DMA方式从磁盘读数据到内存,传送完成后DMA发中断,CPU响应中断后做后处理。问的是DMA传送期间CPU能否响应其他中断,以及DMA中断和普通中断的优先级关系。

这道题的坑在于:DMA传送期间,CPU可以响应其他中断。因为DMA占用的是总线,不是CPU。CPU在执行主程序,如果有更高级的中断请求,CPU可以响应。但DMA中断的优先级高于普通中断,因为DMA传送完成需要及时处理,否则可能影响下一次DMA传送。

很多考生误以为DMA传送期间CPU完全不能响应中断,这是错的。DMA只占用总线,不占用CPU。CPU的中断响应逻辑和DMA的总线请求是两套独立的机制。

7. 实操中容易踩的坑与排查技巧

7.1 常见理解误区

误区一:DMA传送不需要CPU参与。错。CPU要做预处理和后处理,只是传送过程中不参与。没有CPU的预处理,DMA根本不知道从哪搬到哪。

误区二:DMA请求和中断请求是一回事。错。DMA请求是总线请求,中断请求是CPU请求。DMA请求的优先级高于中断请求。

误区三:DMA传送的数据要经过CPU寄存器。错。数据直接在内存和I/O之间传送,不经过CPU。这是DMA效率高的根本原因。

误区四:DMA传送结束后不需要中断。错。DMA传送结束后必须发中断通知CPU做后处理,否则CPU不知道传送完成了。

误区五:周期挪用方式下DMA可以打断CPU的指令执行。错。DMA只能在机器周期结束后获得总线,不能打断当前机器周期的执行。

7.2 计算题易错点

DMA计算题最容易错的地方是AR和WC的初始值和变化方向。我总结了几条规则:

  • AR的初始值是内存起始地址,每传一个数据加一(或减一,取决于传送方向)。
  • WC的初始值是传送数据的总数,每传一个数据减一。
  • 传送结束后,AR = 初始地址 + 传送数据数(按加一计算),WC = 0。
  • 如果题目问“传送结束后AR的值”,直接算初始地址加数据数。
  • 如果题目问“传送过程中AR的变化”,注意是每个数据传送后变化,不是每个机器周期变化。

还有一个坑:WC减到零时触发中断,但最后一个数据已经传送完成。所以中断是在最后一个数据传送后发出的,不是传送前。

7.3 与中断方式对比的速查表

问题中断方式DMA方式
谁发起传送设备发中断请求CPU预处理后DMA发起
数据经过CPU吗经过不经过
CPU参与程度每个数据都参与仅预处理和后处理
响应时机指令执行结束后机器周期结束后
优先级低高
中断作用请求传送数据通知传送完成
适用设备低速高速

这张表你考前背下来,选择题基本秒杀。

8. 从408到实际系统:DMA在嵌入式里的影子

虽然408考的是原理,但DMA在实际系统里无处不在。你如果学过STM32或者Linux驱动,肯定见过DMA的身影。STM32的串口DMA接收、ADC多通道DMA采集、SPI DMA传输,本质上都是408里讲的DMA方式。Linux内核里的DMA引擎框架,也是同样的原理。

我拿STM32的串口DMA接收举个例子。你配置好串口和DMA后,CPU只需要初始化DMA通道,设置源地址(串口数据寄存器)、目的地址(内存缓冲区)、传送长度。然后CPU就可以去干别的事了。每来一个字节,DMA自动把数据从串口搬到内存,不需要CPU干预。接收完指定长度后,DMA触发中断,CPU再来处理数据。这和408里讲的DMA流程一模一样:预处理、传送、后处理。

如果你正在学408,同时又玩嵌入式,可以把这两者对照起来理解。408讲的是原理,STM32讲的是实现。原理搞懂了,看STM32的DMA配置寄存器就会觉得理所当然。

9. 复习DMA的实操建议

9.1 画图法:把数据通路画出来

我复习DMA时最有效的方法是画图。拿一张白纸,画出CPU、内存、DMA控制器、I/O设备四个部件,然后画出数据通路。重点画三条线:

  • CPU到DMA控制器的控制线(预处理和后处理)
  • DMA控制器到内存的地址线和数据线(传送阶段)
  • DMA控制器到I/O设备的数据线(传送阶段)

画完之后,用不同颜色的笔标出预处理阶段、传送阶段、后处理阶段分别用到哪些线。这样一遍画下来,DMA的工作过程就刻在脑子里了。

9.2 时间轴法:把一次传送拆成时间点

找一道DMA大题,把题目里的传送过程按时间点拆开。每个时间点标注CPU在做什么、DMA在做什么、总线被谁占用。拆完一遍,你对“周期挪用”和“停止CPU访存”的区别就彻底清楚了。

9.3 对比法:把DMA和中断放在一起背

不要单独背DMA,要把DMA和中断放在一起对比。我前面给的那张对比表,你考前默写三遍。默写的时候注意:数据传送方向、CPU参与程度、响应时机、优先级、中断作用,这五个维度一个都不能少。

9.4 真题法:把近十年DMA真题刷三遍

408真题里DMA的考法很固定,刷三遍就能摸清套路。第一遍按知识点分类做,第二遍按年份做,第三遍只做错题。每道题做完后,把涉及的知识点在教材上找到对应位置,标记出来。这样你就能知道408到底考哪些点,哪些点从来没考过。

10. 我个人踩过的坑和最后的小技巧

我第一年考408的时候,DMA部分丢了不少分。后来复盘发现,问题出在“想当然”上。我以为DMA传送就是“设备直接访问内存”,忽略了CPU预处理和后处理的存在。结果大题里问“CPU在DMA传送中做了什么”,我只写了“不参与”,漏掉了预处理和后处理,直接丢了一半分。

第二年我调整了方法,把DMA的每个阶段都拆开,用时间轴的方式理解。我发现最有效的记忆方法是:把DMA想象成一个搬家公司。CPU是房东,内存是旧房子,I/O设备是新房子。房东只需要告诉搬家公司“从旧房子搬哪些东西到新房子”(预处理),然后就可以去上班了。搬家公司自己搬(传送阶段),搬完后给房东打电话说“搬完了”(中断请求),房东回来检查(后处理)。这个类比帮我记住了DMA的完整流程。

最后分享一个小技巧:记DMA寄存器的时候,用“地址、计数、数据、设备”四个词串起来。AR管地址,WC管计数,DR管数据,DAR管设备。四个词首字母连起来是“地计数设”,你多念几遍就记住了。考试时一看到DMA寄存器相关的题,先默念“地计数设”,然后对应到具体寄存器,基本不会错。

DMA这部分内容,说难不难,说简单也不简单。关键是你要把“为什么需要DMA”“DMA怎么工作”“DMA和中断有什么区别”这三个问题彻底搞懂。搞懂了这三个问题,408里DMA的题基本就是送分题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/27 1:08:45

I2C调试实战:从万用表测电平到示波器抓波形,定位ACK/NACK故障

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 1:08:12

STM8开发环境搭建全攻略:从STVD到Cosmic配置与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 1:07:57

基于Python的景点数据分析系统:数据生成到GUI落地全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 1:07:27

空天通信网络架构与关键技术:从低轨星座到链路预算验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 1:06:42

Smartbi报表开发实战:Excel模板、日期参数校验与发布避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 1:06:26

RK3568 Buildroot重启需手配IP?根源与Debian固化方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华