對磁盤的物理結(jié)構(gòu),邏輯結(jié)構(gòu)和存儲結(jié)構(gòu)有了比較深入的了解后,我們來仔細探討FAT32文件系統(tǒng)的存儲組織結(jié)構(gòu)。說到文件系統(tǒng)的組織結(jié)構(gòu),我們應該馬上意識到,這指的是文件系統(tǒng)在同一個分區(qū)內(nèi)的組織結(jié)構(gòu),在這個話題上,我們完全可以不管分區(qū)之外的所有事情。
為了分析FAT32文件系統(tǒng)的存儲組織結(jié)構(gòu),我們來建立一個實實在在的文件系統(tǒng):將U盤插入電腦,將U盤格式化成FAT32分區(qū)格式:
26913704_1337417579yTAp.jpg (21.77 KB, 下載次數(shù): 73)
下載附件
2017-4-1 22:29 上傳
以建好的U盤FAT32文件系統(tǒng)為基礎(chǔ),下面從文件系統(tǒng)的各個組成來分別加以介紹。
分區(qū)引導扇區(qū)DBR
用winhex打開U盤顯示如下:
26913704_1337417622SapJ.jpg (173.39 KB, 下載次數(shù): 80)
下載附件
2017-4-1 22:29 上傳
這是FAT32分區(qū)引導記錄 ,定義如下:
偏移00H: 3字節(jié)的 跳轉(zhuǎn)指令 EB 58 90,跳過下面的BPB和擴展BPB部分
偏移03H:8字節(jié)的硬盤分區(qū)類型文本字符名:4D 53 44 4F 53 35 2E 30 即: MSDOS5.0
偏移0BH: 25字節(jié)的分區(qū)參數(shù)塊(BPB),細分如下:
偏移0BH:扇區(qū)字節(jié)數(shù) 00 02 即0X0200,512字節(jié)
偏移0DH:每簇扇區(qū)數(shù) 08即每簇包括8個扇區(qū)
偏移0EH:保留扇區(qū)數(shù) 24 00即保留36個扇區(qū)
偏移10H:FAT表份數(shù) 02即兩個FAT表
偏移11H:未用 00 00
偏移13H:未用 00 00
偏移15H:介質(zhì)類型 F8即本地硬盤
偏移16H:未用 00 00
偏移18H:每磁道扇區(qū)數(shù) 3F 00 即每磁道63扇區(qū)
偏移1AH:磁頭數(shù) FF 00即255個磁頭
偏移1CH:隱藏扇區(qū)數(shù) 80 1F即8064個隱藏扇區(qū)
偏移20H:磁盤總扇區(qū)數(shù) 80 F0 77 00即總共7860352個扇區(qū)(7860352*512=4024500224,因為我的U盤是4G)
偏移24H:52字節(jié)的擴展分區(qū)參數(shù)塊(擴展BPB),細分如下:
偏移24H:FAT表占用扇區(qū)數(shù) EE 1D 00 00即FAT表占7662個扇區(qū)
偏移28H:未用 00 00 00 00
偏移2CH:根目錄入口簇號 02 00 00 00即根目錄從02號簇開始
偏移30H:文件系統(tǒng)信息扇區(qū)號 01 00即扇區(qū)1
偏移32H:備份引導扇區(qū)的位置 06 00即6號扇區(qū)(第7個扇區(qū)),從WINHEX中我們也可以看到,6號扇區(qū)的內(nèi)容和0號引導扇區(qū)內(nèi)容 是 一樣的
偏移34H:未用 00 00 00 00 00 00 00 00 00 00 00 00
偏移40H:物理磁盤號 00
偏移41H:未用 00
偏移42H:擴展引導標志 29即0X29
偏移43H:磁盤序列號F1 2A 27 04通常為一隨機數(shù)
偏移47H:卷標ASCII 4E 4F 20 4E 41 4D 45 20 20 20 20 即NO NAME
偏移52H:文件系統(tǒng)格式ASCII 46 41 54 33 32 20 20 20即FAT32
偏移5AH:分區(qū)引導代碼 420字節(jié):
33C98ED1BCF47B8EC18ED9BD007C884E028A5640B408CD137305B9FFFF8AF166
0FB6C640660FB6D180E23FF7E286CDC0ED0641660FB7C966F7E1668946F8837E1
6007538837E2A007732668B461C6683C00CBB0080B90100E82B00E94803A0FA7DB
47D8BF0AC84C074173CFF7409B40EBB0700CD10EBEEA0FB7DEBE5A0F97DEBE0
98CD16CD196660663B46F80F824A00666A0066500653666810000100807E02000F8
52000B441BBAA558A5640CD130F821C0081FB55AA0F851400F6C1010F840D00FE4
602B4428A56408BF4CD13B0F96658665866586658EB2A6633D2660FB74E1866F7F1
FEC28ACA668BD066C1EA10F7761A86D68A56408AE8C0E4060ACCB80102CD13666
10F8254FF81C300026640490F8571FFC34E544C445220202020202000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000
00000000000000D0A52656D6F7665206469736B73206F72206F74686572206D656469
612EFF0D0A4469736B206572726F72FF0D0A507265737320616E79206B657920746F2
0726573746172740D0A0000000000ACCBD80000
偏移1FEH:有效扇區(qū)結(jié)束標志 55 AA
到此分區(qū)引導扇區(qū)介紹結(jié)束。
文件分配表FAT
簡介:
FAT表(文件分配表),是FAT文件系統(tǒng)中用于磁盤數(shù)據(jù)索引和定位而引進的一種鏈式結(jié)構(gòu)。在FAT文件系統(tǒng)中,文件的存儲依照FAT表制定的簇鏈式數(shù)據(jù)結(jié)構(gòu)來進行。同時,F(xiàn)AT文件系統(tǒng)將組織數(shù)據(jù)時使用的目錄也抽象為文件,以簡化對數(shù)據(jù)的管理。
FAT1表位置的定位:
在我們前面介紹分區(qū)引導記錄的時候提到,在偏移0EH處存儲了保留扇區(qū)的個數(shù),這個保留扇區(qū)數(shù)指的就是當前分區(qū)內(nèi)DBR到FAT表之間的所有扇區(qū)的個數(shù)(包括DBR但不包括FAT表)。因此,我們可以定位FAT表所在的起始偏移位置了,即24H*200H=4800H。我們貼出4800H處得部分內(nèi)容如下:
26913704_133741764193PP.jpg (73.96 KB, 下載次數(shù): 87)
下載附件
2017-4-1 22:29 上傳
顯然沒有錯,這就是我們FAT1所存儲的位置,只是當前沒有存儲文件,所以FAT比較簡單罷了。
FAT2表位置的定位:
在我們前面介紹分區(qū)引導記錄的時候提到,在偏移24H處存儲了FAT表所占用的扇區(qū)個數(shù),我們又知道FAT2是緊鄰FAT1的,所以可以很容易得到FAT2的存儲位置的偏移地址:FAT1的起始偏移地址+FAT1的大小=4800H+1DEEH*200H=3C2400H,我們貼出3C2400H處的部分內(nèi)容如下:
26913704_1337417687S1X8.jpg (77.96 KB, 下載次數(shù): 97)
下載附件
2017-4-1 22:29 上傳
顯然沒有錯,這就是我們FAT2所存儲的位置,內(nèi)容與FAT1相同。
FAT表的特性:
FAT表由一系列大小相等的FAT表項組成,它有如下特性:
FAT32中每個簇的簇地址,使用32bit(4個字節(jié))記錄在FAT表中。FAT表中的所有字節(jié)位置以4個字節(jié)為單位進行劃分,并對所有劃分后的位置由0進行地址編號。0 號地址與1號地址被系統(tǒng)保留并存儲特殊標志內(nèi)容。從2號地址開始,每個地址對應于數(shù)據(jù)區(qū)的簇號,F(xiàn)AT表中的地址編號與數(shù)據(jù)區(qū)中的簇號相同。我們稱FAT中的這些地址為FAT表項,F(xiàn)AT表項中記錄的值稱為FAT表項值。
當文件系統(tǒng)被創(chuàng)建,也就是進行格式化操作時,分配給FAT區(qū)域的空間將會被清空,在FAT1與FAT2的0號表項與1號表項寫入特定值。由于創(chuàng)建文件系統(tǒng)的同時也會創(chuàng)建根目錄,也就是為根目錄分配了一個簇空間,通常為2號簇,所以2號簇所對應的2號FAT表項也會被寫入一個結(jié)束標記。
如果某個簇未被分配使用,它所對應的FAT表項內(nèi)的FAT表項值即用0進行填充,表示該FAT表項所對應的簇未分配使用。
當某個簇已被分配使用時,則它對應的FAT表項值也就是該文件的下一個存儲位置的簇號。如果該文件結(jié)束于該簇,則在它的FAT表項中記錄的是一個文件結(jié)束標記,對于FAT32而言,代表文件結(jié)束的FAT表項值為0x0FFFFFFF。
如果某個簇存在壞扇區(qū),則整個簇會用FAT表項值0x0FFFFFF7標記為壞簇,不再使用,這個壞簇標記就記錄在它所對應的FAT表項中。
由于簇號起始于2,所以FAT表的0號表項與1號表項不與任何簇對應。FAT32的0號表項值總是“F8FFFF0F”。1號表項可能被用于記錄臟標志,以說明文件系統(tǒng)沒有被正常卸載或者磁盤表面存在錯誤。不過此值似乎并不重要,因此我們只要了解就可以。正常情況下,1號表項值為“FFFFFFFF”或“FFFFFF0F"。
在文件系統(tǒng)中新建文件時,如果新建的文件只占用一個簇,為其分配的簇所對應的FAT表項將會被寫入結(jié)束標記。如果新建的文件不只占用一個簇,則在其所占用的每個簇對應的FAT表項中寫入為其分配的下一簇的簇號,在最后一個簇對應的FAT表項中寫入結(jié)束標記。
新建目錄時,只為其分配一個簇的空間,對應的FAT表項中寫入結(jié)束標記。當目錄增大超出一個簇的大小時,將會在空閑空間中繼續(xù)為其分配一個簇,并在FAT表中為其建立FAT表鏈以描述它所占用的簇情況。
對文件或目錄進行刪除操作時,它們所對應的FAT表項將會被清空,設(shè)置為0以表示其所對應的簇處于未分配狀態(tài)。
根目錄區(qū)
簡介:
在FAT32文件系統(tǒng)中,根目錄的位置不再硬性地固定,可以存儲在分區(qū)內(nèi)可尋址的任意簇內(nèi),不過通常根目錄是最早建立的(格式化就生成了)目錄表。所以,我們看到的情況基本上都是根目錄首簇緊鄰FAT2,占簇區(qū)順序上的第1個簇(即2號簇)。同時,F(xiàn)AT32文件系統(tǒng)將根目錄當做普通的數(shù)據(jù)文件來看,所有沒有了目錄項數(shù)的限制,在需要的時候可以分配空簇,存儲更多的目錄項。
起始偏移地址定位:
根目錄起始扇區(qū)=保留扇區(qū)數(shù)+FAT×2+(起始簇-2)x每簇的扇區(qū)數(shù),在我們前面介紹分區(qū)引導記錄的時候提到,偏移2CH處保存了根目錄起始簇號是2,所以求得根目錄起始扇區(qū)是24H+1DEEH*2H+(2-2)*8H=3C00H,即求得偏移地址3C00H*200H=780000H,我們貼出780000H處的部分內(nèi)容如下:
26913704_1337417728d6Ni.jpg (90.99 KB, 下載次數(shù): 69)
下載附件
2017-4-1 22:29 上傳
目錄區(qū)的一個目錄項占用32個字節(jié),可以是長文件名目錄項、文件目錄項、子目錄項等。
短文件名格式的目錄項
對于短文件名格式的目錄項。其參數(shù)意義如下:
26913704_13374177831ELN.jpg (73.83 KB, 下載次數(shù): 79)
下載附件
2017-4-1 22:29 上傳
根據(jù)參數(shù)定義,我們來分析一下上圖的目錄項 54 45 53 54 5F 46 41 54 33 32 20 08 00 00 00 00 00 00 00 00 00 00 19 95 10 3F 00 00 00 00 00 00。其中起始11字節(jié)54 45 53 54 5F 46 41 54 33 32 20 是卷標TEST_FAT32;第12字節(jié)08指示當前目錄項保存的是卷標;第23-24字節(jié)19 95即9519H,是最近修改時間:19點40分50秒;第25-26字節(jié)10 3F即3F10H,是最近修改日期:2011年8月16日;
長文件名格式的目錄項
FAT32的一個重要的特點是完全支持長文件名。長文件名依然是記錄在目錄項中的。為了低版本的OS或程序能正確讀取長文件名文件,系統(tǒng)自動為所有長文件名文件創(chuàng)建了一個對應的短文件名,使對應數(shù)據(jù)既可以用長文件名尋址,也可以用短文件名尋址。不支持長文件名的OS或程序會忽略它認為不合法的長文件名字段,而支持長文件名的OS或程序則會以長文件名為顯式項來記錄和編輯,并隱藏起短文件名。
當創(chuàng)建一個長文件名文件時,系統(tǒng)會自動加上對應的短文件名,其原則如下:
(1)、取長文件名的前6個字符加上"~1"形成短文件名,擴展名不變。
(2)、如果已存在這個文件名,則符號"~"后的數(shù)字遞增,直到5。
長文件名的實現(xiàn)有賴于目錄項第12字節(jié)屬性字節(jié),當此字節(jié)的值為0FH時,支持長文件名的系統(tǒng)會將其當做長文件名的依據(jù),而只支持短文件名的系統(tǒng)會認為是異常而忽略掉。系統(tǒng)將長文件名以13個字符為單位進行切割,每一組占據(jù)一個目錄項。所以可能一個文件需要多個目錄項,這時長文件名的各個目錄項按倒序排列在目錄表中,以防與其他文件名混淆。
長文件名中的字符采用unicode形式編碼,每個字符占據(jù)2字節(jié)的空間。其目錄項定義如:
26913704_13374178076643.jpg (42.27 KB, 下載次數(shù): 78)
下載附件
2017-4-1 22:29 上傳
下面是我建立的長文件名文件夾abcdefghijklmnopqrstuvwxyz1234567890的目錄項:
26913704_1337417874cuwW.jpg (41.96 KB, 下載次數(shù): 69)
下載附件
2017-4-1 22:29 上傳
前面已經(jīng)基于一個格式化的空U盤分析了一下FAT32文件系統(tǒng)存儲的組織結(jié)構(gòu),下面我們從文件操作的角度來分析一下文件系統(tǒng)的運作機制。由于換了個U盤,所以仍然貼出剛格式化的空U盤的幾個重要的數(shù)據(jù)區(qū)如下:
26913704_1337420290Bfi5.jpg (147.07 KB, 下載次數(shù): 64)
下載附件
2017-4-1 22:29 上傳
26913704_1337420300tjc0.jpg (70.26 KB, 下載次數(shù): 74)
下載附件
2017-4-1 22:29 上傳
26913704_1337420325Vs5s.jpg (63.54 KB, 下載次數(shù): 80)
下載附件
2017-4-1 22:29 上傳
我們可以看出,在分區(qū)格式化的時候,系統(tǒng)將卷標TEST_FAT32存儲在2號簇,即跟目錄區(qū),如上面根目錄貼圖所示。同時,在FDT區(qū)2號簇標記位置寫入了文件結(jié)束符FF FF FF 0F。顯然,F(xiàn)AT32文件系統(tǒng)將目錄當做普通文件來處理的。
下面我們在根目錄下新建一個文件夾TEST1,看會有什么變化:
建立了TEST1文件夾后,F(xiàn)DT變成如下:
26913704_13374203419UyE.jpg (53.74 KB, 下載次數(shù): 88)
下載附件
2017-4-1 22:29 上傳
根目錄變成如下:
26913704_1337420359zJcB.jpg (45.29 KB, 下載次數(shù): 70)
下載附件
2017-4-1 22:29 上傳
重新分配了3號簇:
26913704_1337420374Kr7z.jpg (60.1 KB, 下載次數(shù): 85)
下載附件
2017-4-1 22:29 上傳
從上面的變化可以直觀的看出,系統(tǒng)在新建文件夾時完成了如下動作:
a.在父目錄所在簇上建立新的目錄項,存儲當前所建文件夾信息。
b.分配一個新簇,給新建的文件夾建立兩個目錄項:父目錄和當前目錄。
c.在FDT表中新分配的簇對應的位置上寫下文件結(jié)束符。
d.建立各部分的鏈路關(guān)系:新建文件夾所對應的目錄項的文件起始簇號字段寫上新分配簇的簇號,新簇上的兩個目錄項的文件起始簇號字段分配寫上父目錄所在簇號(此處是0,本來我以為是2,即根目錄所在簇,不知道為什么,可能特地用0指示根目錄吧)和當前簇號(此處是3)。
為了驗證我們上面分析的正確性,我們再在TEST1文件夾下建立新文件夾TEST11,看是否做了如下操作:
a.在父目錄(即TEST1)所在簇(即3號簇)上建立新的目錄項,存儲TEST11文件夾信息。
b.分配一個新簇(應該是4號簇),給新建的文件夾(即TEST11)建立兩個目錄項:父目錄和當前目錄。
c.在FDT表中新分配的簇(應該是4號簇)對應的位置上寫下文件結(jié)束符。
d.建立各部分的鏈路關(guān)系:新建文件夾(即TEST11)所對應的目錄項的文件起始簇號字段寫上新分配簇的簇號(應該是4號簇),,新簇上的兩個目錄項的文件起始簇號字段分配寫上父目錄所在簇號(3號簇)和當前簇號(應該是4號簇)。
新建TEST11文件夾后FDT變成:
26913704_1337420382762G.jpg (53.85 KB, 下載次數(shù): 66)
下載附件
2017-4-1 22:29 上傳
根目錄沒有變化:
26913704_1337420392ZWlW.jpg (45.29 KB, 下載次數(shù): 84)
下載附件
2017-4-1 22:29 上傳
3號簇變成:
26913704_1337420402SQ81.jpg (63.16 KB, 下載次數(shù): 88)
下載附件
2017-4-1 22:29 上傳
新分配4號簇:
26913704_13374204139sYT.jpg (53.95 KB, 下載次數(shù): 79)
下載附件
2017-4-1 22:29 上傳
顯然我們的估計沒有錯的,也進一步證明我們前面的分析是正確的。
下面我們再分析建立文件的情況
我們先建立一個100字節(jié)的文件TEST.TXT,然后把這個文件拷貝到U盤的根目錄下,F(xiàn)DT變成如下:
26913704_1337420427yd90.jpg (62.36 KB, 下載次數(shù): 76)
下載附件
2017-4-1 22:29 上傳
根目錄變成:
26913704_1337420443yPZ1.jpg (76.86 KB, 下載次數(shù): 80)
下載附件
2017-4-1 22:29 上傳
新分配5號簇保存文件內(nèi)容:
26913704_13374204567EX7.jpg (69.39 KB, 下載次數(shù): 64)
下載附件
2017-4-1 22:29 上傳
從上面的變化可以直觀的看出,系統(tǒng)新建文件和新建文件夾所完成的操作是一樣一樣的:
a.在父目錄所在簇上建立新的目錄項,存儲當前所建文件信息。
b.分配一個新簇,存儲新建的文件的內(nèi)容。
c.在FDT表中新分配的簇對應的位置上寫下文件結(jié)束符。
d.建立鏈路關(guān)系:新建文件所對應的目錄項的文件起始簇號字段寫上新分配簇的簇號。
結(jié)束總結(jié):
1.在FAT32文件系統(tǒng)中,目錄和文件的存儲采用統(tǒng)一的方式。
2.文件系統(tǒng)的操作的單位是簇,每新建立一個文件或文件夾,至少會重新分配一個簇號。
3.如果一個文件或目錄的內(nèi)容要多個簇才能存儲得下,則系統(tǒng)會分配多個簇來存儲文件或目錄的內(nèi)容
4.當需要多個簇時,這些簇可能連續(xù)也可能不連續(xù),但無論是連續(xù)或是不連續(xù),系統(tǒng)都是采用FDT鏈表的形式來組織的。
|