根目錄項(Root entries)為512,每個目錄項佔用32位元組,所以FDT(File Directory Table)共佔用512*32/512=32個扇區。這512個目錄項是根目錄下所有登記項的總和,包括卷標、子目錄和檔案。
公式
精確方法:FAT扇區數 = (扇區總數+2*每簇扇區數 – 32 – 保留扇區數)/(256*每簇扇區數)
例:FAT扇區數 = (3915713+128-32)/(256*64)= 238.99029541015625=239扇區
粗略方法:FAT扇區數:FAT用兩個位元組記錄一個簇。
例:FAT扇區數= 總簇數*2/512 = (3915713 /64)/256 = 238.99615478515625 = 239扇區
FAT16檔案系統結構
一個檔案或子目錄在磁碟上的儲存位置(邏輯扇區號)為:
1+2*FAT扇區數+FDT扇區數+(起始簇號-2)*每簇扇區數
解釋:“1”代表DBR扇區,“起始簇號-2”代表使用者檔案從2號簇開始計算的。這樣的話,第一個檔案的起點(第2簇)緊隨FDT。
DBR引導
DBR與分區的位置關係
每個分區的DBR都位於此分區的第一個扇區。主要磁碟分割DBR由MBR來制定,擴充分區由虛擬MBR指定。
DBR與分區表的位置關係
第一個主要磁碟分割的DBR一般距離MBR的扇區個數為62個(MBR=0, DBR=63),由於每個擴充分區都有一個虛擬MBR,所以每個擴充分區DBR都距離虛擬MBR 62個扇區。
這裡再回憶下分區錶鏈的讀取方法:主要磁碟分割直接由MBR表項中的“本分區之前扇區數”來定位; 擴充分區要加上一個位移,即MBR中制定的 “擴充分區之前扇區數”,而且此位移在所有的虛擬MBR中都不變(這點有點與想當然不一樣~),記住就可以了。
FAT(File Associate Table)
FAT緊接著DBR扇區存放。磁碟上的每個簇在FAT中有且只有一個登記項,表項值有三個狀態:佔用、空閑或壞簇。FAT的位元有12、16和32。12位表項值可表示4096個簇,16位表示65536個簇(一般每簇不多於64個扇區(32KB),這樣,FAT16最多管理32*65536=2GB)。FAT32即使每簇4KB大,也可以管理16TB的分區。
FAT檔案定位
由FAT+FDT來定位。FDT每32個位元組表示一個檔案。其中最重要的是位移1A-1B兩位元組,表示此檔案的開始簇號(此簇號有兩個用處,一是定位檔案的DATA,二是在FAT中找檔案的下一簇)。
例子我們找“winhex教程.pdf”,先搜尋ASCII來到FDT
FAT1起始位移為0x200,檔案長度0x86A0F3,因此我們要定位的位移為0x16B2
我們繼續走,發現簇鏈都是連著的,貌似沒有片段!
OK,winhex教程.pdf的簇範圍為:0xA59~0xB66 (2649 ~ 2918簇)
檔案長度0xF3A08600,由 可知,每簇64扇區。32768=0x8000,0x86A0F3 MOD 0x8000=0x20F3,即最後一簇佔用了0x20F3位元組。
最後一簇開頭
0x5B5FE00+0x20F3 = 0x5B61EF3
Hash下,發現一模一樣。這就對了。