對磁盤的物理結構。邏輯結構和存儲結構有了比較深刻的瞭解後,咱們來細緻探討FAT32文件系統的存儲組織結構。html
說到文件系統的組織結構,咱們應該當即意識到。這指的是文件系統在同一個分區內的組織結構,在這個話題上,咱們全然可以不管分區以外的所有事情。api
爲了分析FAT32文件系統的存儲組織結構,咱們來創建一個實實在在的文件系統:將U盤插入電腦,將U盤格式化成FAT32分區格式:數據結構
以建好的U盤FAT32文件系統爲基礎,如下從文件系統的各個組成來分別加以介紹。ui
分區引導扇區DBR編碼
用winhex打開U盤顯演示樣例如如下:url
這是FAT32分區引導記錄 ,定義例如如下:spa
偏移00H: 3字節的 跳轉指令 EB 58 90,跳過如下的BPB和擴展BPB部分.net
偏移03H:8字節的硬盤分區類型文本字符名:4D 53 44 4F 53 35 2E 30 即: MSDOS5.0unix
偏移0BH: 25字節的分區參數塊(BPB),細分例如如下:code
偏移0BH:扇區字節數 00 02 即0X0200,512字節
偏移0DH:每簇扇區數 08即每簇包含8個扇區
偏移0EH:保留扇區數 24 00即保留36個扇區
偏移10H:FAT表份數 02即兩個FAT表
偏移11H:未用 00 00
偏移13H:未用 00 00
偏移15H:介質類型 F8即本地硬盤
偏移16H:未用 00 00
偏移18H:每磁道扇區數 3F 00 即每磁道63扇區
偏移1AH:磁頭數 FF 00即255個磁頭
偏移1CH:隱藏扇區數 80 1F即8064個隱藏扇區
偏移20H:磁盤總扇區數 80 F0 77 00即總共7860352個扇區(7860352*512=4024500224。由於個人U盤是4G)
偏移24H:52字節的擴展分區參數塊(擴展BPB)。細分例如如下:
偏移24H:FAT表佔用扇區數 EE 1D 00 00即FAT表佔7662個扇區
偏移28H:未用 00 00 00 00
偏移2CH:根文件夾入口簇號 02 00 00 00即根文件夾從02號簇開始
偏移30H:文件系統信息扇區號 01 00即扇區1
偏移32H:備份引導扇區的位置 06 00即6號扇區(第7個扇區)。從WINHEX中咱們也可以看到,6號扇區的內容和0號引導扇區內容 是 同樣的
偏移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一般爲一隨機數
偏移47H:卷標ASCII 4E 4F 20 4E 41 4D 45 20 20 20 20 即NO NAME
偏移52H:文件系統格式ASCII 46 41 54 33 32 20 20 20即FAT32
偏移5AH:分區引導代碼 420字節:
33C98ED1BCF47B8EC18ED9BD007C884E028A5640B408CD137305B9FFFF8AF166
0FB6C640660FB6D180E23FF7E286CDC0ED0641660FB7C966F7E1668946F8837E1
6007538837E2A007732668B461C6683C00CBB0080B90100E82B00E94803A0FA7DB
47D8BF0AC84C074173CFF7409B40EBB0700CD10EBEEA0FB7DEBE5A0F97DEBE0
98CD16CD196660663B46F80F824A00666A0066500653666810000100807E02000F8
52000B441BBAA558A5640CD130F821C0081FB55AA0F851400F6C1010F840D00FE4
602B4428A56408BF4CD13B0F96658665866586658EB2A6633D2660FB74E1866F7F1
FEC28ACA668BD066C1EA10F7761A86D68A56408AE8C0E4060ACCB80102CD13666
10F8254FF81C300026640490F8571FFC34E544C445220202020202000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000
00000000000000D0A52656D6F7665206469736B73206F72206F74686572206D656469
612EFF0D0A4469736B206572726F72FF0D0A507265737320616E79206B657920746F2
0726573746172740D0A0000000000ACCBD80000
偏移1FEH:有效扇區結束標誌 55 AA
到此分區引導扇區介紹結束。
文件分配表FAT
簡單介紹:
FAT表(文件分配表),是FAT文件系統中用於磁盤數據索引和定位而引進的一種鏈式結構。在FAT文件系統中,文件的存儲按照FAT表制定的簇鏈式數據結構來進行。同一時候,FAT文件系統將組織數據時使用的文件夾也抽象爲文件,以簡化對數據的管理。
FAT1表位置的定位:
在咱們前面介紹分區引導記錄的時候提到,在偏移0EH處存儲了保留扇區的個數。這個保留扇區數指的就是當前分區內DBR到FAT表之間的所有扇區的個數(包含DBR但不包含FAT表)。所以,咱們可以定位FAT表所在的起始偏移位置了,即24H*200H=4800H。咱們貼出4800H處得部份內容例如如下:
顯然沒有錯,這就是咱們FAT1所存儲的位置,僅僅是當前沒有存儲文件,因此FAT比較簡單罷了。
FAT2表位置的定位:
在咱們前面介紹分區引導記錄的時候提到,在偏移24H處存儲了FAT表所佔用的扇區個數,咱們又知道FAT2是緊鄰FAT1的,因此可以很是easy獲得FAT2的存儲位置的偏移地址:FAT1的起始偏移地址+FAT1的大小=4800H+1DEEH*200H=3C2400H,咱們貼出3C2400H處的部份內容例如如下:
顯然沒有錯,這就是咱們FAT2所存儲的位置,內容與FAT1一樣。
FAT表的特性:
FAT表由一系列大小相等的FAT表項組成。它有例如如下特性:
FAT32中每個簇的簇地址,使用32bit(4個字節)記錄在FAT表中。FAT表中的所有字節位置以4個字節爲單位進行劃分,並對所有劃分後的位置由0進行地址編號。0 號地址與1號地址被系統保留並存儲特殊標誌內容。
從2號地址開始。每個地址相應於數據區的簇號,FAT表中的地址編號與數據區中的簇號一樣。咱們稱FAT中的這些地址爲FAT表項,FAT表項中記錄的值稱爲FAT表項值。
當文件系統被建立,也就是進行格式化操做時,分配給FAT區域的空間將會被清空,在FAT1與FAT2的0號表項與1號表項寫入特定值。由於建立文件系統的同一時候也會建立根文件夾,也就是爲根文件夾分配了一個簇空間,一般爲2號簇。因此2號簇所相應的2號FAT表項也會被寫入一個結束標記。
假設某個簇未被分配使用。它所相應的FAT表項內的FAT表項值即用0進行填充。表示該FAT表項所相應的簇未分配使用。
當某個簇已被分配使用時,則它相應的FAT表項值也就是該文件的下一個存儲位置的簇號。假設該文件結束於該簇,則在它的FAT表項中記錄的是一個文件結束標記,對於FAT32而言。表明文件結束的FAT表項值爲0x0FFFFFFF。
假設某個簇存在壞扇區,則整個簇會用FAT表項值0x0FFFFFF7標記爲壞簇。再也不使用,這個壞簇標記就記錄在它所相應的FAT表項中。
由於簇號起始於2。因此FAT表的0號表項與1號表項不與不論什麼簇相應。
FAT32的0號表項值老是「F8FFFF0F」。1號表項可能被用於記錄髒標誌。以說明文件系統沒有被正常卸載或者磁盤表面存在錯誤。只是此值彷佛並不重要,所以咱們僅僅要了解就可以。正常狀況下,1號表項值爲「FFFFFFFF」或「FFFFFF0F"。
在文件系統中新建文件時,假設新建的文件僅僅佔用一個簇。爲其分配的簇所相應的FAT表項將會被寫入結束標記。假設新建的文件不只僅佔用一個簇,則在其所佔用的每個簇相應的FAT表項中寫入爲其分配的下一簇的簇號,在最後一個簇相應的FAT表項中寫入結束標記。
新建文件夾時,僅僅爲其分配一個簇的空間,相應的FAT表項中寫入結束標記。當文件夾增大超出一個簇的大小時。將會在空暇空間中繼續爲其分配一個簇。並在FAT表中爲其創建FAT錶鏈以描寫敘述它所佔用的簇狀況。
對文件或文件夾進行刪除操做時,它們所相應的FAT表項將會被清空,設置爲0以表示其所相應的簇處於未分配狀態。
根文件夾區
簡單介紹:
在FAT32文件系統中,根文件夾的位置再也不硬性地固定,可以存儲在分區內可尋址的隨意簇內,只是一般根文件夾是最先創建的(格式化就生成了)文件夾表。因此,咱們看到的狀況基本上都是根文件夾首簇緊鄰FAT2,佔簇區順序上的第1個簇(即2號簇)。同一時候,FAT32文件系統將根文件夾當作普通的數據文件來看,所有沒有了文件夾項數的限制,在需要的時候可以分配空簇,存儲不少其它的文件夾項。
起始偏移地址定位:
根文件夾起始扇區=保留扇區數+FAT×2+(起始簇-2)x每簇的扇區數。在咱們前面介紹分區引導記錄的時候提到,偏移2CH處保存了根文件夾起始簇號是2,因此求得根文件夾起始扇區是24H+1DEEH*2H+(2-2)*8H=3C00H,即求得偏移地址3C00H*200H=780000H,咱們貼出780000H處的部份內容例如如下:
文件夾區的一個文件夾項佔用32個字節,可以是長文件名稱文件夾項、文件文件夾項、子文件夾項等。
短文件名稱格式的文件夾項
對於短文件名稱格式的文件夾項。其參數意義例如如下:
根據參數定義,咱們來分析一下上圖的文件夾項 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字節54 45 53 54 5F 46 41 54 33 32 20 是卷標TEST_FAT32;第12字節08指示當前文件夾項保存的是卷標;第23-24字節19 95即9519H,是近期改動時間:19點40分50秒;第25-26字節10 3F即3F10H,是近期改動日期:2011年8月16日;
長文件名稱格式的文件夾項
FAT32的一個重要的特色是全然支持長文件名稱。長文件名稱依舊是記錄在文件夾項中的。
爲了低版本號的OS或程序能正確讀取長文件名稱文件,系統本身主動爲所有長文件名稱文件建立了一個相應的短文件名稱,使相應數據既可以用長文件名稱尋址,也可以用短文件名稱尋址。
不支持長文件名稱的OS或程序會忽略它以爲不合法的長文件名稱字段,而支持長文件名稱的OS或程序則會以長文件名稱爲顯式項來記錄和編輯,並隱藏起短文件名稱。
當建立一個長文件名稱文件時,系統會本身主動加上相應的短文件名稱。其原則例如如下:
(1)、取長文件名稱的前6個字符加上"~1"造成短文件名稱。擴展名不變。
(2)、假設已存在這個文件名稱。則符號"~"後的數字遞增,直到5。
長文件名稱的實現有賴於文件夾項第12字節屬性字節,當此字節的值爲0FH時,支持長文件名稱的系統會將其當作長文件名稱的根據,而僅僅支持短文件名稱的系統會以爲是異常而忽略掉。
系統將長文件名稱以13個字符爲單位進行分割。每一組佔領一個文件夾項。因此可能一個文件需要多個文件夾項,這時長文件名稱的各個文件夾項按倒序排列在文件夾表中,以防與其它文件名稱混淆。
長文件名稱中的字符採用unicode形式編碼,每個字符佔領2字節的空間。其文件夾項定義如:
如下是我創建的長文件名稱文件夾abcdefghijklmnopqrstuvwxyz1234567890的文件夾項: