1. 程式人生 > >FAT16檔案系統結構扇區資料分析

FAT16檔案系統結構扇區資料分析

FAT,英文為File Allocation Table,文件分配表。先要記住幾個概念:
扇區:一般扇區為512個位元組。
:由若干個扇區組成,是存取資料的最小單位。如果簇大小為16K,檔案大小為1位元組,那也要用一個簇來存,而且該簇不用再拿來他用。
FAT檔案系統就是專門管理這些簇的。一個檔案可能佔據一個或者多個簇,按正確的順序去讀取這些簇,就可以獲取這個檔案的內容了。
一、FAT16的基本結構
FAT16基本結構依次為:DBR扇區、FAT表1、FAT表2、根目錄和資料區。
1、DBR扇區
DBR是作業系統可以直接訪問的第一個扇區,包括一個載入程式和一個稱為BPB的本分割槽引數記錄表。BPB引數塊記錄著本分割槽的起始扇區、結束扇區、檔案儲存格式、硬碟介質描述符、根目錄大小、FAT個數、分配單元的大小等重要引數。
在這裡插入圖片描述

在這裡插入圖片描述

2、FAT表1和FAT表2
FAT表1和FAT表2是儲存簇狀態的地方,從DBR可知一個FAT表是21個扇區。它裡面的內容很簡單就是指出下一個簇在哪裡。盤裡有多少個簇,FAT就有多少個項來描述它們。FAT16用16bit來描述一個簇。第0和第1個位元組表示第0個簇,第2和第3個位元組表示第1個簇,第4和第5個位元組表示第2個簇…就這樣,每個簇都有兩個和它對應的位元組,這兩個位元組裡面存放的資料就是檔案中下一個簇大小資料所在的簇號。
比如要讀new.txt檔案,從根目錄中找到了它,讀它的根目錄資訊知道它的第一個簇的簇號是5,於是把第5號簇的資料送出去,在FAT表中5號簇是第10和第11位元組來表示的,於是去讀第10和第11位元組,得到0007,知道了檔案接下來的資料儲存在7號簇中,把7號簇的資料送出去,又去讀第14和第15位元組的資料,得到FFFF,說明檔案到末尾了。
下面是FAT中資料的含義:
在這裡插入圖片描述

對於FAT16,每個簇用16Bit來表示,最大能表示65536,FAT16的簇最大為32K,因此FAT16最大隻能支援6553632K約等於2G。因此大於2G的盤必須選擇其他的檔案系統,比如FAT32,沒有簇用32bit來表示。
根據DBR的引數,我們可以算出FAT1的偏移地址以及根目錄的偏移值。
FAT1偏移地址:保留扇區(FAT1之前的扇區,包括引導扇區)之後就是FAT1。因此可以得到,FAT1的偏移地址就是第1個扇區的位置,也就是512。大小為21個扇區,即21
512=10752位元組。
FAT2偏移地址:FA1偏移地址+FAT1的大小,512+21512 = 11264。
在這裡插入圖片描述
3、根目錄


根目錄偏移地址: FAT2偏移地址+ FAT2的大小,11264+21
512= 22016。
根目錄的偏移地址也是第1個簇的起始位置,根目錄儲存在第1個簇中,即第1個簇地址為22016,第2個簇為22016+32512=38400(每個簇佔32個扇區)。我們來看看根目錄的資料:
在這裡插入圖片描述
在根目錄中,一個檔案或者一個資料夾用32位元組來表示。
在這裡插入圖片描述
根據這個我們就可以解讀根目錄的資訊了,可以看到現在根目錄中只有一個名字為IMAGE和名字為VERINFO的資料夾。可以看到VERINFO資料夾的首簇號是 9F 12 也就是 0x129F = 4767號簇。可以得到VERINFO資料夾的偏移地址是22016+(4767-1)51232 = 78108160。資料如下:
在這裡插入圖片描述
VERINFO資料夾下檔案資訊的組織方式和根目錄一樣,可以看到現在VERINFO資料夾下有兩個不知名的資料夾和一個叫ver_info.txt的檔案。又可以繼續得到該檔案的首簇號和檔案的長度。首簇號是 A0 12 也就是0x12A0=4768。檔案長度是1F 也就是31位元組,小於簇大小512
32位元組,因此只佔一個簇,不需要回去檢視FAT來找到剩下的簇。
該檔案所在位置:22016+(4768-1)51232 = 78124544。
在這裡插入圖片描述
上面看到的資料就正好是ver_info.txt中儲存的資料。