1. 程式人生 > >【檔案系統】FAT12檔案系統簡介

【檔案系統】FAT12檔案系統簡介

1.FAT12檔案系統扇區分配

FAT12檔案系統由引導區、FAT表、根目錄項表和檔案資料區組成,其中引導區程式佔用扇區[0],FAT表1佔用扇區[1]~[9],FAT表2佔用扇區[10]~[18],根目錄項表儲存於扇區[19]~[32],使用者儲存的檔案或者子目錄位於扇區[33]之後。

FAT12
2880扇區
(1474560B)
邏輯扇區 佔用扇區 內容 磁碟CHS引數(磁頭/柱面/扇區)
0 1(512B) 載入程式 起:0/0/1
1 9(4608B) FAT檔案分配表1 起:0/0/2 止:0/0/10
10 9(4608B) FAT檔案分配表2 起:0/0/11 止:1/0/1
19 14(9728B)
目錄檔案項
33 end 檔案資料區
表1 - FAT12檔案系統扇區分配圖

2.FAT12的引導區

引導區儲存的比較重要的資訊有檔案系統的型別、檔案系統邏輯扇區總數、每簇包含的扇區數(還有磁軌和扇區的關係等等,先不深究吧),引導區最後以0x55AA兩個位元組作為結束,共佔用一個扇區。
標識 偏移量 型別 大小 說明 預設值

0

db

3

跳轉指令
BS_OEMName

3

db

8

OEM字串,必須為8個字元,不足以空格填空 MSWIN4.1
BPB_BytsPerSec

11

dw

2

每扇區位元組數
200h
BPB_SecPerClus

13

db

1

每簇佔用的扇區數 1
BPB_RsvdSecCnt

14

dw

2

保留扇區數 1
BPB_NumFATs

16

db

1

FAT表的記錄數 2
BPB_RootEntCnt

17

dw

2

最大根目錄檔案數 0e0h
BPB_TotSec16

19

dw

2

邏輯扇區總數 0b40h
BPB_Media

21

db

1

媒體描述符 0f0h
BPB_FATSz16

22

dw

2

每個FAT佔用扇區數
9
BPB_SecPerTrk

24

dw

2

每個磁軌扇區數 12h
BPB_NumHeads

26

dw

2

磁頭數 2
BPB_HiddSec

28

dd

4

隱藏扇區數 0
BPB_TotSec32

32

dd

4

如果BPB_TotSec16是0,則在這裡記錄扇區總數 0
BS_DrvNum

36

db

1

中斷13的驅動器號 0
BS_Reserved1

37

db

1

未使用 0
BS_BootSig

38

db

1

擴充套件引導標誌 29h
BS_VolID

39

dd

4

卷序列號 0
BS_VolLab

43

db

11

卷標,必須是11個字元,不足以空格填充
BS_FileSysType

54

db

8

檔案系統型別,必須是8個字元,不足填充空格 FAT12  

62

引導程式碼,由偏移0位元組處的短跳轉而來

510

dw

2

系統引導標識 0aa55h  
表2 - 引導區結構 系統的bootloader根據引導區的儲存內容可以確定檔案系統資訊,從引導區第62個位元組開始的載入程式,我們就可以初始化外圍裝置和跳轉到二次載入程式或者進入系統入口點。

3.FAT12檔案系統的檔案索引方法

FAT12檔案系統上有兩個FAT表和檔案目錄項表,其檔案的索引工作全由這些表共同完成。 FAT表-儲存的是關於簇的使用情況,其中 0ff0-0ff7h代表壞簇,磁軌或柱面損壞不可使用,在格式式磁碟時由系統自動填充; 0ff8-0fffh代表檔案內容結束,到此簇為止; 其它的值代表著下一個簇號,也就是所謂的簇鏈。 在FAT12檔案系統中,最小儲存單元是簇,如一個扇區佔用512個位元組,如果此時檔案系統一個簇佔用2個扇區,當我需要儲存一個1500位元組的檔案時,將會佔用2個簇,即2048個位元組,多佔用的空間是不可再用了。對於FAT12檔案系統,簇的序號由12bit進行編號,也就是說最多隻支援4096個簇,這也是FAT12支援的最大檔案數量不確定的原因(一個檔案可能會佔用多個簇)。值得注意的是我們是從簇[2]開始用於儲存檔案的,且格式化的時候,磁碟卷標通常就會佔用了簇[2]的空間。所以實際上我們新建檔案或者建立子目錄是從簇[3]開始的。
圖1 - FAT表字節位置與簇號的儲存關係(FAT12中一個簇號佔用1.5位元組) 檔案目錄項佔用14個扇區,每個項佔用32個位元組(這裡是針對短檔名記錄結構而非長檔名檔案),表示支援的最大根目錄數量=扇區位元組數*14/32=224。 FAT檔案系統下建立子目錄和檔案的異同: 類同 FAT檔案系統對於建立檔案和建立子目錄的操作是基本一致的,都是在檔案目錄項表中增加32位元組來儲存其屬性和起始簇號等等。 差異 >>>>在建立檔案的時候,會佔用檔案目錄項中的一項(32位元組),並會分配至少一個簇的空間給檔案,並修改FAT表中對應簇號的狀態(如檔案結束則填入0ff8-0fffh的內容,如果超過一個簇則填入下一個簇的編號); >>>>在建立子目錄時,其步驟如下: a.在父目錄所在簇上建立新的目錄項,儲存當前所建資料夾資訊;(根目錄上的每個32位元組檔案項均寫到這裡?)
b.分配一個新簇,給新建的資料夾建立兩個目錄項:父目錄和當前目錄;
c.在FAT表中新分配的簇對應的位置上寫下檔案結束符;
d.建立各部分的鏈路關係:新建資料夾所對應的目錄項的檔案起始簇號欄位寫上新分配簇的簇號,新簇上的兩個目錄項的檔案起始簇號欄位分配寫上父目錄所在簇號。

圖2 - FAT12目錄項資料結構(偏移以位元組為單位,共佔用32個位元組) ------------------------------------------------------------------------------------------ 檔案屬性: 00000000:普通檔案,可隨意讀寫
00000001:只讀檔案,不可改寫
00000010:隱藏檔案,瀏覽檔案時隱藏列表
00000100:系統檔案,刪除的時候會有提示
00001000:卷標,作為磁碟的卷識別符號
00010000:目錄檔案,此檔案是一個子目錄,它的內容就是此目錄下的所有檔案目錄項
00100000:歸檔檔案
檔案的屬性可以疊加使用,可以具有多重屬性,即設定為只讀的時候也可以同時隱藏。
------------------------------------------------------------------------------------------

檔案建立位置的區別:

當在根目錄下建立檔案(資料夾)時,由於FAT12檔案系統根目錄檔案項限制於224個,所以在根目錄下最多隻能存在224個檔案(資料夾),當然遇到長檔名的情況,會使得儲存檔案數量下降。當在非根目錄下建立檔案(資料夾)時,會在目錄分配的新簇中寫入相應目錄項,所以不受限於根目錄檔案項數。(這裡不知道理解的對不對,請指正) ------------------------------------------------------------------------------------------ 檔案索引步驟: 先在檔案目錄項表中找到對應的檔名的那32個位元組,在第26位元組中,我們得到檔案的起始簇號,然後得到檔案一個簇空間的內容,再到FAT表中起始簇號對應的偏移位元組中得到檔案連結的下一個簇號,在從對應的偏移位元組中,獲取下一個簇號,直至遇到檔案結束符,這樣就可以得到檔案所有內容,以此類推。

4.長檔名的儲存規則

(待續。。。)