【问题标题】:Determining the starting sector of the root directory in a FAT16 drive确定 FAT16 驱动器中根目录的起始扇区
【发布时间】:2017-04-10 22:43:06
【问题描述】:

我想将一些非常大的程序变量从内存中卸载到磁盘文件中。

我已经阅读了数十页关于 INT 13H、CHS、MBR 和文件分配表的内容,并且几乎了解了我需要知道的所有内容, 除了我似乎找不到计算根目录起始扇区的工作方法。

根据这个页面,http://nerdclub-uk.blogspot.co.uk/2012/11/understanding-fat-tables.html,确定它 就像将包含引导记录的扇区偏移量、保留扇区的数量和 每个 FAT 副本中的扇区。

在检查了我的引导扇区后,我插入了所有这些值,这就是我最终得到的结果。

1+1+(2*256),等于 514。

所以,我的根目录应该从扇区偏移量 514 开始。每个柱面的最高扇区数是 63。

514 / 63 = 8r10

所以,我的根目录应该在第 8 柱面,第 10 扇区。

但是,该扇区及其周围的所有扇区都只有零。

显然我做错了什么,但经过一天的谷歌搜索后,我准备放弃了。

【问题讨论】:

  • 好的,几个小时后我已经解决了这个问题。我认为柱面组组成磁头,这就是我阅读的所有网页描述它的方式,但在转储和分析我的整个磁盘映像后,我能够确定,实际上(在我的情况下)有 16 个磁头组成一个气缸。这是令人困惑和倒退的,但无论如何。例如,磁头 1 的偏移量是分区中的 63 个扇区,而柱面 1 的偏移量是分区中的 1008 个扇区。我把它们倒过来了。

标签: filesystems fat16


【解决方案1】:

较新的驱动器使用 LBA(逻辑块寻址),因此 CHS 不再发挥作用。您应该从计算中访问扇区 514(LBA 扇区 513,因为 LBA 的第一个扇区为 0)。那个领域有什么?

对于 CHS 寻址,每个柱面由位于盘片每一侧的多个磁头(磁道)组成,每个磁头(磁道)由磁盘周围的多个可访问扇区组成。

https://en.wikipedia.org/wiki/Cylinder-head-sector 有一个公式将 (c,h,s) 元组转换为 LBA 扇区值:

可以使用以下方法将 CHS 元组映射到 LBA 地址 公式:

A = (c ⋅ Nheads + h) ⋅ ​​Nsectors + (s − 1),其中 A 是 LBA 地址, Nheads 是磁盘上的磁头数,Nsectors 是最大值 每个磁道的扇区数,(c, h, s) 是 CHS 地址。

和 LBA 到 CHS 地址的转换 https://en.wikipedia.org/wiki/Logical_block_addressing#CHS_conversion

LBA 地址可以通过以下公式映射到 CHS 元组 (“mod”为取模运算,即余数,“÷”为整数 除法,即除法的商,其中任何小数部分 被丢弃):

C = LBA ÷ (HeadsPerCylinder (HPC) × SectorsPerTrack (SPT))

H = (LBA ÷ SPT) 模 HPC

S = (LBA mod SPT) + 1

【讨论】:

  • 好吧,谢谢你的回答(尽管已经很晚了)。这个问题与DOS有关。我正在编写自己的 FAT16 文件加载器,以将文件从旧的 40MB 硬盘加载到内存缓冲区中。所以我使用的硬件早于 LBA。无论如何,我可能在问了这个问题几周后完成了文件加载器。我会奖励你答案,因为你懒得回答。
猜你喜欢
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 2010-09-14
  • 2021-06-19
  • 2018-10-16
  • 1970-01-01
  • 2010-12-11
  • 2012-11-21
相关资源
最近更新 更多