В настоящее время я занимаюсь разработкой ОС на Linux-машине. В процессе я хочу создать файловую систему FAT12 для файла (например, Disk.img). Я использую команду 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 (в количестве секторов)... Так что определение sector_per_fat в BPB может быть излишним... Это означает, что он не может принимать произвольное значение...
решение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 МБ и -S512 -s1
дать 6 секторов на FAT:
- Мыпренебрегатьструктуры, отличные от кластеров, как если бы все пространство было отдано кластерам.
-S512 -s1
Кластер занимает 0,5 КиБ. 1 МиБ содержит ровно 2 Ки таких кластеров. Обратите внимание, что в этом расчете число кластеров равнораздутыйотносительно строгого значения. - В FAT12 одна запись занимает 12 бит (2 записи на 3 байта), то есть 1,5 Б. Нам нужна одна запись на кластер. 2 Ки записей занимают 3 КиБ. Так что FAT должна занимать 3 КиБ, и это число такжераздутый.
- Один сектор — это 0,5 КиБ. Вам нужно 6 секторов, чтобы вместить 3 КиБ. Поскольку 3 КиБ были несколько раздуты, вам нужнов большинстве6 секторов.
Инструмент рассчитывает это число более строго.
Количество FAT ( -f
) вряд ли имеет значение. Это не то, что кластеры разделены между отдельными FAT. Дополнительные FAT являются просто копиями, и каждая по-прежнему обслуживает все кластеры. Больше FAT занимают больше места, это немного уменьшает количество кластеров. Для некоторых «пороговых размеров» файловой системы это явление влияет на количество секторов на FAT. Однако для 1 MiB и -S512 -s1
необходимого количества секторов на FAT 6 независимо от -f
(примечание: в моих тестах mkfs.vfat
отказалась создавать более 4 FAT).
После того, как мы максимизировали количество кластеров для заданного размера filsystem, самый простой способ увеличить количество секторов на FAT — сделать файловую систему больше. Мы получили 6 для 1 MiB, так что, вероятно, получим 9 для 1,5 MiB. Действительно:
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Андрис Брауэр
(Это от 2002 года, но я не думаю, что FAT12 существенно изменилась с тех пор) - Проектирование файловой системы FATв Википедии