ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

408计算机组成原理:DMA方式详解与三种传送方式对比

408计算机组成原理:DMA方式详解与三种传送方式对比 1. 从一道408真题说起DMA到底在考什么如果你正在啃计算机组成原理尤其是唐朔飞那本教材的第五章或者白中英版本的I/O系统章节那你一定绕不开一个核心问题主机和I/O设备之间到底怎么传数据。程序查询、中断、DMA这三种方式层层递进而DMA几乎是每年408必考的内容。24年45题考的就是DMA方式下CPU与设备并行工作的细节很多人栽在“DMA控制器到底占不占用总线”“周期挪用和停止CPU访存有什么区别”这些点上。我先把这个话题的核心说清楚。DMA全称Direct Memory Access直接存储器访问。它的本质是让数据在主存和I/O设备之间直接搬运不需要CPU逐字逐句地插手。你可以把它想象成一个专门负责搬货的工人CPU是老板老板只需要告诉工人“从仓库A搬100箱货到货车B”然后老板就可以去干别的事了搬货的过程完全由工人自己完成。这个“工人”就是DMA控制器DMAC。这篇文章我打算从408考研的视角出发把DMA方式的来龙去脉、三种具体实现方式、与中断方式的本质区别、以及考试中常见的坑点全部拆开讲透。不管你是刚开始学组成原理的小白还是已经刷了几套真题但DMA部分总是丢分的二战选手这篇内容都能帮你把这块硬骨头啃下来。我会尽量用生活化的类比把抽象概念讲清楚同时该有的专业细节一个不少毕竟408考的就是细节。2. DMA方式的核心设计思路与三种实现方案2.1 为什么需要DMA中断方式到底哪里不够用要理解DMA的价值得先搞清楚它前面那个方案——中断方式——有什么问题。中断方式下I/O设备每准备好一个数据单位比如一个字节或一个字就会向CPU发一次中断请求。CPU响应中断后暂停当前程序执行中断服务程序把数据从设备读到主存或者从主存写到设备然后返回继续执行原程序。这个流程听起来没问题但问题出在频率上。假设你要从磁盘读取4KB的数据按字4字节为单位传送那就是1024次中断。每次中断都要保护现场、执行服务程序、恢复现场开销非常大。更关键的是每次中断CPU都得停下来干活CPU的大量时间被消耗在数据搬运这件“体力活”上真正需要它做的计算工作反而被耽误了。我用一个更直观的例子你是一个公司的CEO每次有快递到了前台都打电话让你亲自下楼去签收。一天来100个快递你就得下楼100次。你的时间全花在签收快递上了还怎么开会做决策中断方式就是这个模式——每个数据单位都让CPU亲自去“签收”。DMA的思路完全不同我雇一个专门的收发室大爷DMAC快递来了他直接签收并放到指定位置只有全部快递都收完了才通知CEO一声。CEO只需要在开始的时候告诉大爷“今天有100个快递放到3楼仓库”然后就可以安心工作了。这就是DMA的核心思想——批量传送只在开始和结束时需要CPU参与。2.2 DMA控制器的基本组成与工作流程DMAC不是凭空工作的它内部有一整套寄存器来管理传送过程。核心的几个包括主存地址寄存器AR记录当前要读写的主存地址每传送一个数据单位后自动加1或减1。字计数器WC记录还剩多少数据单位没传每传送一个减1减到0时表示传送完毕。数据缓冲寄存器DR暂存每次传送的数据。设备地址寄存器DAR存放I/O设备的地址或设备号。控制与状态逻辑包括中断控制逻辑、DMA请求标志等。整个工作流程大致是这样的CPU在启动DMA之前先通过程序把主存起始地址、传送字数、设备地址等信息写入DMAC的各个寄存器然后启动DMAC。之后DMAC开始接管总线在主存和设备之间搬运数据。每传完一个数据单位AR加1、WC减1。当WC减到0时DMAC向CPU发一个中断信号告诉CPU“活干完了”。CPU收到中断后做一些收尾工作比如检查是否有错误然后继续原来的程序。这里有个关键点DMAC需要占用总线。因为数据是在主存和设备之间直接传送的主存和设备的连接通道就是系统总线。DMAC要搬运数据就必须获得总线的控制权。那么问题来了——总线是CPU和主存之间的公共通道DMAC用了CPU就不能用。怎么协调这个冲突这就引出了DMA的三种总线控制方式。2.3 三种DMA传送方式停止CPU访存、周期挪用、交替访存这三种方式是408的高频考点也是很多人容易混淆的地方。我一个一个拆开讲。停止CPU访存方式顾名思义当DMAC要传送数据时它向CPU发一个信号CPU收到后交出总线控制权暂停一切访存操作。DMAC趁机把一批数据全部传完然后归还总线CPU继续工作。这种方式的好处是控制简单DMAC可以连续传送效率高。坏处也很明显在DMA传送期间CPU完全不能访存如果传送的数据量很大CPU就被“冻住”了很长时间。这就像CEO把办公室钥匙交给收发室大爷大爷搬货期间CEO连门都进不去只能在走廊等着。周期挪用方式也叫周期窃取。这个方式更精细DMAC每次只“偷”一个或几个总线周期来传送一个数据单位传完之后马上把总线还给CPU。CPU在执行指令的过程中如果需要访存发现总线被DMAC占用了就等一个周期等DMAC用完再继续。这种方式对CPU的影响很小因为每次只占用一两个周期CPU几乎感觉不到。但它也有代价DMAC每次传送都要重新申请总线控制逻辑更复杂而且如果CPU和DMAC频繁争抢总线DMAC的传送效率会降低。这就像收发室大爷每次只搬一箱货搬完就把通道让出来CEO要过的时候等一秒钟就行大家轮流用通道。交替访存方式也叫透明DMA。这种方式把CPU的工作周期分成两个时间片一个给CPU访存一个给DMAC访存两者交替使用总线互不干扰。听起来很完美对吧但它有个前提条件CPU的工作周期必须比主存的存取周期长这样才有“空隙”可以分出来。如果CPU的工作周期和主存存取周期一样长那就没法交替了。这种方式不需要总线申请和归还的开销效率很高但对时序要求严格。这就像CEO和大爷商量好单号时间CEO用通道双号时间大爷用通道各走各的谁也不碍谁。对比维度停止CPU访存周期挪用交替访存总线占用方式整段时间独占每次一个周期固定时间片交替对CPU影响大完全停止访存小偶尔等待几乎无影响DMAC效率高连续传送中需反复申请高无需申请控制复杂度简单中等复杂适用场景数据量大、CPU不急通用场景CPU周期较长的系统注意408考试中经常问“哪种方式对CPU影响最小”答案是交替访存问“哪种方式控制最简单”答案是停止CPU访存。这两个别搞混了。3. DMA与中断的本质区别不只是“快慢”的问题3.1 从触发时机看两者的根本差异很多人觉得DMA就是“更快的中断”这个理解是错的。它们最根本的区别在于触发时机和响应对象不同。中断方式的触发时机是I/O设备准备好一个数据单位后向CPU发出中断请求。CPU响应的是“数据准备好了快来取”这个事件。每次中断处理的是一到几个数据单位。DMA方式的触发时机是DMAC需要占用总线传送一个数据单位时向CPU发出总线请求注意是总线请求不是中断请求。CPU响应的是“我要用一下总线”这个事件。而真正的中断信号是在整批数据全部传送完毕后才发出的。换句话说中断是“每个数据都找你”DMA是“搬完了再找你”。这个区别决定了两者在数据传送粒度上的本质不同。3.2 中断服务程序与DMA控制器的分工在中断方式下数据传送的实际工作是由CPU执行中断服务程序来完成的。CPU需要执行指令从设备端口读数据、写到主存、修改地址指针、修改计数器、判断是否结束。这些都是CPU在干活。在DMA方式下数据传送的实际工作是由DMAC硬件完成的。CPU不需要执行任何指令来搬运数据它只是在开始前做初始化设置寄存器结束后做收尾处理中断。中间的大量搬运工作全是DMAC的硬件逻辑在跑。这个区别带来的性能差异是巨大的。中断方式下每传送一个字CPU要执行若干条指令假设每条指令需要几个时钟周期那传送1024个字可能需要几万个时钟周期。DMA方式下每个字的传送只需要DMAC占用一个总线周期1024个字就是1024个总线周期加上初始化和收尾的开销总共可能只需要几千个时钟周期。差距在十倍以上。3.3 优先级问题DMA请求为什么比中断请求优先级高这是一个常考的知识点。在同一个系统中DMA请求和中断请求可能同时存在。比如CPU正在处理一个中断同时DMAC发来了总线请求。这时候应该先响应谁答案是DMA请求优先级更高。原因很简单DMA请求对应的是数据传送如果不及响应数据可能丢失比如设备的数据缓冲寄存器满了新数据来了就覆盖了。而中断请求对应的是CPU的软件处理晚一点响应通常不会造成数据丢失。所以硬件设计上DMA请求的优先级高于中断请求。但这里有个细节DMA请求和中断请求的优先级比较是在同一个设备的语境下。如果是不同设备那还要看各自的优先级设置。408考试中一般默认DMA请求优先于中断请求。实操心得很多人在做408大题时看到“CPU正在执行中断服务程序此时DMA请求到达”就懵了。记住一个原则——DMA请求可以打断中断服务程序因为DMA不涉及CPU执行指令只是借用总线。CPU在执行中断服务程序时如果DMAC要总线CPU会让出总线在周期挪用方式下等DMAC用完再继续。4. DMA传送的完整实操流程与参数计算4.1 初始化阶段CPU需要做哪些准备工作DMA传送不是一上来就能跑的CPU必须先做初始化。这个初始化过程在408中经常以“写出初始化程序的关键步骤”或“说明CPU需要设置哪些寄存器”的形式出现。具体来说CPU需要做以下几件事第一设置主存起始地址。把数据要写入或读出的主存首地址写入DMAC的地址寄存器AR。比如要从磁盘读取数据到主存地址0x1000开始的位置就把0x1000写入AR。第二设置传送字数。把要传送的数据单位总数写入字计数器WC。注意这里的单位是“数据单位”可能是字节、字或块具体取决于系统设计。408题目中通常会明确说明。第三设置设备地址。把I/O设备的地址或设备号写入设备地址寄存器DAR。第四设置传送方向。通过控制寄存器设置是“读”设备到主存还是“写”主存到设备。第五启动DMAC。向DMAC的控制寄存器写入启动位DMAC开始工作。这五步做完之后CPU就可以去执行其他程序了。DMAC会独立完成后续的数据搬运。4.2 数据传送阶段DMAC如何接管总线DMAC启动后进入数据传送阶段。这个阶段的核心是总线仲裁。DMAC需要通过总线仲裁器向CPU申请总线控制权。具体过程取决于前面说的三种方式在停止CPU访存方式下DMAC发出总线请求信号HOLDCPU收到后发出总线响应信号HLDACPU的三态门进入高阻态放弃总线。DMAC获得总线后连续传送所有数据传完后释放总线。在周期挪用方式下DMAC每次传送前发出总线请求获得一个总线周期后传送一个数据单位然后立即释放总线。CPU在下个周期就可以继续访存。在交替访存方式下不需要总线请求和响应信号CPU和DMAC按照固定的时间片交替使用总线。每次传送一个数据单位时DMAC做的事情是把设备的数据读入数据缓冲寄存器DR然后把DR的内容写到主存AR指向的地址或反过来然后AR加1WC减1。4.3 传送结束阶段中断收尾与状态检查当WC减到0时DMAC知道所有数据都传完了。它会做两件事一是释放总线如果还占着的话二是向CPU发出中断请求。CPU响应中断后执行中断服务程序检查DMAC的状态寄存器确认传送过程中有没有出错比如设备故障、校验错误等然后做相应的处理。这里有个容易忽略的点DMA传送结束后CPU需要检查数据是否完整。虽然DMAC硬件保证了传送过程的正确性但设备端可能出问题。所以中断服务程序里通常会有校验逻辑。4.4 参数计算实例从408真题看DMA的时间开销我拿一个典型的408计算题来演示。假设某系统采用周期挪用方式主存存取周期为500nsCPU工作周期为1μs。DMAC每次传送一个32位字需要占用一个主存存取周期。现在要从磁盘读取4KB数据到主存磁盘的数据传输率为2MB/s。问DMA传送期间CPU被“偷走”了多少时间先算数据量4KB 4096字节 1024个32位字。每个字传送占用一个主存存取周期即500ns。1024个字总共占用1024 × 500ns 512000ns 512μs。但这里要注意周期挪用方式下DMAC每次传送后要释放总线CPU可能插入自己的访存操作。所以实际的时间还要看CPU的访存频率。如果CPU每个工作周期1μs访存一次那在512μs内CPU大约访存512次DMAC传送1024次两者交替进行总时间大约是1024 × 500ns 512 × 1μs 512μs 512μs 1024μs。这个计算说明周期挪用方式下DMA传送的总时间不仅取决于DMAC的传送速度还取决于CPU的访存频率。两者会互相“插队”导致总时间比纯DMAC传送时间要长。提示408考试中做这类计算题关键是分清“主存存取周期”和“CPU工作周期”这两个概念。主存存取周期是主存完成一次读写所需的时间CPU工作周期是CPU完成一个基本操作如取指、译码的时间。两者不一定相等。5. 常见问题与排查技巧实录5.1 为什么DMA传送过程中CPU不能访存这个问题看似简单但很多人答不完整。根本原因是系统总线是共享资源。主存只有一套地址线和数据线同一时刻只能被一个主设备驱动。DMAC在传送数据时它需要驱动地址线给出主存地址和数据线传输数据。如果CPU同时也驱动这些线就会发生冲突导致数据错误甚至硬件损坏。所以必须通过总线仲裁机制保证同一时刻只有一个主设备控制总线。在停止CPU访存方式下CPU完全放弃总线所以不能访存。在周期挪用方式下CPU只是在DMAC占用总线的那一个周期内不能访存其他周期可以。在交替访存方式下CPU和DMAC分时使用各自在自己的时间片内访存。5.2 DMA请求和中断请求同时到达怎么办前面提过DMA请求优先级更高。但具体处理方式取决于硬件设计。一般来说CPU会先响应DMA请求让DMAC完成一个数据单位的传送或一批传送然后再响应中断请求。如果中断请求在DMA传送期间一直保持那DMA传送结束后CPU会立即响应中断。这里有个细节如果DMA采用停止CPU访存方式那在DMA传送期间CPU完全不能响应中断因为CPU已经放弃总线了。中断请求会被锁存等DMA传送结束后再响应。如果采用周期挪用方式CPU在DMAC不占用总线的周期里可以响应中断。5.3 DMA方式下数据传送的完整性如何保证DMA传送不经过CPU那怎么保证数据不出错主要靠以下几个机制地址和计数器的硬件校验DMAC内部的AR和WC是硬件寄存器不会因为软件bug而错误修改。传送结束的中断检查CPU在中断服务程序中检查DMAC的状态寄存器确认传送过程中没有异常。设备端的校验很多I/O设备自带校验逻辑如CRC校验、奇偶校验在数据传送到DMAC之前就已经校验过了。主存的ECC校验主存通常有ECC纠错码机制能检测和纠正单位错误。实操心得408考试中如果问“DMA方式是否完全不需要CPU参与”答案是“需要但只在开始和结束时”。开始时的初始化设置寄存器和结束时的中断处理检查状态都需要CPU。中间的数据搬运不需要CPU。5.4 常见问题速查表问题原因解决方法/答案DMA传送期间CPU能否执行程序取决于DMA方式停止CPU访存不能访存但可执行非访存指令周期挪用基本可以交替访存完全可以DMA请求和中断请求谁优先DMA请求优先级更高硬件仲裁逻辑保证DMA优先DMA传送结束后CPU如何知道DMAC发中断请求CPU执行中断服务程序检查状态周期挪用方式下DMAC每次传多少一个数据单位传完立即释放总线DMA方式能否传送大量数据可以只需初始化一次DMAC自动完成整批传送DMA控制器的地址寄存器如何变化每传一个数据单位自动加1由硬件自动完成不需要CPU干预6. 从408考点到实际系统DMA的工程实现细节6.1 408考试中DMA的常见出题角度翻遍历年408真题DMA相关的题目主要集中在以下几个角度第一三种传送方式的对比。这是最高频的考点通常以选择题形式出现问“哪种方式对CPU影响最小”“哪种方式控制最简单”“哪种方式需要CPU周期比主存存取周期长”等。第二DMA与中断的区别。常考的点包括触发时机、响应对象、优先级、数据传送粒度、CPU参与程度等。第三DMA传送的时间计算。给出主存存取周期、CPU工作周期、数据量等参数计算DMA传送的总时间或CPU被占用的时间比例。第四DMA控制器的组成和工作流程。问DMAC需要哪些寄存器、初始化时需要设置什么、传送结束后如何通知CPU等。第五DMA方式下的总线仲裁。问总线请求和总线响应的信号名称、优先级关系、三态门的作用等。6.2 实际系统中DMA的配置要点虽然408考的是原理但了解实际系统中的DMA配置对理解原理很有帮助。以常见的嵌入式系统为例配置一次DMA传送通常需要设置以下参数源地址数据从哪里来可以是主存地址也可以是外设数据寄存器地址。目的地址数据到哪里去。传送长度要传多少个数据单位。数据宽度每次传8位、16位还是32位。传送模式单次传送、循环传送、还是连续传送。优先级多个DMA通道同时请求时的优先级。中断使能传送结束后是否产生中断。这些参数和408中讲的DMAC寄存器是一一对应的。源地址和目的地址对应AR和DAR传送长度对应WC数据宽度和传送模式对应控制寄存器中断使能对应中断控制逻辑。6.3 DMA方式在存储层次中的位置从存储层次的角度看DMA传送的数据路径是I/O设备 → 设备控制器 → DMAC → 系统总线 → 主存。数据不经过CPU的寄存器也不经过Cache除非系统设计特别指定。这一点很重要因为如果数据经过Cache就可能出现Cache和主存数据不一致的问题。在实际系统中DMA传送通常需要绕过Cache或者进行Cache一致性维护。绕过Cache的方式叫“非一致性DMA”需要软件在传送前后做Cache刷新。进行一致性维护的方式叫“一致性DMA”硬件自动处理Cache和主存的同步。408考试中一般不涉及Cache一致性问题但了解这个背景有助于理解DMA在存储层次中的位置。注意408考试中如果题目没有特别说明默认DMA传送不经过Cache直接在主存和设备之间进行。7. 我踩过的坑与最后几句实在话学DMA这块内容我见过太多人卡在几个固定的地方。第一个坑是把DMA和中断混为一谈觉得DMA就是“批量中断”。这个理解会导致后面所有关于优先级、响应时机、CPU参与程度的题目全错。记住中断是CPU用软件搬数据DMA是硬件搬数据这是本质区别。第二个坑是搞不清三种传送方式的适用场景。停止CPU访存不是“落后”的方式它在数据量大、CPU不急的场景下反而效率最高。周期挪用不是“万能”的它在CPU访存频繁时会导致DMAC效率下降。交替访存不是“随便用”的它要求CPU周期比主存存取周期长。每种方式都有它的适用条件考试考的就是你能不能根据场景选对方式。第三个坑是忽略DMA传送的“开始”和“结束”阶段。很多人只关注中间的数据搬运忘了CPU在开始前要做初始化、结束后要处理中断。408大题经常在这里设陷阱比如问“DMA传送4KB数据CPU需要执行多少条指令”答案不是0因为初始化和中断处理都需要指令。最后一个实在话DMA这块内容光看教材不够一定要动手做几道真题。唐朔飞教材的课后题、白中英版本的习题、以及历年408真题把DMA相关的题目全部刷一遍你会发现考点其实很集中。做错的题标记出来过一周再做一遍直到能闭着眼睛说出三种传送方式的区别和DMA与中断的五个不同点。到那个时候DMA就不再是丢分点了而是你的送分题。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进