ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

计算机组成原理:DMA方式与I/O控制方式详解及408真题解析

计算机组成原理:DMA方式与I/O控制方式详解及408真题解析 1. 从一道408真题说起DMA到底在考什么如果你正在准备计算机408统考或者本科学计算机组成原理那“I/O设备与主机进行信息传送的控制方式”这一块内容你一定绕不过去。程序查询方式、中断方式、DMA方式这三种I/O控制方式几乎是每年必考的内容而其中DMA方式又是重中之重。2024年408第45题就考了DMA相关的知识点很多同学考完之后在群里讨论发现自己对DMA的理解只停留在“不需要CPU干预”这个层面具体到传输过程、周期挪用、与中断的区别就说不清楚了。这篇文章就是要把DMA方式从头到尾拆解一遍。我会从为什么需要DMA讲起把程序查询、中断、DMA三种方式的演进逻辑理清楚然后深入到DMA控制器的内部结构、三种DMA传送方式停止CPU访存、周期挪用、交替访存的取舍再结合408真题的考法把容易混淆的知识点逐一击破。不管你是考研党还是正在学这门课的学生看完之后应该能对DMA有一个系统性的理解而不是零散地背几个结论。先给一个最直观的认知DMA的全称是Direct Memory Access直接存储器存取。它的核心思想是让外设和主存之间直接进行数据传送不需要CPU一条一条地执行指令来搬运数据。你可以把CPU想象成一个公司的CEO程序查询方式是CEO亲自去前台取快递中断方式是前台打电话通知CEO去取而DMA方式是CEO直接授权给一个专门的助理DMA控制器让助理去处理快递的事CEO该干嘛干嘛。这个类比虽然简化了很多细节但能帮你快速抓住DMA的本质——数据搬运这件事从CPU手里剥离出来交给专门的硬件去做。2. 三种I/O控制方式的演进逻辑2.1 程序查询方式最原始但最费CPU程序查询方式的工作流程很朴素CPU不断读取设备状态寄存器检查设备是否准备好。如果没准备好就继续循环等待如果准备好了就执行一次数据传送然后继续等待下一次。这种方式的问题非常明显——CPU的时间几乎全部浪费在“等待”上。假设一个设备的数据传输速率是1MB/s每次传送1个字节那么CPU每秒要查询一百万次期间什么都干不了。在408的考试中程序查询方式的考点通常集中在“CPU与I/O设备串行工作”这个特征上。也就是说CPU启动设备后必须一直等待设备完成才能继续执行后续指令。这种方式的优点是硬件结构简单不需要额外的中断控制器或DMA控制器但缺点就是CPU利用率极低。在实际系统中程序查询方式只用于那些对实时性要求极高、但数据量极小的场景比如某些嵌入式系统中的按键检测。2.2 中断方式让CPU从等待中解放中断方式的核心改进是CPU启动设备后不再等待而是继续执行其他程序。当设备完成数据准备后主动向CPU发送一个中断信号CPU收到信号后暂停当前程序转去执行中断服务程序完成数据传送后再返回原程序。这样一来CPU在设备工作期间可以执行其他任务利用率大幅提升。但中断方式也有它的瓶颈。每次数据传送都需要CPU执行中断服务程序包括保存现场、恢复现场、执行传送指令等操作。如果设备的数据传输速率很高比如磁盘或网卡中断频率会非常高CPU的大部分时间都花在处理中断上真正用于计算的时间反而很少。这就是所谓的“中断风暴”问题。在408的考题中中断方式经常和DMA方式放在一起对比考查两者在CPU干预程度、传输单位、适用场景上的区别。2.3 DMA方式让硬件接管数据搬运DMA方式的出现就是为了解决高速设备与主存之间大批量数据传送时CPU开销过大的问题。DMA控制器DMAC可以独立于CPU直接控制外设和主存之间的数据传送。CPU只需要在传送开始前初始化DMAC设置好源地址、目的地址、传送长度等参数然后启动DMAC。DMAC会自动完成所有数据的搬运工作传送结束后再通过中断通知CPU。这里有一个关键点需要理解DMA方式并没有完全消除CPU的干预而是把干预的粒度从“每个数据”变成了“每个数据块”。CPU只需要在传送开始和结束时介入中间的过程完全由DMAC硬件完成。这就是DMA方式与中断方式的本质区别——中断方式是每传送一个数据就中断一次DMA方式是传送一整块数据后才中断一次。对比维度程序查询方式中断方式DMA方式CPU干预频率每个数据都干预每个数据都干预每个数据块干预一次数据传送方向CPU→设备或设备→CPUCPU→设备或设备→CPU设备↔主存直接传送CPU与I/O并行性完全串行部分并行高度并行适用场景低速、简单设备中低速设备高速、大批量设备硬件复杂度最低中等最高3. DMA控制器的内部结构与工作原理3.1 DMA控制器的核心组成DMA控制器并不是一个简单的“搬运工”它内部有多个寄存器协同工作。在408的考试范围内你需要掌握以下几个核心部件主存地址寄存器AR存放当前要传送的数据在主存中的地址。每传送一个数据AR自动加1或减1指向下一个存储单元。字计数器WC记录剩余需要传送的数据个数。每传送一个数据WC自动减1当WC减到0时表示传送完成DMAC向CPU发出中断请求。数据缓冲寄存器DR暂时存放正在传送的数据。对于输入操作设备将数据送入DR然后DMAC将DR中的数据写入主存对于输出操作DMAC从主存读取数据放入DR然后设备从DR中取走数据。设备地址寄存器DAR存放I/O设备的地址用于选择具体的设备。控制与状态逻辑包括命令寄存器、状态寄存器、中断控制逻辑等负责协调DMAC内部各部件的工作以及与CPU和I/O设备的通信。这些寄存器在DMA传送开始前由CPU通过程序进行初始化。初始化的过程通常是CPU将主存起始地址写入AR将传送数据个数写入WC将设备地址写入DAR然后设置控制寄存器的方向位输入还是输出和启动位。一旦启动位被置1DMAC就开始工作。3.2 DMA的三种传送方式DMA控制器与CPU共享主存这就产生了一个问题当DMAC需要访问主存时CPU可能也在访问主存两者会发生冲突。为了解决这个冲突有三种常见的DMA传送方式停止CPU访存方式当DMAC需要访问主存时它向CPU发送一个总线请求信号CPU收到信号后暂停对总线的使用将总线控制权交给DMAC。DMAC完成一个数据传送后立即释放总线CPU继续执行。这种方式下DMAC每传送一个数据就占用一次总线CPU的访存操作会被频繁打断。优点是控制简单缺点是CPU的效率受到较大影响。周期挪用方式DMAC在CPU不使用总线的时候“偷”一个总线周期来完成数据传送。具体来说DMAC会检测CPU是否正在使用总线如果CPU正在执行不需要访存的指令DMAC就可以利用这个空隙完成一次传送。如果CPU正在访存DMAC会等待CPU完成当前总线周期后再挪用。这种方式下DMAC不需要停止CPU的工作只是“借用”了一些空闲的总线周期。周期挪用方式在408考试中出现频率很高经常考它的特点和与停止CPU方式的区别。交替访存方式将CPU的工作周期分为两个部分一部分用于CPU访存另一部分用于DMAC访存两者交替使用总线。这种方式下CPU和DMAC各自使用固定的时间片不需要总线请求和响应过程控制更加简单。但缺点是CPU和DMAC的访存时间都被限制在各自的时间片内灵活性较差。这种方式适用于CPU和DMAC的访存速度都比较稳定的场景。注意在408考试中周期挪用方式是最常考的一种因为它体现了DMA“窃取”总线周期的核心思想。你需要能够区分“停止CPU访存”和“周期挪用”在CPU效率、控制复杂度上的差异。3.3 DMA传送的完整流程一次完整的DMA传送包括以下几个阶段初始化阶段CPU执行程序将主存起始地址、传送数据个数、设备地址、传送方向等信息写入DMAC的相应寄存器然后启动DMAC。DMA请求阶段I/O设备准备好数据后向DMAC发送DMA请求信号DREQ。DMA响应阶段DMAC收到DREQ后向CPU发送总线请求信号HRQ。CPU在当前总线周期结束后向DMAC发送总线响应信号HLDA并将总线控制权交给DMAC。数据传送阶段DMAC获得总线控制权后向I/O设备发送DMA响应信号DACK然后执行数据传送。对于输入操作DMAC从设备读取数据写入主存对于输出操作DMAC从主存读取数据写入设备。每传送一个数据AR和WC自动更新。传送结束阶段当WC减到0时DMAC向CPU发送中断请求CPU执行中断服务程序完成后续处理如检查传送是否正确、启动下一次传送等。这个流程中CPU只在初始化和结束时介入中间的数据传送完全由DMAC硬件完成。这就是DMA方式高效的根本原因。4. 408真题中的DMA考点与解题思路4.1 2024年45题考了什么2024年408第45题考查的是DMA方式与中断方式的对比。题目给出了一个具体的场景某系统使用DMA方式从磁盘读取数据到主存要求计算在DMA传送过程中CPU需要干预的次数以及DMA传送与中断传送在时间开销上的差异。这道题的核心考点是DMA方式下CPU的干预次数等于数据块的数量而不是数据的总个数。很多同学在考场上犯的错误是把DMA传送和中断传送的CPU干预次数搞混了。中断方式是每传送一个数据就中断一次所以CPU干预次数等于数据个数DMA方式是每传送一个数据块才中断一次所以CPU干预次数等于数据块的数量。如果题目中一个数据块包含1000个数据那么DMA方式的CPU干预次数就是中断方式的千分之一。4.2 常见题型与解题模板在408的历年真题中DMA相关的题目主要有以下几种类型类型一计算CPU干预次数。题目给出数据总量和数据块大小要求计算DMA方式和中断方式下CPU的干预次数。解题关键是区分“数据个数”和“数据块数量”。类型二计算DMA传送时间。题目给出设备的数据传输速率、主存的存取周期、DMA传送方式停止CPU访存或周期挪用要求计算完成一次DMA传送所需的总时间。解题时需要注意停止CPU访存方式下每个数据的传送都会占用一个完整的总线周期周期挪用方式下DMAC只在CPU不访存时挪用总线周期传送时间取决于CPU的访存频率。类型三判断DMA与中断的区别。题目给出若干描述要求判断哪些是DMA的特点哪些是中断的特点。常见的混淆点包括DMA传送不需要CPU执行指令、DMA传送的数据不经过CPU寄存器、DMA传送的优先级高于中断等。类型四DMA控制器的寄存器作用。题目给出DMA控制器的结构图要求指出AR、WC、DR等寄存器的作用或者给出传送过程要求填写寄存器的变化情况。4.3 易错点与避坑指南在复习DMA这一块时有几个容易踩的坑需要特别注意第一个坑混淆DMA请求和中断请求。DMA请求是I/O设备向DMAC发出的请求DMAC启动一次数据传送中断请求是DMAC或I/O设备向CPU发出的请求CPU处理传送完成后的后续工作。两者的发起方和接收方都不同。第二个坑认为DMA传送完全不需要CPU。实际上DMA传送的初始化和结束阶段都需要CPU参与。初始化阶段CPU要设置DMAC的寄存器结束阶段CPU要执行中断服务程序。DMA只是把中间的数据搬运工作从CPU手里拿走了。第三个坑混淆周期挪用和停止CPU访存。周期挪用方式下DMAC只在CPU不访存的时候挪用总线周期CPU的访存操作不会被中断停止CPU访存方式下DMAC会强制CPU暂停访存直到DMAC完成当前数据传送。两者的CPU效率和控制复杂度都不同。第四个坑忽略DMA传送的优先级。在大多数系统中DMA请求的优先级高于中断请求。因为DMA传送的是高速设备的数据如果被中断打断可能会导致数据丢失。这一点在408的选择题中经常考到。提示做DMA相关的题目时先画一个时间轴把CPU访存、DMAC访存、设备工作的时间关系标出来很多问题就一目了然了。5. DMA在实际系统中的应用与扩展5.1 DMA在嵌入式系统中的应用虽然408考试主要考查DMA的理论知识但了解DMA在实际系统中的应用能帮你更好地理解它的价值。在STM32等嵌入式微控制器中DMA是一个非常重要的外设。比如用STM32做ADC多通道采集时如果不使用DMACPU需要在每次ADC转换完成后读取转换结果这会占用大量CPU时间。使用DMA后ADC转换完成的数据会自动通过DMA传送到内存中的数组CPU只需要在采集完成后处理数据即可。在串口通信中DMA也经常被用来实现高效的数据收发。比如STM32的UART配合DMA可以实现不定长数据的接收通过“DMA空闲中断”的方式当一帧数据接收完成后空闲中断触发CPU再去处理接收到的数据。这种方式比传统的每字节中断方式效率高得多。5.2 DMA与虚拟内存的交互在现代操作系统中DMA还需要与虚拟内存系统协同工作。由于DMA控制器直接访问物理内存而CPU访问的是虚拟内存这就产生了一个问题DMA传送的目标地址是物理地址还是虚拟地址如果DMA使用虚拟地址那么当页面被换出时DMA传送可能会失败。因此操作系统通常会在DMA传送期间锁定相关页面防止它们被换出。这个机制叫做“页面锁定”或“DMA一致性维护”。在Linux内核中DMA相关的API包括dma_alloc_coherent、dma_map_single等用于分配DMA缓冲区和建立DMA映射。这些API会处理缓存一致性问题确保CPU和DMA控制器看到的数据是一致的。如果你以后从事驱动开发这些知识会非常有用。5.3 DMA技术的发展从传统DMA到描述符DMA传统的DMA控制器一次只能处理一个数据块的传送传送完成后需要CPU重新初始化才能进行下一次传送。为了提高效率现代DMA控制器支持“描述符DMA”或“链式DMA”。CPU可以预先构建一个描述符链表每个描述符包含一个数据块的源地址、目的地址、长度等信息。DMAC自动按顺序处理链表中的每个描述符完成多个数据块的连续传送中间不需要CPU干预。这种方式进一步降低了CPU的开销适用于网络数据包处理、磁盘I/O等场景。在408的考试范围内描述符DMA不是必考内容但了解这个扩展知识能帮你建立更完整的知识体系。如果你在复试或面试中被问到DMA的优化方向描述符DMA是一个很好的切入点。6. 复习DMA的实操建议与记忆方法6.1 用对比表格梳理三种I/O方式复习DMA时最有效的方法是把程序查询、中断、DMA三种方式放在一起对比。你可以自己画一个表格从CPU干预频率、数据传送单位、硬件复杂度、适用场景、CPU与I/O的并行性等维度进行对比。这个表格不需要死记硬背而是要在理解每种方式的设计动机的基础上自然推导出来。比如程序查询方式之所以CPU干预频率最高是因为它没有中断机制CPU必须不断轮询设备状态DMA方式之所以CPU干预频率最低是因为它把数据搬运工作交给了硬件。6.2 用时间轴理解DMA传送过程DMA传送过程涉及CPU、DMAC、I/O设备三方的协同工作单纯看文字描述容易混乱。建议你画一个时间轴横轴表示时间纵轴分别表示CPU、DMAC、I/O设备的活动。在时间轴上标出DMA请求、总线请求、总线响应、数据传送、中断请求等关键事件的发生时刻。画完一遍之后你对DMA传送流程的理解会深刻很多。6.3 用真题检验理解程度408历年真题中涉及DMA的题目不少除了2024年的45题还有2019年、2017年、2015年等多道题目。建议你把近十年的DMA相关真题都做一遍做完之后对照答案分析自己的错误原因。如果错误集中在“CPU干预次数”的计算上说明你对DMA传送单位数据块的理解还不够清晰如果错误集中在“周期挪用”和“停止CPU访存”的区分上说明你对总线控制权的转移过程还不够熟悉。6.4 常见问题速查表问题原因解决方法分不清DMA请求和中断请求两者都涉及“请求”二字DMA请求是设备→DMAC中断请求是DMAC→CPU认为DMA传送不需要CPU忽略了初始化和结束阶段记住CPU在DMA传送前后都要介入混淆周期挪用和停止CPU访存两者都涉及总线控制权转移周期挪用是“偷空闲”停止CPU是“强制暂停”计算CPU干预次数时出错混淆了数据个数和数据块数量先确定传送单位是“数据”还是“数据块”忽略DMA优先级高于中断没有理解高速设备的数据丢失风险记住DMA请求通常屏蔽中断请求提示如果你在考试中遇到DMA相关的题目先花30秒把题目中的关键信息提取出来——数据总量、数据块大小、传送方式、设备速率。然后根据这些信息判断题目考查的是哪个知识点再套用相应的解题模板。7. 从DMA看计算机组成原理的学习方法学计算机组成原理最忌讳的就是死记硬背。DMA这一块内容如果你只是背“DMA不需要CPU干预”“DMA传送的是数据块”这些结论考试时稍微换个问法你就懵了。真正有效的学习方法是从问题出发理解每种技术的设计动机。程序查询方式为什么效率低因为它让CPU在等待中浪费了大量时间。中断方式为什么比程序查询方式好因为它让CPU在设备工作期间可以执行其他任务。DMA方式为什么比中断方式好因为中断方式下CPU仍然需要为每个数据执行中断服务程序而DMA方式把数据搬运工作完全交给了硬件。每一步演进都是为了解决前一种方式的某个具体问题理解了这个问题你就理解了这种技术的核心。我在复习这一块的时候习惯把每种I/O控制方式想象成一个具体的场景。比如程序查询方式就像你在快递柜前一直等快递员来投递中断方式就像快递员到了给你打电话DMA方式就像你雇了一个跑腿小哥帮你取快递。这些类比不一定完全准确但它们能帮你快速建立直觉。有了直觉之后再去抠细节比如DMA控制器的寄存器有哪些、周期挪用方式具体怎么挪用总线周期就会容易很多。最后再分享一个小技巧如果你在考场上遇到DMA的题目先不要急着套公式而是先问自己一个问题——“这道题考的是DMA的哪个特点”是CPU干预频率低是数据不经过CPU是优先级高于中断还是周期挪用方式的总线控制权转移确定了考点之后再去找对应的解题方法正确率会高很多。
返回列表