1. 从一道408真题说起DMA与外存寻址到底在考什么22年408那道44题我第一眼看到的时候就觉得出题人挺“坏”的——它把DMA方式和磁盘磁道、扇区计算这两个看起来八竿子打不着的知识点揉进了一道题里。很多同学复习的时候是分开背的DMA归DMA磁盘归磁盘结果一上考场发现题目把两者串起来了直接就懵了。这道题的核心考点其实就两句话DMA控制器如何在不需要CPU干预的情况下完成外设与主存之间的数据搬运以及磁盘的物理地址柱面号、磁头号、扇区号如何换算成逻辑块号进而算出数据传输量和耗时。说白了它考的是你对“数据从磁盘到内存这条完整链路上谁在控制、怎么定位、花多长时间”的理解。我当年复习这块的时候一开始也是死记硬背DMA的三种传送方式停止CPU访存、周期挪用、交替访存但真正做题才发现光背概念没用你得能把DMA的传送过程跟磁盘的物理结构对应起来。比如题目给你一个磁盘参数每磁道多少个扇区、转速多少转/分、DMA每次传送多少字节然后问你读一个磁道的数据需要多长时间、DMA会占用多少总线周期。这种题你要是没亲手算过几遍考场上现推根本来不及。这篇文章我打算把这道题涉及的所有知识点从头到尾捋一遍不光讲DMA的三种方式怎么区分还会把磁盘磁道、扇区的计算逻辑拆开揉碎最后用一道完整的计算题把两者串起来。不管你是正在准备408的考研党还是单纯想搞懂计算机组成原理里这块内容的同学看完应该都能有个清晰的框架。2. DMA方式为什么需要它以及它到底怎么工作2.1 从程序查询到DMACPU是怎么被“解放”出来的要理解DMA的价值得先看看没有DMA的时候CPU有多累。最早的外设数据传输用的是程序查询方式CPU不停地读外设的状态寄存器问“你准备好了吗”准备好了就传一个字节然后继续问。这种方式下CPU完全被绑死在外设上传1KB数据可能要循环几千次啥也干不了。后来有了中断方式外设准备好之后主动给CPU发中断信号CPU暂停当前程序去处理数据传输。这比查询方式好多了但每次传一个字节或一个字都要进一次中断上下文切换的开销还是很大。你想想传1MB数据要进多少次中断CPU大部分时间都花在保存现场和恢复现场上了。DMA方式的思路就完全不一样了既然CPU只是负责搬运数据那为什么不找一个专门的硬件来控制这件事DMA控制器DMAC就是这个“专门的硬件”。它直接连接主存和外设CPU只需要在传输开始前告诉DMAC从哪读、写到哪、传多少、传完了告诉我一声。然后CPU就可以去干别的事了DMAC自己完成剩下的搬运工作。这里有个关键点很多人容易忽略DMA控制器并不是完全不需要CPU。传输开始前的初始化设置源地址、目的地址、传送长度、传送方向还是需要CPU来做的传输结束后DMAC会发一个中断通知CPU“活干完了”。所以DMA的本质是把数据传输过程中的逐字节干预变成了传输前后的两次干预中间的搬运过程CPU完全不参与。2.2 DMA的三种传送方式停止CPU访存、周期挪用、交替访存DMA控制器要和CPU共享主存但主存同一时刻只能被一个设备访问。怎么协调这个冲突这就是三种传送方式的由来。停止CPU访存最简单粗暴DMAC要传数据的时候直接给CPU发一个信号让CPU暂停对主存的访问把总线控制权交给DMAC。等这批数据传完了再把总线还给CPU。这种方式控制简单但CPU在DMA传输期间完全不能访存如果传输的数据量很大CPU的性能损失就很明显。适合外设速度很快、数据量很大的场景比如高速磁盘。周期挪用也叫周期窃取就精细多了。DMAC每次只“偷”一个总线周期来传一个字节或一个字传完立刻把总线还给CPU。如果CPU正在使用总线DMAC就等一个周期如果CPU暂时不用总线比如正在执行不需要访存的指令DMAC就趁机传数据。这种方式对CPU的影响最小但DMAC的控制逻辑更复杂因为要判断什么时候总线空闲。实际系统中用得最多。交替访存是把CPU和DMAC的访存时间错开。比如把总线周期分成两半前半段给CPU用后半段给DMAC用。这样两者各用各的互不干扰。但这种方式要求CPU和DMAC的访存速度匹配而且总线周期的利用率只有50%实际中不太常见。我个人的记忆方法是停止CPU访存是“你让开我来”周期挪用是“你不用的时候我插空”交替访存是“咱俩轮流用”。考试的时候经常给你一个场景让你判断用哪种方式关键看题目强调的是“CPU效率优先”还是“控制简单优先”。2.3 DMA控制器的内部结构和寄存器配置DMAC内部有几个关键寄存器考试里经常考它们的作用和初始化顺序寄存器作用初始化方向主存地址寄存器MAR存放要读写的主存起始地址CPU写入外设地址寄存器存放外设的地址CPU写入传送长度计数器WC记录剩余要传送的字节数CPU写入控制/状态寄存器设置传送方向、传送方式等CPU写入数据缓冲寄存器暂存传输中的数据DMAC内部使用初始化的时候CPU先把主存起始地址写到MAR把外设地址写到外设地址寄存器把传送字节数写到WC最后写控制寄存器启动DMA。每传一个字节MAR自动加1或减1WC自动减1。当WC减到0时DMAC发中断告诉CPU传输完成。这里有个容易踩的坑WC减到0的时候是刚好传完最后一个字节就发中断还是再传一个字节才发中断这取决于具体实现。有的系统是WC为0表示传输结束有的系统是WC为1时传完最后一个字节然后变0。408考试里一般会明确说明如果没有说明默认是WC减到0时传输完成。3. 磁盘的物理结构磁道、扇区、柱面到底怎么算3.1 磁盘的物理组织从盘面到扇区的层级关系磁盘的物理结构是一个典型的层级组织从大到小依次是盘面磁头→ 磁道 → 扇区。一个硬盘可能有好几个盘片每个盘片有两个盘面每个盘面有一个磁头负责读写。所有盘面上相同半径的磁道组成一个柱面。这里的关键参数关系是磁头数 盘面数 每个柱面的磁道数每磁道扇区数这个值在早期的磁盘上是固定的但现代磁盘因为采用了区域记录技术ZBR外圈磁道的扇区数比内圈多。不过408考试里一般假设每磁道扇区数相同方便计算。柱面数等于每个盘面上的磁道数。磁盘的容量计算公式是总容量 磁头数 × 柱面数 × 每磁道扇区数 × 每扇区字节数这个公式看起来简单但考试的时候经常给你其中几个参数让你求另一个。比如告诉你磁盘容量、磁头数、每磁道扇区数、每扇区512字节让你求柱面数。这种题就是套公式但要注意单位换算别把MB和GB搞混了。3.2 磁盘地址的三种表示方式及其换算磁盘上的一个数据块可以用三种方式表示地址第一种是CHS地址也就是柱面号Cylinder、磁头号Head、扇区号Sector。这是最底层的物理地址直接对应磁盘的物理位置。比如“0柱面0磁头1扇区”就是磁盘最外圈最开始的位置。第二种是逻辑块地址LBA从0开始连续编号每个块对应一个扇区。LBA和CHS之间的换算关系是LBA 柱面号 × (磁头数 × 每磁道扇区数) 磁头号 × 每磁道扇区数 (扇区号 - 1)注意扇区号是从1开始的所以减1。这个公式考试里经常用到比如给你一个LBA让你求对应的CHS或者反过来。第三种是字节地址就是直接给出数据在磁盘上的字节偏移量。字节地址除以每扇区字节数就是LBA。我复习的时候总结了一个换算口诀“先算柱面跨了多少再算磁头跨了多少最后算扇区偏移”。具体来说从CHS转LBA先算柱面贡献的块数柱面号 × 每柱面块数再加上磁头贡献的块数磁头号 × 每磁道扇区数最后加上扇区偏移扇区号 - 1。3.3 磁盘的读写时间寻道时间、旋转延迟、传输时间磁盘读写一个数据块的时间由三部分组成寻道时间磁头从当前位置移动到目标磁道所需的时间。这个时间取决于磁头的机械结构和移动距离一般在几毫秒到十几毫秒之间。考试里通常给一个平均值或者最大值的公式比如“寻道时间 起始磁道到目标磁道的道数 × 每道寻道时间”。旋转延迟磁头到达目标磁道后等待目标扇区旋转到磁头下方所需的时间。平均旋转延迟是旋转半圈的时间也就是平均旋转延迟 60 / (2 × 转速)转速的单位是转/分RPM。比如7200RPM的磁盘平均旋转延迟 60 / (2 × 7200) 4.17ms。传输时间从磁头开始读写到读完一个扇区所需的时间。计算公式是传输时间 每磁道扇区数 / (转速 × 每磁道扇区数) 1 / 转速等等这个公式好像有点问题。让我重新推一下磁盘转一圈的时间是60/转速秒一圈有N个扇区所以读一个扇区的时间是(60/转速)/N秒。如果一次要读k个扇区传输时间就是k × (60/转速)/N。所以完整的读写时间公式是总时间 寻道时间 旋转延迟 传输时间考试里经常让你算读一个文件需要多长时间文件可能跨多个磁道这时候还要考虑磁道切换的寻道时间。如果文件在同一个柱面的不同磁道上磁头切换是电子切换几乎不花时间但如果是不同柱面就要加上寻道时间。4. 把DMA和磁盘计算串起来22年44题的完整拆解4.1 题目场景还原与已知条件梳理22年44题的大致场景是这样的一个磁盘系统每磁道有若干个扇区每个扇区512字节磁盘转速给定DMA控制器采用某种传送方式每次传送一个扇区或一个字节。题目可能问读一个磁道的数据需要多长时间DMA会占用多少总线周期CPU被干扰了多少次虽然我手头没有原题的完整文字但根据408历年题的套路这类题一般会给出以下参数磁盘转速比如7200RPM或5400RPM每磁道扇区数比如64或128每扇区字节数通常512字节DMA传送方式周期挪用或停止CPU访存总线周期或主存周期比如每个总线周期100ns然后让你算读一个磁道的数据需要多少时间寻道时间旋转延迟传输时间在DMA方式下CPU被占用了多少时间如果改用中断方式CPU需要介入多少次4.2 磁盘读写时间的逐步计算过程假设题目给出的参数是转速7200RPM每磁道64个扇区每扇区512字节寻道时间忽略不计或者题目单独给DMA采用周期挪用方式每个总线周期可以传送4字节总线周期为100ns。第一步算旋转延迟。平均旋转延迟 60 / (2 × 7200) 4.167ms。如果题目问的是读一个完整磁道那旋转延迟就是转一圈的时间即60/7200 8.333ms。第二步算传输时间。读一个磁道的数据就是转一圈的时间8.333ms。如果只读一个扇区传输时间 8.333ms / 64 0.13ms。第三步算DMA传送占用的总线周期数。一个磁道的数据量 64 × 512 32768字节。每个总线周期传4字节需要32768 / 4 8192个总线周期。每个总线周期100ns总共占用8192 × 100ns 819.2μs。第四步算CPU被干扰的时间。在周期挪用方式下CPU只在DMAC需要使用总线且CPU也在使用总线时被暂停一个周期。最坏情况下8192个总线周期全部与CPU冲突CPU被暂停819.2μs。但实际中CPU不会每个周期都访存所以实际干扰时间小于这个值。这里有个关键点DMA传送的总线周期是分散在8.333ms的传输时间里的。因为磁盘读出一个扇区需要0.13msDMAC在这0.13ms内只需要传512/4 128个总线周期也就是12.8μs。剩下的时间DMAC是空闲的CPU可以正常访存。所以CPU的实际干扰时间远小于819.2μs。4.3 DMA传送方式对CPU效率的影响对比如果把题目改成“停止CPU访存”方式情况就完全不同了。DMAC在传输期间完全占用总线CPU在这8.333ms内完全不能访存。虽然实际上DMAC只需要819.2μs来传数据但停止CPU访存方式下DMAC一旦获得总线就会一直占用到传输结束所以CPU被暂停的时间就是819.2μs假设DMAC连续传输。等等这里需要澄清一下停止CPU访存方式下DMAC是传完一个字节就释放总线还是传完整个数据块才释放这取决于具体实现。如果DMAC每传一个字节就释放总线那和周期挪用差不多如果DMAC一直占用总线直到整个数据块传完那CPU就被暂停整个传输时间。408考试里一般把“停止CPU访存”理解为DMAC占用总线直到传输完成所以CPU被暂停的时间等于DMA传输的总时间。而“周期挪用”是每个总线周期都可能被DMAC偷走但CPU只在冲突时被暂停。这两种方式对CPU效率的影响可以用一个表格对比传送方式CPU被暂停的时间适用场景控制复杂度停止CPU访存整个DMA传输期间高速外设、大数据量简单周期挪用仅冲突的总线周期中低速外设、CPU效率优先中等交替访存每个总线周期的一半速度匹配的CPU和DMAC复杂4.4 中断方式与DMA方式的CPU介入次数对比题目有时候会问如果用中断方式传送一个磁道的数据CPU需要介入多少次答案是每传一个字节或一个字就中断一次。如果每次中断传4字节那32768字节需要8192次中断。每次中断的上下文切换开销假设是10μs那CPU总共花在中断处理上的时间就是81.92ms比DMA方式下的819.2μs多了100倍。这就是DMA的核心价值把CPU从频繁的中断处理中解放出来。数据量越大DMA的优势越明显。5. 复习这块内容时我踩过的坑和总结的技巧5.1 单位换算是最容易丢分的地方我当年做这类题的时候最常犯的错误就是单位搞混。转速是转/分但算旋转延迟的时候要换算成秒总线周期是ns但算总时间的时候要换算成ms或μs磁盘容量是GB但算扇区数的时候要换算成字节。每次算完都要检查一遍单位不然差之毫厘谬以千里。比如算平均旋转延迟60 / (2 × 7200) 0.004167秒 4.167ms。如果你忘了60是秒直接算成60/14400 0.004167分钟那就全错了。我建议在草稿纸上把单位写清楚每一步都标注单位最后再统一换算。5.2 扇区号从1开始还是从0开始磁盘的扇区号在CHS地址里是从1开始的但在LBA里是从0开始的。这个细节考试里经常设陷阱。比如题目说“读取0柱面0磁头1扇区”这个扇区对应的LBA是0。如果你算成LBA1后面的计算全错。我的记忆方法是CHS是人看的从1开始LBA是机器用的从0开始。换算的时候记得减1。5.3 DMA传送方式的选择要看题目强调什么题目如果强调“CPU效率最高”选周期挪用如果强调“控制最简单”选停止CPU访存如果强调“CPU和DMAC速度匹配”选交替访存。但实际做题的时候题目往往会给出具体的传送方式你只需要按照给定的方式计算就行。如果题目没给那就要根据上下文判断。5.4 磁盘跨磁道读取的寻道时间不能忽略如果题目让你读一个文件文件跨了多个磁道那每换一个磁道就要加一次寻道时间。但如果是同一个柱面的不同磁道磁头切换不需要寻道时间因为是电子切换。这个细节很多人会忽略导致算出来的时间偏小。我一般会在草稿纸上画一个磁盘的示意图标出文件占用的磁道和扇区然后一段一段算时间最后加起来。这样不容易漏掉寻道时间。5.5 DMA与中断的配合传输完成后的处理DMA传输完成后DMAC会发一个中断给CPU。这个中断的处理时间也要算进去。虽然相比传输时间很小但题目如果问“从开始传输到CPU处理完中断总共花了多少时间”那就不能漏掉。一般中断处理时间题目会给比如“中断处理需要5μs”。另外DMA传输完成后的中断和普通外设中断不一样它只是通知CPU“数据已经到位了”CPU不需要在中断服务程序里搬运数据只需要做一些后续处理比如唤醒等待的进程。所以中断处理时间通常很短。6. 从这道题延伸出去408组成原理的复习思路6.1 把零散知识点串成一条线408组成原理的复习最忌讳的就是孤立地背知识点。DMA、磁盘、中断、总线这几个章节看起来是分开的但实际题目里经常串在一起考。我的建议是画一张数据流图数据从磁盘读出经过DMA控制器通过总线写入主存最后被CPU处理。这张图上每个环节涉及的知识点都标出来复习的时候顺着数据流走一遍比死记硬背强得多。比如磁盘读出数据这个环节涉及磁道、扇区、旋转延迟、传输时间DMA控制器这个环节涉及三种传送方式、寄存器配置、总线仲裁总线这个环节涉及总线周期、总线宽度、总线带宽主存这个环节涉及存储周期、存取时间。把这些串起来一道题就能覆盖好几章的内容。6.2 计算题要动手算不能只看我见过很多同学复习的时候只看例题觉得自己看懂了结果一上考场发现算不出来。计算题必须动手算而且要算到得出具体数字为止。特别是单位换算和公式代入只有亲手算过几遍才能形成肌肉记忆。我当年复习的时候把408历年真题里所有涉及磁盘和DMA的计算题都抄在一个本子上反复算了三遍。第一遍看着答案算第二遍闭卷算第三遍限时算。三遍下来这类题的套路就完全掌握了。6.3 王道和唐朔飞的教材怎么配合使用王道的数据结构讲得好但组成原理我觉得唐朔飞的教材更扎实。唐朔飞的《计算机组成原理》对DMA和磁盘的讲解更细致特别是磁盘的物理结构和地址换算例题也多。王道的书适合快速过知识点唐朔飞的书适合深入理解。我的用法是先看王道过一遍知识点建立框架然后看唐朔飞的书补细节特别是例题和课后题最后做408真题检验掌握程度。两本书配合使用效果比只看一本好得多。6.4 磁盘和DMA在考试中的出题规律从历年408真题来看磁盘和DMA的考点主要集中在以下几个方面磁盘容量计算磁头数、柱面数、扇区数、每扇区字节数的关系CHS地址与LBA的换算磁盘读写时间的计算寻道时间、旋转延迟、传输时间DMA三种传送方式的区别和适用场景DMA传送过程中CPU的介入次数和效率分析DMA与中断方式的对比这些考点几乎每年都会以某种形式出现要么单独考要么和其他知识点结合考。复习的时候要把这些考点都覆盖到不能有遗漏。6.5 一个实用的复习检查清单最后分享一个我复习这块内容时用的检查清单每次做完题都对照检查一遍[ ] 磁盘容量公式记住了吗单位换算对了吗[ ] CHS转LBA的公式记住了吗扇区号减1了吗[ ] 平均旋转延迟的公式记住了吗转速单位换算对了吗[ ] 传输时间的公式记住了吗是算一个扇区还是一个磁道[ ] DMA三种传送方式的区别清楚吗题目问的是哪种[ ] DMA传送的总线周期数算对了吗每个周期传多少字节[ ] CPU被暂停的时间算对了吗是全部传输时间还是冲突时间[ ] 中断方式的CPU介入次数算对了吗每次中断传多少字节[ ] 跨磁道读取的寻道时间加了吗同柱面切换磁头不用加寻道时间[ ] 最后的单位统一了吗ms、μs、ns别搞混。这个清单看起来简单但每次做题都过一遍能避免90%的低级错误。我当年考试的时候就是靠这个清单检查出了两道题的单位错误多拿了十几分。磁盘和DMA这块内容说难也不难关键是要把物理结构和计算逻辑搞清楚然后多动手算。一旦你亲手算过十几道题就会发现套路其实很固定考来考去就是那几个公式和那几个陷阱。希望这篇拆解能帮你把这块内容彻底搞明白考场上遇到类似的题能直接秒杀。