Erstellen eines bestimmten FAT12-Dateisystems mit dem Befehl mkfs

Erstellen eines bestimmten FAT12-Dateisystems mit dem Befehl mkfs

Ich arbeite derzeit an der Betriebssystementwicklung auf einem Linux-Rechner. Dabei möchte ich ein FAT12-Dateisystem auf einer Datei (z. B. Disk.img) erstellen. Ich verwende den Befehl mkfs wie folgt:

touch Disk.img
truncate Disk.img -s 1M
mkfs.vfat -F12 Disk.img

Beim Betrachten mit einem Hex-Editor stelle ich fest, dass „SECTORS_PER_FAT“ standardmäßig 2 ist. Ich möchte daraus 9 machen. Wie mache ich das??

bearbeiten: Der BIOS-Parameterblock enthält die folgenden Informationen (die ich einfach nicht manuell machen möchte und stattdessen mkfs verwenden möchte)

(Dies ist ein Assembly-Ausschnitt aushttp://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   "

Übrigens ... ich denke, dass die Gesamtzahl der Cluster und Sektoren pro Cluster automatisch die Größe von FAT (in Anzahl der Sektoren) bestimmen sollte ... Daher könnte die Definition von „sectors_per_fat“ im BPB überflüssig sein ... Das bedeutet, dass es keinen beliebigen Wert annehmen kann ...

Antwort1

Mir ist aufgefallen, dass „SECTORS_PER_FAT“ standardmäßig 2 beträgt. Ich möchte daraus 9 machen. Wie mache ich das?

Diese Zahl scheint automatisch berechnet zu werden. Da die Dateizuordnungstabelle einen Eintrag pro Cluster hat und die Anzahl der Cluster endlich und im Voraus bekannt ist, macht es keinen Sinn, der FAT weitere Sektoren zuzuordnen.

In Ihrem Fall ist 2 nicht „standardmäßig“, sondern wird hauptsächlich durch die Dateisystemgröße (die Größe von Disk.img) und die Clustergröße bestimmt.

Nehmen Sie die minimal mögliche Clustergröße (d. h. minimale logische Sektorgröße ( -S512) und minimale Anzahl von Sektoren pro Cluster ( -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}'

Damit erhalten Sie die maximale Anzahl von Clustern für die angegebene Dateigröße, also die maximale Anzahl von Einträgen in FAT, also die maximale FAT-Größe, also die maximale Anzahl von Sektoren, die pro FAT benötigt werden. Trotzdem sind es nur 6.

Ich denke, theoretisch können Sie formal mehr Sektoren zuordnen und das Dateisystem wird gültig sein. Der Punkt ist, dass jeder zusätzliche Sektor in FAT nie verwendet würde, da alle Cluster bereits durch Einträge in diesen 6 Sektoren abgedeckt sind. In der Praxis mkfs.vfatwerden auf diese Weise keine Sektoren verschwendet.


RauhBerechnung, wie 1 MiB und -S512 -s16 Sektoren pro FAT ergeben:

  1. WirVernachlässigungStrukturen außer Clustern, als ob der gesamte Speicherplatz zu Clustern beitragen würde. -S512 -s1Ein Cluster benötigt 0,5 KiB. 1 MiB enthält genau 2 Ki solcher Cluster. Beachten Sie, dass bei dieser Berechnung die Anzahl der Clusteraufgeblasenin Bezug auf den strengen Wert.
  2. In FAT12 benötigt ein Eintrag 12 Bit (2 Einträge pro 3 Bytes), also 1,5 B. Wir brauchen einen Eintrag pro Cluster. 2 Ki Einträge benötigen 3 KiB. FAT sollte also 3 KiB benötigen und diese Zahl ist auchaufgeblasen.
  3. Ein einzelner Sektor ist 0,5 KiB groß. Sie benötigen 6 Sektoren, um 3 KiB zu speichern. Da 3 KiB etwas aufgebläht war, benötigen Siemaximal6 Sektoren.

Das Tool berechnet diese Zahl strenger.


Die Anzahl der FATs ( -f) spielt kaum eine Rolle. Es ist nicht so, dass Cluster auf einzelne FATs aufgeteilt werden. Zusätzliche FATs sind nur Kopien und jedes bedient weiterhin alle Cluster. Mehr FATs benötigen mehr Platz, wodurch die Anzahl der Cluster leicht reduziert wird. Bei einigen „Schwellengrößen“ des Dateisystems wirkt sich dieses Phänomen auf die Anzahl der Sektoren pro FAT aus. Bei 1 MiB beträgt -S512 -s1die erforderliche Anzahl von Sektoren pro FAT jedoch unabhängig davon 6 -f(Hinweis: In meinen Tests mkfs.vfathabe ich mich geweigert, mehr als 4 FATs zu erstellen).

Nachdem wir die Anzahl der Cluster für die gegebene Dateisystemgröße maximiert haben, besteht der einfachste Weg, die Anzahl der Sektoren pro FAT zu erhöhen, darin, das Dateisystem zu vergrößern. Wir haben 6 für 1 MiB, also werden wir wahrscheinlich 9 für 1,5 MiB bekommen. Tatsächlich:

truncate Disk.img -s 1536k
mkfs.vfat -F12 -S512 -s1 Disk.img
<Disk.img od -j22 -N2 -tu2 | awk 'NR==1{print $2}'

Beachten Sie 1536k, dass dies nicht die Mindestgröße ist, um 9 zu erhalten. Bei meinen Tests 1389kerhielt ich 9 und 1388k8. Jetzt kann man sehen, wie -fsich die Zahl auswirkt. Für 1389k -f2(der Standardwert) ergibt 9 und -f3ergibt 8. Für 1388k -f1ergibt 9 und -f2ergibt 8.


Mein Testbett:

  • Debian GNU/Linux 9
  • mkfs.vfatals symbolischer Link zumkfs.fat
  • mkfs.fatVersion: 4.1 (24.01.2017)

Verweise:

  1. Das FAT-Dateisystemvon Andries Brouwer
    (Es ist von 2002, aber ich glaube nicht, dass sich FAT12 seitdem wesentlich verändert hat)
  2. Aufbau des FAT-Dateisystemsauf Wikipedia

verwandte Informationen