我目前正在 Linux 机器上进行一些操作系统开发。在此过程中,我想在文件(例如 Disk.img)上创建 FAT12 文件系统。我使用 mkfs 命令如下:
touch Disk.img
truncate Disk.img -s 1M
mkfs.vfat -F12 Disk.img
使用十六进制编辑器查看时,我发现“SECTORS_PER_FAT”默认为 2。我想将其设置为 9。我该怎么做?
编辑:BIOS 参数块具有以下信息(我只是不想手动执行,而想使用 mkfs 来代替)
(这是来自http://www.brokenthorn.com/Resources/OSDev5.html)
bpbBytesPerSector: DW 512
bpbSectorsPerCluster: DB 1
bpbReservedSectors: DW 1
bpbNumberOfFATs: DB 2
bpbRootEntries: DW 224
bpbTotalSectors: DW 2880
bpbMedia: DB 0xF0
bpbSectorsPerFAT: DW 9 ;!!!!This is the thing I want to control!!!!
bpbSectorsPerTrack: DW 18
bpbHeadsPerCylinder: DW 2
bpbHiddenSectors: DD 0
bpbTotalSectorsBig: DD 0
bsDriveNumber: DB 0
bsUnused: DB 0
bsExtBootSignature: DB 0x29
bsSerialNumber: DD 0xa0a1a2a3
bsVolumeLabel: DB "MOS FLOPPY "
bsFileSystem: DB "FAT12 "
顺便说一句...我认为簇的总数和每个簇的扇区数应该自动确定 FAT 的大小(以扇区数为单位)...因此,在 BPB 中定义 sector_per_fat 可能是多余的...这意味着它不能取任何任意值....
答案1
我观察到“SECTORS_PER_FAT”默认为 2。我想将其设置为 9。我该怎么做?
这个数字似乎是自动计算的。由于文件分配表每个簇只有一个条目,而簇数是有限的且是预先知道的,因此没有必要为 FAT 分配更多扇区。
在您的情况下,2 不是“默认”,它主要由文件系统大小(大小Disk.img
)和集群大小决定。
采取最小可能的簇大小(即最小逻辑扇区大小(-S512
)和每个簇的最小扇区数(-s1
)):
# 'touch' is not needed, 'truncate' is enough
truncate Disk.img -s 1M
mkfs.vfat -F12 -S512 -s1 Disk.img
# the below line extracts the value we're after
<Disk.img od -j22 -N2 -tu2 | awk 'NR==1{print $2}'
这将为您提供给定文件大小的最大簇数,也就是 FAT 中的最大条目数,也就是最大 FAT 大小,也就是每个 FAT 所需的最大扇区数。但仍然只有 6 个。
我认为理论上你可以正式分配更多扇区,文件系统将有效。关键是 FAT 中的任何额外扇区都不会被使用,因为所有簇已经被这 6 个扇区中的条目覆盖。实际上mkfs.vfat
不会像这样浪费扇区。
粗糙的计算 1 MiB 并-S512 -s1
为每个 FAT 提供 6 个扇区:
- 我们忽视簇以外的结构,就好像所有空间都贡献给了簇。
-S512 -s1
一个簇占用 0.5 KiB。1 MiB 恰好容纳 2 Ki 个这样的簇。注意,在这个计算中,簇的数量是膨胀对于严格价值。 - 在 FAT12 中,一个条目占用 12 位(每 3 个字节 2 个条目),因此占用 1.5 B。每个簇需要一个条目。2 Ki 个条目占用 3 KiB。因此 FAT 应该占用 3 KiB,这个数字也是膨胀。
- 单个扇区为 0.5 KiB。您需要 6 个扇区来容纳 3 KiB。由于 3 KiB 有点夸大,因此您需要最多6 个部门。
该工具计算这个数字更加严格。
FAT 的数量 ( -f
) 几乎无关紧要。并不是说簇被划分到单独的 FAT 中。额外的 FAT 只是副本,每个副本仍为所有簇提供服务。更多的 FAT 占用更多空间,这会稍微减少簇的数量。对于文件系统的某些“阈值大小”,这种现象会影响每个 FAT 的扇区数。但是对于 1 MiB,-S512 -s1
每个 FAT 所需的扇区数是 6,无论如何-f
(注意:在我的测试中mkfs.vfat
拒绝创建超过 4 个 FAT)。
在给定文件系统大小的情况下,我们最大化了簇数之后,增加每个 FAT 扇区数的最简单方法是增大文件系统。我们用 1 MiB 获得了 6 个扇区,因此我们可能用 1.5 MiB 获得 9 个扇区。确实如此:
truncate Disk.img -s 1536k
mkfs.vfat -F12 -S512 -s1 Disk.img
<Disk.img od -j22 -N2 -tu2 | awk 'NR==1{print $2}'
注意,1536k
这不是获得 9 的最小大小。在我的测试中,1389k
它给了我 9,并1388k
给了我 8。现在我们可以看到它如何-f
影响数字。对于1389k
-f2
(默认值)给出 9,并-f3
给出 8。对于1388k
-f1
给出 9,并-f2
给出 8。
我的试验台:
- Debian GNU/Linux 9
mkfs.vfat
作为符号链接mkfs.fat
mkfs.fat
版本:4.1(2017-01-24)
参考:
- FAT 文件系统作者:Andries Brouwer
(这是 2002 年的,但我认为 FAT12 自那时起并没有发生重大变化) - FAT文件系统的设计在维基百科上