ARTICLE DETAIL

资讯详情

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

计算机组成原理:DMA方式原理、结构及408考点全解析

计算机组成原理:DMA方式原理、结构及408考点全解析 1. 从一道408真题说起DMA到底在考什么如果你正在准备计算机408统考或者本科学计算机组成原理DMA方式这个知识点你一定绕不过去。它几乎每年都以选择题或综合题的形式出现而且出题角度越来越刁钻——不再只是问你“DMA是什么”而是给你一个具体场景让你判断该用哪种传送控制方式、DMA控制器里某个寄存器的位宽是多少、数据通路经过哪些部件。我先亮明这篇博文的核心定位围绕计算机组成原理中I/O设备与主机之间信息传送的控制方式重点拆解DMA方式的原理、结构、工作流程和考试要点。适合正在备考408的考研党、正在学计组的本科生以及想从底层理解DMA机制的后端/嵌入式开发者。不管你是为了考试还是为了搞懂STM32里的DMA为什么能“不占CPU”这篇文章都会把来龙去脉讲透。很多人学DMA的时候有个误区觉得它就是一个“搬运工”CPU告诉它搬什么它就搬什么。这个理解不能说错但太浅了。考试不会只考这么浅的东西。408真题里经常出现的考法是给你一个DMA控制器的结构图问你某个部件的作用或者给你一个数据传输场景让你算DMA传送占用的总线周期数再或者拿DMA和中断方式做对比让你分析各自的适用场景。所以这篇内容我会从“为什么需要DMA”讲起把程序查询、程序中断、DMA三种方式的本质区别掰开揉碎然后深入DMA控制器的内部结构把每个寄存器的功能、每条信号线的作用都讲清楚。接着我会用一道典型的408真题来演示解题思路最后补充一些实际开发中比如STM32的DMA配置和考试知识点之间的对应关系帮你把理论和实践串起来。注意DMA这个知识点在408中的分值通常不高但它是“存储器管理”和“I/O系统”两个章节的交汇点很容易出综合题。复习的时候不要孤立地背概念要把它放到整个I/O体系里去理解。2. 三种I/O控制方式的本质差异为什么DMA是必然选择2.1 程序查询方式CPU当“监工”效率最低程序查询方式是最原始的I/O控制方式。它的工作逻辑非常简单CPU不断读取I/O设备的状态寄存器判断设备是否准备好如果准备好了就传送一个数据单位然后继续循环等待。你可以把它想象成一个老板每隔五分钟就去车间看一眼工人有没有做完手上的活。CPU在这里就是那个老板I/O设备就是工人。问题在于CPU的时间全花在“看”上了真正干活的时间被严重压缩。这种方式有几个致命缺陷。第一CPU和I/O设备是串行工作的CPU在查询期间不能做其他任何事情。第二查询操作本身要占用总线读取状态寄存器的操作也是一次总线访问。第三当I/O设备速度远低于CPU时比如键盘、鼠标CPU绝大部分时间都在做无效查询浪费极其严重。在408考试中程序查询方式经常作为“反面教材”出现用来和中断方式、DMA方式做对比。你需要记住它的核心特征CPU主动查询、串行工作、数据传送必须经过CPU。2.2 程序中断方式CPU从“监工”变成“随叫随到”程序中断方式的核心改进是CPU不再主动查询设备状态而是等设备准备好之后主动“通知”CPU。这个通知信号就是中断请求。工作流程变成了这样CPU启动I/O设备后继续执行主程序设备完成一个数据单位的传送后发出中断请求CPU响应中断暂停当前程序转去执行中断服务程序完成数据传送然后返回原程序继续执行。这就像老板不再去车间巡视了而是给工人配了一个呼叫按钮工人做完一个零件就按一下按钮老板听到铃声就过来处理。CPU的利用率大幅提升因为它在设备工作期间可以执行其他程序。但中断方式也有瓶颈。每传送一个数据单位比如一个字节或一个字就要进行一次中断响应、保护现场、执行中断服务程序、恢复现场。对于高速I/O设备比如磁盘、网卡数据传送频率极高如果每个字节都中断一次CPU会被中断淹没大部分时间都花在保护/恢复现场上了真正用于计算的时间反而很少。这里有一个关键的计算假设磁盘传输率为10MB/s每次中断处理需要20微秒那么每秒需要中断10M次光中断处理就需要200秒——显然不可能。所以中断方式只适合低速或中速设备。2.3 DMA方式让数据自己“跑”CPU只负责发令DMADirect Memory Access直接存储器访问方式的核心思想是在I/O设备和主存之间开辟一条直接数据通路数据传送不需要经过CPU。CPU只需要在传送开始前做一些初始化工作告诉DMA控制器数据从哪来、到哪去、传多少、什么时候开始。然后CPU就可以去干别的事了。DMA控制器会接管总线控制权直接在I/O设备和主存之间搬运数据。一批数据全部传送完毕后DMA控制器再向CPU发一个中断告诉它“活干完了”。用一个类比来说程序查询是老板亲自搬货中断方式是老板每搬一箱就接一个电话确认DMA方式是老板雇了一个搬运工DMA控制器告诉他一共搬多少箱、从哪搬到哪然后老板去开会了搬运工搬完了再通知老板一声。这三种方式的对比可以用一个表格来总结对比维度程序查询程序中断DMACPU参与程度全程参与每个数据单位参与一次仅初始化和结束时参与数据通路经过CPU经过CPU不经过CPU直接内存-设备并行能力CPU与I/O串行CPU与I/O并行CPU与I/O并行适用设备极低速低速/中速高速/大批量中断次数无中断每个数据单位一次每批数据一次优先级最低较高最高总线级提示408考试中经常考“DMA方式不需要CPU干预”这个说法是否正确。严格来说DMA在初始化和结束时需要CPU参与传送过程中不需要。所以“完全不需要CPU”是错的“不需要CPU干预数据传送过程”是对的。3. DMA控制器的内部结构每个部件都是考点3.1 DMA控制器的基本组成DMA控制器是DMA方式的核心部件它本质上是一个能接管总线控制权的专用处理器。虽然它不像CPU那样通用但它具备控制总线、管理地址、计数数据的能力。一个典型的DMA控制器包含以下关键部件主存地址寄存器AR存放当前要访问的主存地址。每传送一个数据单位这个寄存器自动加1或减1指向下一个存储单元。字计数器WC记录还需要传送多少个数据单位。每传送一个计数器减1减到0时表示传送完毕发出中断请求。数据缓冲寄存器DR暂存每次传送的数据。对于某些DMA控制器数据可能直接通过总线传输而不经过缓冲但考试中通常认为有一个缓冲寄存器。设备地址寄存器DAR存放I/O设备的地址或设备号用于选择要通信的设备。控制/状态逻辑包括命令寄存器、状态寄存器、中断控制逻辑等负责接收CPU的命令、产生总线请求信号、管理传送方向等。中断机构当字计数器减到0时向CPU发出中断请求报告DMA传送结束。这些部件在408考试中经常以结构图的形式出现让你标注名称或判断功能。我建议你不仅要记住名字还要理解每个部件为什么必须存在。比如为什么需要主存地址寄存器因为DMA要直接访问主存必须知道当前访问哪个地址。为什么需要字计数器因为DMA需要知道什么时候传完不能无限传送。3.2 DMA控制器的两种工作状态DMA控制器在系统中有两种截然不同的身份这也是考试容易混淆的地方第一种身份作为从设备CPU可以访问它。在CPU对DMA控制器进行初始化时CPU通过总线向DMA控制器的寄存器写入参数主存起始地址、传送字数、传送方向等。此时DMA控制器是被动的接收CPU的命令。第二种身份作为主设备它控制总线。在DMA传送过程中DMA控制器向CPU发出总线请求HOLD信号获得总线控制权后它成为总线的主控者直接控制地址总线、数据总线和控制总线在主存和I/O设备之间传送数据。这两种身份的切换是DMA工作的关键。考试中经常问DMA控制器在什么时候作为主设备答案是在DMA传送期间。什么时候作为从设备答案是在CPU初始化DMA控制器时以及DMA传送结束后CPU读取状态时。3.3 DMA控制器的数据传送流程DMA的数据传送流程可以分为三个阶段第一阶段初始化。CPU执行几条指令把主存起始地址写入AR把传送字数写入WC把设备地址写入DAR把传送方向读/写和控制信息写入命令寄存器。然后CPU启动I/O设备继续执行主程序。第二阶段数据传送。I/O设备准备好一个数据单位后向DMA控制器发出DMA请求DREQ。DMA控制器向CPU发出总线请求HOLD。CPU在当前总线周期结束后发出总线响应HLDA让出总线控制权。DMA控制器获得总线控制权后向I/O设备发出DMA响应DACK然后执行一次数据传送从I/O设备读数据写入主存或从主存读数据写入I/O设备。每传送一个数据单位AR加1WC减1。第三阶段结束处理。当WC减到0时DMA控制器释放总线向CPU发出中断请求。CPU响应中断执行中断服务程序检查DMA状态完成后续处理比如通知应用程序数据已就绪。这个流程在408中经常以时序图或流程图的形式出现你需要能准确说出每个阶段发生了什么、涉及哪些信号。4. DMA传送方式与总线仲裁考试中的高频细节4.1 三种DMA传送方式DMA控制器获得总线控制权后如何与CPU共享总线这涉及到三种不同的传送方式也是408选择题的常客停止CPU访存方式。DMA控制器获得总线控制权后CPU停止访问主存直到DMA传送完一批数据后才把总线还给CPU。这种方式控制简单但CPU在DMA传送期间完全不能访存对于高速外设可能造成CPU长时间等待。周期挪用方式周期窃取。DMA控制器每次需要传送数据时只“偷”一个或几个总线周期传送完就还给CPU。CPU在DMA传送期间可以继续执行不需要访存的指令。这种方式兼顾了CPU和DMA的需求是实际系统中最常用的方式。DMA与CPU交替访存方式。把CPU的工作周期分成两个时间片一个给CPU访存一个给DMA访存两者交替使用总线不需要总线请求和响应过程。这种方式效率高但硬件逻辑复杂且对CPU的时间划分有严格要求。这三种方式的对比是考试重点。我整理了一个表格帮你记忆传送方式总线控制权CPU访存适用场景硬件复杂度停止CPU访存DMA独占禁止高速大批量简单周期挪用交替占用允许非DMA周期高速外设中等交替访存分时复用分时允许高速系统复杂注意周期挪用方式中DMA控制器“偷”走的总线周期可能是CPU不访存的周期也可能是CPU正在访存的周期。如果是后者CPU会被迫等待一个周期。考试中经常问“周期挪用方式下DMA传送是否影响CPU执行”答案是可能影响取决于CPU当前是否在访存。4.2 总线仲裁与优先级DMA控制器要获得总线控制权必须经过总线仲裁。在408的体系中DMA请求的优先级通常高于中断请求因为DMA传送是“时间敏感”的——如果DMA请求得不到及时响应高速I/O设备的数据可能会丢失。总线仲裁有两种基本方式链式查询和计数器定时查询。链式查询中总线允许信号BG像链条一样从一个设备传到下一个设备离总线仲裁器最近的设备优先级最高。计数器定时查询中仲裁器通过计数器的值来选择设备优先级可以通过修改计数初值来调整。DMA控制器的总线请求信号通常标记为HOLD或BR总线响应信号标记为HLDA或BG。在408真题中这些信号的名字可能不同但功能是一样的HOLD表示“我要用总线”HLDA表示“总线给你了”。4.3 DMA与中断的关系DMA和中断不是互斥的而是配合使用的。DMA在传送过程中不使用中断但在传送结束时会用中断通知CPU。所以DMA控制器内部也有中断机构只是它产生中断的频率远低于程序中断方式。考试中经常考的一个点是DMA请求和中断请求哪个优先级更高答案是DMA请求更高。原因很简单DMA请求对应的是数据传送如果延迟可能导致数据丢失中断请求对应的是CPU处理事件延迟几个周期通常不会造成严重后果。另一个常考点是DMA传送过程中CPU能否响应中断答案是可以的。因为DMA占用的是总线不是CPU。CPU在DMA传送期间可以继续执行指令也可以响应中断。但如果中断服务程序需要访存而DMA正在占用总线CPU就需要等待。5. 一道典型408真题的完整拆解5.1 题目场景还原408真题中关于DMA的题目通常长这样某计算机系统采用DMA方式传送数据已知主存带宽为XI/O设备传输率为YDMA控制器每次传送一个字节需要Z个时钟周期问CPU用于DMA传送的时间占比是多少或者DMA控制器中主存地址寄存器的位数至少是多少这类题目考察的是你对DMA工作过程的量化理解。我拿一道经典题型来演示解题思路。假设某系统的主存地址为32位数据总线宽度为32位DMA控制器每次传送32位数据。I/O设备的数据传输率为20MB/sDMA控制器每传送一个32位数据需要2个总线周期每个总线周期为50ns。问DMA传送占用的总线带宽比例是多少解题思路首先I/O设备每秒传送20MB数据即5M个32位数据20MB / 4B 5M。每个数据需要2个总线周期所以每秒需要10M个总线周期。每个总线周期50ns所以DMA每秒占用总线时间为10M × 50ns 0.5秒。也就是说DMA占用了50%的总线带宽。这道题的关键在于DMA传送占用的是总线周期不是CPU周期。考试中经常把这两个概念混在一起考你需要区分清楚。5.2 地址寄存器位数计算另一类常考题是计算DMA控制器中地址寄存器的位数。比如主存容量为4GB按字节编址DMA控制器需要能访问整个主存空间问主存地址寄存器至少需要多少位答案是32位。因为4GB 2^32字节按字节编址需要32位地址。这类题目看似简单但考试中经常加上“按字编址”或“按半字编址”的条件来增加难度。如果按字编址假设字长为32位那么4GB 2^30个字地址寄存器只需要30位。提示做这类题的时候一定要先确认编址单位。按字节编址、按字编址、按半字编址计算出来的地址位数完全不同。这是408选择题的常见陷阱。5.3 传送字数与计数器位数字计数器WC的位数取决于最大传送字数。如果DMA控制器支持的最大传送块大小为64KB按字节传送那么WC需要16位2^16 64K。如果支持的最大传送块为4MB那么WC需要22位。考试中经常问WC的位数由什么决定答案是由DMA控制器支持的最大传送数据块大小决定而不是由主存容量决定。这是一个容易混淆的点。6. 从STM32的DMA看408知识点的实际映射6.1 STM32 DMA控制器的结构与408的对应如果你学过STM32或者做过嵌入式开发你会发现STM32的DMA控制器和408里讲的DMA控制器在原理上完全一致只是实现细节不同。STM32的DMA控制器有多个通道每个通道都有以下寄存器CPAR外设地址寄存器对应408中的设备地址寄存器DAR。CMAR存储器地址寄存器对应408中的主存地址寄存器AR。CNDTR数据数量寄存器对应408中的字计数器WC。CCR通道配置寄存器对应408中的命令/状态寄存器。你看名字不同功能完全一样。STM32的DMA传送流程也和408描述的一致配置寄存器初始化、启动传送、DMA控制器接管总线、传送完成后产生中断。6.2 周期挪用方式在STM32中的体现STM32的DMA控制器采用的就是周期挪用方式。DMA控制器和CPUCortex-M内核通过总线矩阵共享总线。DMA每次传送一个数据单位时会请求总线矩阵分配一个总线周期。如果CPU正在使用总线DMA会等待如果总线空闲DMA立即传送。这解释了为什么STM32中DMA传送不会完全阻塞CPU但会降低CPU的访存效率。在408考试中这就是“周期挪用方式下DMA与CPU交替访存”的实际案例。6.3 考试知识点与实际开发的对应表408知识点STM32对应实现实际开发中的注意事项主存地址寄存器ARCMAR寄存器配置时要确保地址对齐字计数器WCCNDTR寄存器传送完成后自动清零设备地址寄存器DARCPAR寄存器外设地址通常固定停止CPU访存不常用STM32不支持完全停止CPU访存周期挪用默认方式DMA和CPU竞争总线可能降低性能DMA结束中断传输完成中断需要在中断服务程序中清除标志位总线请求HOLDDMA请求信号由硬件自动处理软件无需干预这个对应表可以帮助你把抽象的理论知识和具体的开发实践联系起来。考试的时候如果你能想到STM32的DMA是怎么工作的很多概念题就能迎刃而解。7. 复习DMA知识点时最容易踩的五个坑7.1 混淆DMA请求和中断请求的优先级很多同学记不住DMA请求和中断请求谁优先级更高。我教你一个记忆方法DMA请求对应的是“数据要丢了”中断请求对应的是“事情要处理了”。数据丢了不可恢复事情晚点处理问题不大。所以DMA优先级更高。在408真题中这个知识点经常以“以下哪种请求优先级最高”的形式出现选项通常包括DMA请求、中断请求、访存请求等。记住DMA请求 中断请求 程序查询。7.2 误以为DMA传送完全不经过CPU“DMA方式不需要CPU干预”这句话只对了一半。DMA传送过程中不需要CPU干预但初始化和结束处理都需要CPU参与。考试中经常把“不需要CPU干预”绝对化让你判断对错。你要注意题目中的限定词是“传送过程中”还是“整个过程中”。7.3 忽略DMA控制器的两种身份DMA控制器既是主设备控制总线又是从设备被CPU访问。考试中经常问DMA控制器在什么时候作为从设备答案是CPU初始化它的时候以及CPU读取它的状态的时候。这个知识点在综合题中经常出现。7.4 搞混三种DMA传送方式的适用场景停止CPU访存、周期挪用、交替访存这三种方式考试中经常给你一个场景让你选择。记住停止CPU访存适合高速大批量传送周期挪用适合高速外设但CPU也要访存的场景交替访存适合对CPU和DMA都有严格时间要求的系统。7.5 忘记DMA传送结束后的中断处理DMA传送结束后DMA控制器会向CPU发中断请求。这个中断的作用是通知CPU“数据传完了你可以处理了”。考试中经常问DMA传送结束后CPU需要做什么答案是响应中断执行中断服务程序检查DMA状态处理数据。注意DMA结束中断和普通I/O中断在本质上是不同的。普通I/O中断是“一个数据单位传完了”DMA结束中断是“一批数据传完了”。中断频率差了几个数量级。8. 把DMA放进整个I/O体系里理解8.1 DMA在I/O控制方式演进中的位置I/O控制方式的演进路线是程序查询 → 程序中断 → DMA → 通道 → I/O处理机。每一步演进的核心驱动力都是“让CPU从I/O控制中解放出来”。程序查询方式中CPU全程参与I/O控制。程序中断方式中CPU只在数据传送时参与。DMA方式中CPU只在初始化和结束时参与。通道方式中CPU只需要发一条I/O指令通道自己执行通道程序完成所有I/O操作。I/O处理机则是一个完整的处理器独立完成所有I/O任务。DMA是这条演进路线上的关键一步它第一次实现了“数据传送不经过CPU”。理解了这一点你就理解了DMA的核心价值。8.2 DMA与存储器系统的交互DMA直接访问主存这意味着DMA控制器需要和CPU竞争主存带宽。在408的存储器章节中经常考“主存带宽分配”的问题。比如CPU访存占多少带宽DMA占多少带宽两者如何协调。这个问题的答案取决于DMA的传送方式。停止CPU访存方式下DMA独占主存带宽周期挪用方式下DMA和CPU交替使用主存带宽交替访存方式下两者分时使用。考试中经常给你一个系统配置让你计算DMA传送对CPU性能的影响。这类题目需要你同时掌握DMA和存储器的知识是典型的综合题。8.3 DMA与Cache的一致性问题这是一个进阶知识点408考试中偶尔出现。DMA直接访问主存不经过Cache。如果CPU在Cache中缓存了某块数据而DMA直接修改了主存中的对应数据就会导致Cache和主存不一致。解决这个问题的方法有三种写直达法DMA写主存时同时更新Cache、写回法DMA写主存时使Cache中对应块失效、硬件监听Cache监听总线发现DMA修改了自己缓存的数据就更新或失效。这个知识点在408中属于“存储器系统”和“I/O系统”的交叉点出题频率不高但一旦出现就是拉分题。9. 我的复习建议和实战心得9.1 用“数据流向图”代替死记硬背我当年复习DMA的时候最大的体会是不要背文字描述要画数据流向图。把CPU、DMA控制器、主存、I/O设备四个部件画出来然后用箭头标出数据流向和控制流向。初始化阶段CPU → DMA控制器写寄存器。 传送阶段I/O设备 → DMA控制器 → 主存或反向。 结束阶段DMA控制器 → CPU中断请求。把这张图画熟考试的时候不管题目怎么变你都能快速定位到对应的阶段和部件。9.2 把408真题当“案例库”来刷DMA这个知识点王道和唐朔飞的教材都讲得很清楚但考试出题的角度往往比教材更灵活。我的建议是把近十年408真题中所有涉及DMA的题目整理出来按题型分类概念题、计算题、综合题然后逐题分析出题意图。你会发现概念题主要考“DMA的特点和适用场景”计算题主要考“总线带宽占用和地址位数”综合题主要考“DMA控制器的结构和传送流程”。把这三类题吃透DMA这个知识点就稳了。9.3 用STM32的DMA实验加深理解如果你有条件我强烈建议你找一个STM32开发板实际配置一次DMA传送。比如用ADC多通道采集DMA传输或者用串口DMA发送数据。实际跑一遍之后你对“初始化-传送-中断”这个流程的理解会深刻得多。我在实际配置STM32的DMA时发现很多在408考试中觉得抽象的概念比如“周期挪用”“总线请求”“传送完成中断”在实际代码中都有直接的对应。比如HAL_DMA_Start_IT()这个函数做的就是408里说的“初始化DMA控制器并启动传送”。DMA传输完成中断就是408里说的“DMA结束中断”。9.4 注意教材之间的表述差异唐朔飞的《计算机组成原理》和白中英的《计算机组成原理》在DMA部分的表述有一些差异。比如唐朔飞把DMA传送方式分为“停止CPU访存”“周期挪用”“DMA与CPU交替访存”三种而白中英的表述可能略有不同。考试的时候以王道辅导书为准因为王道是专门针对408的。但如果你时间充裕我建议两本教材都翻一翻。不同教材的表述差异往往能帮你从不同角度理解同一个概念考试的时候遇到变体题也不会慌。9.5 最后分享一个记忆口诀DMA这个知识点我总结了一个记忆口诀帮你快速回忆核心要点初始化时CPU管传送过程它不管。地址计数加缓冲总线请求优先断。三种方式记心间停止挪用交替换。传送完毕发中断一批数据全传完。这个口诀涵盖了DMA的核心特征CPU只在初始化和结束时参与、DMA控制器包含地址寄存器/计数器/缓冲寄存器、总线请求优先级高于中断、三种传送方式、传送结束后发中断。考试的时候如果一时想不起来细节先默念这个口诀能帮你快速定位到知识点。DMA这个知识点说难不难说简单也不简单。它的核心逻辑其实很清晰让数据自己跑CPU只发令。但考试会从各个角度来考察你对这个逻辑的理解深度。把这篇内容里的结构图、流程图、对比表都吃透再配合真题练习DMA这块分数你就能稳稳拿住。
返回列表