Создание указанной файловой системы FAT12 с помощью команды mkfs

Создание указанной файловой системы FAT12 с помощью команды mkfs

В настоящее время я занимаюсь разработкой ОС на 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:

  1. Мыпренебрегатьструктуры, отличные от кластеров, как если бы все пространство было отдано кластерам. -S512 -s1Кластер занимает 0,5 КиБ. 1 МиБ содержит ровно 2 Ки таких кластеров. Обратите внимание, что в этом расчете число кластеров равнораздутыйотносительно строгого значения.
  2. В FAT12 одна запись занимает 12 бит (2 записи на 3 байта), то есть 1,5 Б. Нам нужна одна запись на кластер. 2 Ки записей занимают 3 КиБ. Так что FAT должна занимать 3 КиБ, и это число такжераздутый.
  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)

Использованная литература:

  1. Файловая система FATАндрис Брауэр
    (Это от 2002 года, но я не думаю, что FAT12 существенно изменилась с тех пор)
  2. Проектирование файловой системы FATв Википедии

Связанный контент