-1

我正在构建一个类似于 FAT 的文件系统。它具有以下设置:

| MBR | 脂肪区 | 资料区 |

所以如果给定sector_size(以字节为单位的扇区大小),cluster_size(以扇区为单位的簇大小)和disk_size(以簇为单位的磁盘大小),我如何计算FAT区域的长度?

我知道 MBR 从簇 0 开始,FAT Area 从簇 1 开始。但是我不知道我可以使用什么信息来计算 FAT 区域的长度。

另外,根目录从数据区的第一个簇开始,那么如何计算根目录的长度呢?

4

1 回答 1

0

这是 FAT12 (MSDOS 6.22) 软盘映像的样子:

FAT12 映像示例

  • 左上角是根目录的 NC/VC 样式视图
  • 左下角是解码信息
  • 右边是扇区的表面图
  • 突出显示的绿色扇区是 MSODS.SYS 文件

驱动几何

  • 头 - 使用的表面边数
  • 轨道 - 每个磁头的轨道数
  • 扇区 - 每个磁道的扇区数
  • 集群 - 集群的大小

胖的

  • 扇区大小是驱动器的最小单位
  • cluster_size 是 FAT 表的最小单位
  • 所以cluster=N*sector在哪里N={1,2,3,4,...}
  • 驱动器大小是heads*tracks*sectors*sector_size
  • 现在 FAT 表必须覆盖 DATA 可用的整个区域(整个绿色/灰色的东西)
  • 确切地说,每个集群需要 1 个值。
  • 该值是关于以下内容的编码信息:
    • 下一个集群文件正在继续
    • 这是文件的最后一个集群
    • 该集群是为系统保留的,免费的,坏的,未格式化的,等等......
  • 所以首先你需要决定每个值要使用多少位
  • 例如,8 位值将您限制为每个驱动器 250 个集群
  • 这不是太多......
  • 这也限制了最大文件数,并且由于集群大小而浪费空间
  • 某些系统(如 FAT)不包括整个驱动器区域(仅数据区域)
  • 所以只有第一个和最后一个逻辑簇/扇区之间的区域存储在 FAT 中
  • 这节省了一点空间并为 DATA 释放了更多的集群索引

脂肪大小

  • FAT 可以是固定大小的(如 FAT12、MDOS 等)
    • 所以 FAT 表应该涵盖所有可能的条目,即 2^FAT_entry_bits
    • 对于 12 位 FAT12,它是 2^12=4096 个条目
    • 单个扇区适合floor(512*8/12)=341条目
    • 所以对于你的 FAT 你需要ceil(4096/341)=12扇区
  • 或变量
    • 在这种情况下,它的长度应该在 MBR 中的某个地方进行编码
    • 真正的问题是你知道簇大小还是 FAT 大小?
    • 所以使用以下之一:
    • FAT_entries=(drive_size-reserved)/cluster_size
    • cluster_size=(drive_size-reserved)/FAT_entries
    • 其中 reserved 是未包含在 FAT 中的区域(暂时设为 0)
    • 现在让 FAT 条目为16bit(2Byte)
    • 并有一个大小的驱动器2heads*1024tracks*64sectprs*512Byte=64MByte
    • 并想拥有cluster_size=4096Byte
    • 所以FAT_entries=64*1024*1024/4096=16*1024
    • 现在只需计算所需的扇区/集群的数量,如上例所示
于 2014-12-15T14:39:37.923 回答