使用 mkfs 指令製作指定的 FAT12 檔案系統

使用 mkfs 指令製作指定的 FAT12 檔案系統

我目前正在 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中定義sectors_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 個磁區:

  1. 我們忽視簇以外的結構,就好像所有空間都貢獻於簇。一個-S512 -s1集群需要 0.5 KiB。 1 MiB 正好容納 2 Ki 的這類簇。請注意,在此計算中簇的數量是膨脹的相對於嚴格值。
  2. 在 FAT12 中,一個條目佔用 12 位元(每 3 個位元組 2 個條目),因此 1.5 B。 2 Ki 的條目佔 3 KiB。所以 FAT 應該要佔 3 KiB,這個數字也是膨脹的
  3. 單一扇區為 0.5 KiB。您需要 6 個扇區才能容納 3 KiB。由於 3 KiB 有點膨脹,您需要最多6個部門。

該工具更嚴格地計算這個數字。


FAT 的數量 ( -f) 並不重要。並不是簇被劃分在單獨的 FAT 中。額外的 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尺寸。 For (預設值)給出 9並給出8。1388k-f1389k -f2-f31388k -f1-f2


我的測試台:

  • Debian GNU/Linux 9
  • mkfs.vfat作為符號連結mkfs.fat
  • mkfs.fat版本:4.1(2017-01-24)

參考:

  1. FAT 檔案系統作者:Andries Brouwer
    (這是 2002 年的內容,但我認為 FAT12 從那時起沒有顯著變化)
  2. FAT檔案系統的設計在維基百科上

相關內容