摘要:本文以某一FAT格式的電子盤數據為依據,對FAT16文件系統的四個區的組織結構、偏移地址及各字段的含義進行了分析。根據根目錄項內容與FAT表項中的數據就可精確定位文件(或文件夾)在磁盤中的具體位置,從而找到該文件的內容。
關鍵詞:FAT16 文件系統 扇區
數據在磁盤上的存儲是按一定格式安排的,其中FAT格式是一種常見的存儲橋式,FAT格式又可分為FAT16與FAT32,兩種格式有相似的部分也有不同的部分,下面我就掌握的資料對FAT16格式的數據存儲進行分析。對磁盤文件的操作是基于磁盤的文件系統,只要掌握了磁盤的文件系統結構就可以靈活自如地對磁盤上的數據進行讀寫操作。
1 FAT16的數據結構
一個FAT16文件系統可以理解為一張軟盤,一個硬盤,或一個FLASH電子盤,它由四部分組成。
1.1 保留區。FAT16文件系統中的保留扇區(Reserved Region)中的第一個扇區必須為引導扇區BPB(BIOS Parameter Block),此扇區包含有磁盤的重要信息,是掌握FAT結構的關鍵。這個扇區又叫做保留扇區、或0扇區。
保留扇區中引導記錄占據512byte,其中MBR(Master Boot Record)占據446個字節(偏移地址為0h到1BDh),另外還有64個字節(偏移地址為1Beh到1FDh)為四個磁盤分區表DPT(Disk Partition Table),最后的兩個字節是“55 AA”(偏移地址為1FEh到1FFh)是分區有效結束標志。圖1是某磁盤的MBR截圖,偏移地址從0h開始,為FAT16結構。MBR決定著整個磁盤的數據分布,讀懂主引導記錄是理解整個磁盤數據的關鍵。
此圖各個數據的含義如圖2所示。
1.2 FAT(file allocatin table)文件分配表 文件分配表區共保存了兩個相同的文件分配表,因為文件所占用的存儲空間(簇鏈)及空閑空間的管理都是通過FAT實現的,第二個FAT表是第一個FAT表的備份。FAT如此重要,保存兩個以便第一個損壞時,還有第二個可用。文件系統對數據區的存儲空間是按簇進行劃分和管理的,簇是空間分配和回收的基本單位,即一個文件總是占用若干個整簇,文件所使用的最后一簇剩余的空間就不再使用,而是浪費掉了。即使某個文件只占一個字節,操作系統也會給它分配一個最小單元即一個簇。FAT16系統用16位二進制數表示一個簇的使用情況,此16位二進制稱為一個表項,每一個表項表示一個簇。理論上FAT16可以管理2^16=65536個簇,因為每一個簇的大小限制在32KB字節,所以FAT16最大可以管理2GB字節的空間。FAT16系統有從0002H到FFEFH個可用簇號(FFF0H到FFFFH另有定義,用來表示壞簇,文件結束簇等),允許每一邏輯盤的數據區最多不超過FFEDH(65518)個簇。FAT表按順序依次記錄了該盤各簇的使用情況,是一種位示圖法。對于大文件,需要分配多個簇。同一個文件的數據并不連續地存放在一片連續的區域內,而往往分成若干段,象鏈子一樣存放。FAT表對應項中記錄著它所代表的簇的信息:如本簇是否被占用,被占用的簇的后續內容的簇號以及是否是文件的最后簇,是否是空簇,是否是壞簇等信息。由于每個簇有占用一個表項,所以磁盤空間越大,相對來說簇也就越多,所用的表項也就越多。
FAT16的表項中的含義如表1所示。
1.3 根目錄區 在第二個FAT表的后面一個扇區就是根目標區。根目錄區中存放根目錄項,每一個目標項為32個字節,記錄一個文件或目錄的信息。目錄項的結構如表2:
目錄項所占的扇區數與有多少個目錄項有關,它將占有(目錄項*32/每扇區字節數+1)個扇區。
0x0~0x7字節記錄文件的主文件名,0x8~0xA記錄文件的擴展名,取文件名中的ASCII碼值。不記錄主文件名與擴展名之間的\".\" 主文件名不足8個字符以空白符(20H)填充,擴展名不足3個字符同樣以空白符(20H)填充。0x0偏移處的取值若為00H,表明目錄項為空;若為E5H,表明目錄項曾被使用,但對應的文件或文件夾已被刪除。(這也是誤刪除后恢復的理論依據)。文件名中的第一個字符若為“.”或“..”表示這個簇記錄的是一個子目錄的目錄項。“.”代表當前目錄;“..”代表上級目錄(和我們在dos或windows中的使用意思是一樣的,如果磁盤數據被破壞,就可以通過這兩個目錄項的具體參數推算磁盤的數據區的起始位置,猜測簇的大小等等,故而是比較重要的)
1.4 文件和目錄數據區 根目錄區最后一個扇區之后就是真正存放文件和目錄的數據位置,它將占據大部分的磁盤空間。文件與目錄在磁盤中的位置是通過根目錄與FAT表中的數據分配的,通過計算就可以找到每一個文件的真正位置,進行文件的讀寫操作。
2 各功能模塊偏移地址計算
根據以上圖表,我們就可以計算出本磁盤的各功能塊的偏移地址,下面以某磁盤的數據計算各偏移地址。
2.1 保留扇區 保留扇區從偏移地址00H開始,保留扇區內主要有主引導記錄MBR(master boot record)446字節,另外還有四個磁盤分區信息占據64個字節(每一個磁盤分區信息占據16個字節),總共占據512個字節的空間,另外還有一部分沒有用的空間。根據主引導記錄,某磁盤的具體數據如下:
每扇區字節數(Bytes per sector):BytsPerSec=0200H=512字節。每簇扇區數(sectors per cluster):SecPerClus=40H=64扇區。則每簇字節數為:BytsPerClus=40*200=8000H字節。此數不能大于32K。保留扇區數:RsvdSecCnt=28。FAT表的數量:NumFATS=2。必須為2。
根目錄項數(Root entries):RootEntCnt=512 。對FAT16此數據為一固定值,不管有多少個根目錄,根目錄項數總是512個,由于每一個根目錄項為32個字節,則根目錄項占有32個扇區。另一方面說明對FAT16系統而言,根目錄項的內容不能超過512個,超過就會出錯。
FAT16總扇區數:TotSec16=0。當扇區數小于10000H時,對FAT12或16,表示磁盤上扇區總數;對FAT32或當扇區總數大于10000H時,該值為0。
每個FAT分區所占扇區數:FATSz16=242。對FAT32此值為0;
FAT32扇區總數:TotSec32=8216320。
由以上數據,可以得出保留扇區偏移地址為0h,所占字節為保留扇區數乘以每扇區字節數,RsvdSecCnt *BytsPerSec=28*200H=3800H字節,0—37ffH字節。
2.2 FAT扇區 FAT扇區緊接著保留扇區,所以FAT扇區的起始地址為3800H,每個FAT所占扇區FATSz16=251,所占字節數為FATSz16* BytsPerSec=242*200H=1E400H。共有兩個FAT區,所以第一個FAT的地址范圍為3800H—21C00-1H。則第二個FAT的起始位偏移地址為21c00H,結束地址為21c00H+1E400H-1=3FFFFH。
2.3 根目錄扇區 緊接第二個FAT區是根目錄區,則根目錄區的起始地址為40000h處。根目錄項RootEntCnt=512,而每一個根目錄項占用32個字節,則根目錄區大小為512*32=16384字節。因為每一個扇區為512個字節,所以根目錄區占用32個扇區。其空間范圍為40000-44000-1h。
2.4 文件與數據扇區 從44000h處開始才是真正的目錄與數據存儲區。要數據空間中,0和1兩個簇已被占用,第一個存放數據的簇是2。
前三部分占用的總扇區數為:44000h/200=220H=544個扇區
前三部分占用的簇數為:544扇區/64扇區/簇=8.66個簇,取整數為9個簇。
因為文件是從第二個扇區開始存儲的,若根據根目錄某一文件的起始簇為n,則文件實際存儲位置的起始簇的偏移地址為:
44000H+(n-2)*每簇扇區數*每扇區字節數
=44000+(n-2)*SecPerClus*
BytsPerSec
=44000+(n-2)*64*200=440
00+12800(n-2)
若文件較大,存在多個簇,則FAT表中,在偏移地址FAT1起始地址+2*n中存放的不是FFFF,而是存放的存放文件的下一個簇的簇號,存放該簇號FAT1的偏移地址為:
3800H+2*n (FAT16每個表項占兩個字節)
根據該簇號利用上面的公式就可以計算出實際的存放地址,其它簇的位置依次類推就可以找到,若是文件的最后一個簇,則對應的FAT表中存放的是FFFF,表示該簇是文件的最后一個簇。。
3 結語
FAT16是一種磁盤文件系統,該系統以一種特定的格式存儲文件。掌握了該文件系統,就可以用單片機對FAT16文件系統進行讀寫操作,或恢復損壞了的磁盤數據。
參考文獻:
[1]院澤嘉.FAT16文件系統在嵌入式操作系統μCOS中實現[J].電子測量技術,2005年6月.
[2]王田苗.嵌入式系統設計與實例開發[M]. 北京:清華大學出版社,2003年10月.
[3]陳代軍.FAT32與FAT16文件系統的結構差異[J].成都信息工程學院學報,2003年6月.
[4]趙林明.FAT32和FAT16文件系統下BOOT、FAT、+ROOT、DATA區的分析[J].軟件技術,2002年4月.
文中所有截圖均來自winhex15.1版,圖中數據為一sd卡上的數據.