news 2026/9/28 1:17:03

2022年408真题解析:DMA与外存磁道扇区计算综合题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2022年408真题解析:DMA与外存磁道扇区计算综合题

1. 从一道408真题说起:DMA与外存计算到底在考什么

2022年计算机408统考第44题,是一道把I/O控制方式和外存地址计算揉在一起的综合题。当年考完之后,群里讨论最热烈的不是DMA本身,而是那道题里磁盘地址的换算——很多人DMA部分写对了,结果栽在磁道和扇区的除法上。这道题真正想筛的,是你能不能把“数据从磁盘搬到内存”这条链路上每一层的单位换算都理清楚。

先把这道题涉及的两个核心知识块摆出来。第一块是DMA方式,也就是直接存储器存取,它解决的是外设和主存之间大批量数据传送时CPU被频繁打断的问题。第二块是外存的磁道、扇区计算,磁盘的物理地址由柱面号、磁头号、扇区号组成,题目往往给你一个逻辑块号,让你反推它在哪个磁道、哪个扇区,再结合DMA的传送单位算出需要多少次DMA请求。

这篇文章适合谁看?如果你正在准备408,或者本科学计算机组成原理时对DMA和外存这两章一直模模糊糊,那这篇就是写给你的。我会从这道题的考点出发,把DMA的工作机制、三种I/O控制方式的对比、磁盘地址的计算方法、以及两者结合时容易踩的坑,全部拆开讲一遍。不是照着课本念,而是按我当年刷题和后来带学弟学妹时总结的思路来。

先给一个整体认知:DMA的本质是让外设和主存之间直接开一条数据通道,CPU只负责开头和结尾。而磁盘地址计算的核心,是搞清楚“逻辑块号”到“物理地址”的映射关系。这两件事单独看都不难,但408喜欢把它们串起来考,因为这样能同时检验你对I/O系统和存储系统的理解深度。

2. DMA方式的核心机制与三种I/O控制方式对比

2.1 DMA到底解决了什么问题

要理解DMA,得先知道没有它的时候CPU有多累。程序查询方式下,CPU不断轮询外设状态寄存器,外设没准备好就一直等,CPU时间全浪费在等待上。中断方式好一些,外设准备好之后发中断通知CPU,CPU再执行中断服务程序来搬运数据。但中断方式有个硬伤:每传送一个字或一个字节,就要打断一次CPU。磁盘这种外设,一次读写可能几千个字节,如果每个字节都中断一次,CPU基本不用干别的了。

DMA的思路很直接:既然数据搬运是机械劳动,那就找个专门的硬件——DMA控制器来干。CPU只需要告诉DMA控制器三件事:数据从哪来(外设地址)、搬到哪去(主存地址)、搬多少(传送长度)。剩下的活DMA控制器自己完成,搬完之后再发一个中断告诉CPU“活干完了”。这样CPU被打断的次数从“每个字节一次”降到“每批数据一次”,效率提升是数量级的。

我当年学到这里的时候有个疑问:DMA控制器凭什么能直接访问主存?答案是它通过系统总线发起总线请求,获得总线控制权之后,就模拟CPU的总线时序来读写主存。这时候CPU要么被挂起(停止访问总线),要么和DMA交替使用总线(周期挪用)。这两种方式分别叫停止CPU访存和周期挪用,还有一种交替访问方式,把总线时间分成固定片段轮流分配。

2.2 三种I/O控制方式的横向对比

把程序查询、中断、DMA放在一起对比,能看得更清楚。下面这张表是我自己整理过的,考试前反复看了好几遍:

对比维度程序查询方式中断方式DMA方式
CPU干预频率一直查询,全程占用每个字节/字中断一次每批数据中断一次
数据传送方向CPU经寄存器中转CPU经寄存器中转外设与主存直接传送
数据传送单位字或字节字或字节数据块
中断时机无中断每传送一个单位中断一批数据传完才中断
CPU与外设并行不能能能
适用场景简单外设、低速键盘、鼠标等磁盘、网卡等高速块设备

这张表里最关键的一行是“数据传送方向”。程序查询和中断方式下,数据都要经过CPU的通用寄存器中转,也就是说数据路径是“外设→CPU→主存”。而DMA方式下,数据路径是“外设→主存”,CPU完全不碰数据。这就是为什么DMA适合磁盘这种高速块设备——数据不经过CPU,就不会占用CPU的寄存器资源,也不会因为CPU的主频限制传送速度。

2.3 DMA控制器的内部结构与工作流程

DMA控制器不是随便一块电路就能当的,它内部有几个关键寄存器,理解了这些寄存器,DMA的工作流程就一目了然了。

主存地址寄存器(MAR):存放数据要搬到主存的哪个地址,每传送一个单位,这个地址自动加一。外设地址寄存器:存放外设的数据端口地址,一般保持不变。传送长度计数器:记录还剩多少数据没传,每传一个单位减一,减到零就发中断。控制状态寄存器:存放控制位和状态位,比如传送方向、是否允许中断等。

完整的工作流程是这样的:CPU初始化DMA控制器的各个寄存器,然后启动DMA。DMA控制器向总线仲裁器发总线请求,拿到总线控制权后,从外设读一个单位的数据,写到主存对应地址,然后MAR加一、计数器减一。重复这个过程直到计数器为零,DMA控制器释放总线,向CPU发中断。CPU收到中断后,检查状态寄存器确认传送完成,然后进行后续处理。

注意:DMA控制器在传送过程中会占用总线,这时候CPU如果也要访问主存,就会产生总线冲突。周期挪用方式就是解决这个冲突的——DMA每次只挪用一两个总线周期,传完一个单位就把总线还给CPU,这样CPU的访存请求不会等太久。

3. 外存磁道与扇区计算:从逻辑块号到物理地址

3.1 磁盘的物理结构回顾

磁盘的物理结构是理解地址计算的基础。一个盘片有两个面,每个面有一个磁头,所有磁头装在一个磁头臂上,可以一起移动。盘面被划分成若干同心圆,每个同心圆叫一个磁道,磁道从外向内编号,最外圈是0道。每个磁道又被划分成若干扇区,扇区是磁盘读写的最小单位,通常是512字节或4KB。

所有盘面上相同编号的磁道组成一个柱面。为什么要引入柱面这个概念?因为磁头臂移动是机械动作,比较慢,而切换磁头是电子动作,很快。所以按柱面来组织数据,读写时先在同一柱面的不同磁头之间切换,等整个柱面读完了再移动磁头臂到下一个柱面,这样能减少机械移动次数,提高效率。

磁盘地址通常用三个参数表示:柱面号(C)、磁头号(H)、扇区号(S)。给定一个逻辑块号,要算出对应的C、H、S,需要知道每个磁道有多少个扇区、每个柱面有多少个磁头。

3.2 逻辑块号到物理地址的换算方法

假设磁盘有N个柱面,每个柱面有H个磁头(也就是H个盘面),每个磁道有S个扇区。那么整个磁盘的扇区总数是N×H×S。逻辑块号从0开始编号,第b号逻辑块对应的物理地址计算步骤如下:

  1. 计算柱面号:C = b ÷ (H × S) 的整数部分
  2. 计算柱面内的偏移:offset = b mod (H × S)
  3. 计算磁头号:H_num = offset ÷ S 的整数部分
  4. 计算扇区号:S_num = offset mod S

这个计算过程看起来简单,但考试时容易出错的地方在于:题目给的参数可能不是直接的H和S,而是需要你先算出来。比如题目说“磁盘有8个盘面,每个盘面有200个磁道,每个磁道有100个扇区”,那H就是8,S就是100。但如果题目说“磁盘组有6片盘片,每片有两个记录面”,那H就是12,因为6片盘片有12个记录面。

还有一个常见的坑:扇区号是从0开始还是从1开始。大部分教材和408真题里,扇区号从0开始编号,但有些题目会从1开始。做题时一定要看清楚题目的约定,如果题目说“扇区号从1开始”,那计算时就要相应调整。

3.3 一道典型计算题的完整推演

拿一道我当年练过的题来演示。题目:某磁盘有4个盘面,每个盘面有1000个磁道,每个磁道有64个扇区,每个扇区512字节。逻辑块号从0开始,按柱面、磁头、扇区的顺序编号。求逻辑块号5000对应的柱面号、磁头号和扇区号。

先算每个柱面的扇区数:H × S = 4 × 64 = 256。柱面号 = 5000 ÷ 256 = 19(整数部分),因为19×256=4864,20×256=5120,5000在4864和5120之间。偏移 = 5000 - 4864 = 136。磁头号 = 136 ÷ 64 = 2,扇区号 = 136 mod 64 = 8。所以答案是柱面19、磁头2、扇区8。

验算一下:柱面0到18共19个柱面,每个柱面256个扇区,共4864个扇区。柱面19的磁头0有64个扇区(4864到4927),磁头1有64个扇区(4928到4991),磁头2从4992开始,第4992号是磁头2扇区0,第5000号就是磁头2扇区8。完全正确。

提示:做这类题的时候,我习惯先把每个柱面的扇区数算出来,然后用逻辑块号除以它得到柱面号,再用余数除以每个磁道的扇区数得到磁头号,最后的余数就是扇区号。这个流程固定下来,考试时不容易乱。

4. DMA与外存计算的结合:2022年44题拆解

4.1 题目场景还原与关键信息提取

2022年44题的大致场景是:一个磁盘通过DMA方式与主存交换数据,题目给出了磁盘的参数(盘面数、磁道数、扇区数、扇区大小),然后问某个逻辑块号对应的物理地址,以及传送一批数据需要多少次DMA请求、每次DMA传送多少数据。

这道题的巧妙之处在于,它把两个知识块串成了一条链:你先要算出逻辑块号对应的扇区,然后根据扇区大小和DMA传送单位算出需要多少次DMA请求。如果第一步算错了,第二步肯定也跟着错。反过来,如果你DMA的概念不清楚,不知道DMA是按数据块传送的,那第二步也无从下手。

题目里还有一个容易忽略的细节:DMA传送的数据块大小可能和扇区大小不一致。比如扇区是512字节,但DMA一次传送1024字节,那一个DMA请求就覆盖两个扇区。这时候计算DMA请求次数时,要用总字节数除以DMA传送单位,而不是除以扇区大小。这个点我在第一次做的时候就没注意到,后来对答案才发现自己多算了一倍。

4.2 分步骤解题过程与参数计算

假设题目给出的参数是:磁盘有4个盘面,每个盘面1000个磁道,每个磁道64个扇区,每个扇区512字节。要读取从逻辑块号5000开始的4096字节数据,DMA每次传送512字节。求需要多少次DMA请求,以及最后一次DMA请求涉及哪些扇区。

第一步,算4096字节需要多少个扇区:4096 ÷ 512 = 8个扇区。第二步,算这8个扇区在磁盘上的分布。逻辑块号5000对应柱面19、磁头2、扇区8(用上一节的方法算出来的)。从扇区8开始连续读8个扇区,扇区8到扇区63是56个扇区,够8个,所以这8个扇区都在柱面19、磁头2上,扇区号从8到15。

第三步,算DMA请求次数。DMA每次传送512字节,正好是一个扇区的大小,所以8个扇区需要8次DMA请求。如果DMA每次传送1024字节,那就是4次DMA请求,每次覆盖两个扇区。

这里有个关键点:DMA传送的数据块必须是连续的物理地址。如果8个扇区跨越了磁道边界,比如从磁头2的扇区60开始读8个扇区,那扇区60到63在磁头2上,扇区0到3在磁头3上。这时候DMA控制器能不能一次处理跨磁道的数据?答案是能,因为DMA控制器只关心主存地址和外设数据端口,磁盘控制器会把跨磁道的扇区数据连续地送到数据端口。但计算DMA请求次数时,仍然按总字节数除以DMA传送单位来算,不需要考虑磁道边界。

4.3 为什么408喜欢把DMA和外存放在一起考

从命题的角度看,DMA和外存计算的结合能同时考察多个知识点:磁盘的物理结构、逻辑块号到物理地址的映射、DMA的传送机制、以及数据块大小的换算。而且这种题目有明确的对错标准,适合大规模考试。

从学习的角度看,这两个知识点在实际系统中本来就是紧密相关的。磁盘读写就是典型的DMA应用场景,操作系统在发起磁盘I/O时,需要把逻辑块号转换成物理地址,然后配置DMA控制器进行数据传送。理解了这道题,就理解了磁盘I/O的底层流程。

我后来在写一个简单的磁盘模拟程序时,就按照这个流程来实现:先根据逻辑块号算出柱面、磁头、扇区,然后模拟DMA控制器的行为,一个扇区一个扇区地传送数据,每传完一个扇区就更新主存地址和计数器。写完之后对DMA的理解就完全不一样了,不再是背概念,而是知道每一步在干什么。

5. 常见问题与排查技巧实录

5.1 磁道扇区计算中的高频错误

错误一:盘面数和磁头数搞混。题目说“磁盘组有6片盘片”,很多人直接拿6当磁头数,但每片盘片有两个记录面,所以磁头数应该是12。只有题目明确说“每个盘片只有一个记录面”时,磁头数才等于盘片数。

错误二:扇区号起始值搞错。有些题目扇区号从0开始,有些从1开始。如果题目说“扇区号从1开始”,那计算时偏移量要加1。比如逻辑块号0对应柱面0、磁头0、扇区1,而不是扇区0。

错误三:柱面号和磁道号混淆。柱面号是所有盘面上相同编号的磁道组成的,所以柱面号等于磁道号。但有些题目会分别给“磁道号”和“柱面号”,其实是一个东西,不要被绕进去。

错误四:单位换算错误。扇区大小可能是512字节、1KB、4KB,题目可能用字节给数据量,也可能用KB给。计算时统一换算成字节再算,避免出错。

5.2 DMA传送次数计算中的陷阱

陷阱一:DMA传送单位和扇区大小不一致。前面已经说过,DMA传送单位可能是扇区大小的整数倍,也可能是扇区大小的一半。计算请求次数时,要用总字节数除以DMA传送单位,而不是除以扇区大小。

陷阱二:DMA传送方向搞反。题目可能问“从磁盘读到主存”或“从主存写到磁盘”,这两种情况下DMA控制器的地址寄存器和数据流向是相反的。读操作时,外设地址是数据源,主存地址是目的地;写操作时反过来。

陷阱三:中断次数和DMA请求次数混淆。DMA请求次数是DMA控制器向总线仲裁器请求总线的次数,中断次数是DMA控制器向CPU发中断的次数。一批数据传完后只发一次中断,但可能发了很多次DMA请求。题目如果问“CPU被中断多少次”,答案通常是1次(如果只有一批数据)。

5.3 独家避坑清单

下面这张表是我自己总结的避坑清单,考试前看一遍能避免大部分低级错误:

易错点正确做法检查方法
盘面数当磁头数每片盘片两个记录面,磁头数=盘片数×2看题目是否说“单记录面”
扇区号从0还是1开始看题目约定,默认从0开始读题时圈出“从0开始”或“从1开始”
DMA传送单位与扇区大小混淆用总字节数除以DMA传送单位确认DMA传送单位是多少字节
柱面号和磁道号混用柱面号=磁道号,是同一个东西看题目用的是哪个术语
中断次数算成DMA请求次数一批数据只中断一次确认题目问的是“中断”还是“DMA请求”

提示:做这类综合题时,我习惯先在草稿纸上把题目给的参数列出来,标注每个参数的含义和单位,然后再开始计算。这样能避免看漏条件或者用错参数。

6. 从这道题延伸出去的知识网络

6.1 DMA与中断的优先级关系

DMA请求和中断请求同时发生时,谁的优先级更高?答案是DMA请求。因为DMA传送的是高速外设的数据,如果被中断打断,数据可能丢失。而中断请求通常来自低速外设,晚一点处理没关系。在总线仲裁器里,DMA请求的优先级通常设置得比中断请求高。

这个知识点在408里考过选择题,问“DMA请求和中断请求同时发生时,CPU先响应哪个”。答案是先响应DMA请求,因为DMA请求对应的是数据传送,不能等;中断请求对应的是状态通知,可以等。

6.2 磁盘阵列与DMA的关系

磁盘阵列(RAID)通过多个磁盘并行工作来提高性能和可靠性。在RAID系统中,DMA控制器需要同时管理多个磁盘的数据传送。比如RAID 0把数据分散到多个磁盘上,读一个逻辑块可能需要从多个磁盘同时读取,每个磁盘都有自己的DMA通道。这时候DMA控制器的设计就更复杂了,需要支持多通道并发传送。

408考试不考RAID的具体实现,但理解RAID和DMA的关系有助于理解DMA的扩展应用。我当年学到这里的时候,突然明白了为什么服务器主板上有那么多DMA通道——因为要支持多个高速外设同时工作。

6.3 从408到实际系统:磁盘I/O的完整流程

在实际操作系统中,磁盘I/O的流程比408题目复杂得多,但核心步骤是一样的。以Linux为例,当应用程序调用read()读取文件时,内核先根据文件偏移量算出逻辑块号,然后通过文件系统找到对应的物理块号,再构造一个I/O请求发给块设备层。块设备层把请求合并、排序后发给磁盘驱动,驱动把请求转换成磁盘命令,配置DMA控制器,启动DMA传送。DMA传送完成后发中断,驱动处理中断,唤醒等待的进程,数据从内核缓冲区拷贝到用户缓冲区。

这个流程里,DMA负责的是“磁盘到内核缓冲区”这一段,而“内核缓冲区到用户缓冲区”这一段还是由CPU完成的。所以一次磁盘读操作实际上有两次数据拷贝:一次是DMA完成的,一次是CPU完成的。这也是为什么零拷贝技术(如mmap、sendfile)能提高性能——它们减少了CPU拷贝的次数。

理解了408题目里的DMA和外存计算,再看实际系统的I/O流程,就会发现底层原理是相通的。题目里的逻辑块号换算对应文件系统的块映射,DMA请求次数对应驱动里的DMA描述符数量,中断处理对应驱动里的中断服务程序。把408的知识学扎实了,看实际系统的代码会轻松很多。

6.4 复习建议与刷题策略

如果你正在准备408,我的建议是把DMA和外存这两章放在一起复习。先单独把DMA的工作机制搞清楚,再把磁盘地址计算练熟,然后找综合题来练。王道书上的题目和真题都要做,做完之后把错题整理出来,标注错误原因。

刷题的时候不要只追求做对,要追求理解每一步为什么这么做。比如算DMA请求次数时,问自己“为什么用总字节数除以DMA传送单位,而不是除以扇区大小”,想清楚了就不会再错。我当年复习的时候,每道综合题都会在草稿纸上把完整流程写一遍,包括参数提取、公式推导、单位换算、结果验算。写多了之后,看到题目就能条件反射地知道该从哪里下手。

最后分享一个我自己的小技巧:把磁盘地址计算和DMA传送次数的公式写在一张卡片上,每天看一遍,坚持一周就能形成肌肉记忆。公式不用死记,理解推导过程之后自然就记住了。比如柱面号 = 逻辑块号 ÷ (磁头数 × 每道扇区数),这个公式的本质是“每个柱面有多少个扇区”,理解了这一点,公式就不用背了。

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

深度学习图像分类实战:垃圾分类识别工程从训练到部署全指南

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

作者头像 李华
网站建设 2026/9/28 1:15:18

中兴W101D2刷机教程:晶晨S905L3A盒子变全功能电视盒子

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

作者头像 李华
网站建设 2026/9/28 1:14:52

ESP32多模块共存:用NVS命名空间实现Flash数据隔离

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

作者头像 李华
网站建设 2026/9/28 1:14:44

展锐平台SensorHub动态驱动加载与调试实战解析

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

作者头像 李华
网站建设 2026/9/28 1:14:43

VisionMaster 4.2视觉定位项目全流程实战指南

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

作者头像 李华