1. 程式人生 > >硬碟FAT檔案系統原理的詳細分析——轉載

硬碟FAT檔案系統原理的詳細分析——轉載

    一、硬碟的物理結構:

硬碟儲存資料是根據電、磁轉換原理實現的。硬碟由一個或幾個表面鍍有磁性物質的金屬或玻璃等物質碟片以及碟片兩面所安裝的磁頭和相應的控制電路組成(圖1),其中碟片和磁頭密封在無塵的金屬殼中。

硬碟工作時,碟片以設計轉速高速旋轉,設定在碟片表面的磁頭則在電路控制下徑向移動到指定位置然後將資料儲存或讀取出來。當系統向硬碟寫入資料時,磁頭中“寫資料”電流產生磁場使碟片表面磁性物質狀態發生改變,並在寫電流磁場消失後仍能保持,這樣資料就儲存下來了;當系統從硬碟中讀資料時,磁頭經過碟片指定區域,碟片表面磁場使磁頭產生感應電流或線圈阻抗產生變化,經相關電路處理後還原成資料。因此只要能將碟片表面處理得更平滑、磁頭設計得更精密以及儘量提高碟片旋轉速度,就能造出容量更大、讀寫資料速度更快的硬碟。這是因為碟片表面處理越平、轉速越快就能越使磁頭離碟片表面越近,提高讀、寫靈敏度和速度;磁頭設計越小越精密就能使磁頭在碟片上佔用空間越小,使磁頭在一張碟片上建立更多的磁軌以儲存更多的資料。

    二、硬碟的邏輯結構:

硬碟由很多碟片(platter)組成,每個碟片的每個面都有一個讀寫磁頭。如果有N個碟片。就有2N個面,對應2N個磁頭(Heads),從0、1、2開始編號。每個碟片被劃分成若干個同心圓磁軌(邏輯上的,是不可見的。)每個碟片的劃分規則通常是一樣的。這樣每個碟片的半徑均為固定值R的同心圓再邏輯上形成了一個以電機主軸為軸的柱面(Cylinders),從外至裡編號為0、1、2……每個碟片上的每個磁軌又被劃分為幾十個扇區(Sector),通常的容量是512byte,並按照一定規則編號為1、2、3……形成Cylinders×Heads×Sector個扇區。這三個引數即是硬碟的物理引數。我們下面的很多實踐需要深刻理解這三個引數的意義。

    三、磁碟引導原理:

3.1  MBR(master boot record)扇區:

計算機在按下power鍵以後,開始執行主機板bios程式。進行完一系列檢測和配置以後。開始按bios中設定的系統引導順序引導系統。假定現在是硬碟。Bios執行完自己的程式後如何把執行權交給硬碟呢。交給硬碟後又執行儲存在哪裡的程式呢。其實,稱為mbr的一段程式碼起著舉足輕重的作用。MBR(master boot record),即主引導記錄,有時也稱主引導扇區。位於整個硬碟的0柱面0磁頭1扇區(可以看作是硬碟的第一個扇區),bios在執行自己固有的程式以後就會jump到mbr中的第一條指令。將系統的控制權交由mbr來執行。在總共512byte的主引導記錄中,MBR的載入程式佔了其中的前446個位元組(偏移0H~偏移1BDH),隨後的64個位元組(偏移1BEH~偏移1FDH)為DPT(Disk PartitionTable,硬碟分割槽表),最後的兩個位元組“55 AA”(偏移1FEH~偏移1FFH)是分割槽有效結束標誌。

MBR不隨作業系統的不同而不同,意即不同的作業系統可能會存在相同的MBR,即使不同,MBR也不會夾帶作業系統的性質。具有公共引導的特性。

我們來分析一段mbr。下面是用winhex檢視的一塊希捷120GB硬碟的mbr。

你的硬碟的MBR引導程式碼可能並非這樣。不過即使不同,所執行的功能大體是一樣的。這裡找wowocock關於磁碟mbr的反編譯,已加了詳細的註釋,感興趣可以細細研究一下。

我們看DPT部分。作業系統為了便於使用者對磁碟的管理。加入了磁碟分割槽的概念。即將一塊磁碟邏輯劃分為幾塊。磁碟分割槽數目的多少隻受限於C~Z的英文字母的數目,在上圖DPT共64個位元組中如何表示多個分割槽的屬性呢?microsoft通過連結的方法解決了這個問題。在DPT共64個位元組中,以16個位元組為分割槽表項單位描述一個分割槽的屬性。也就是說,第一個分割槽表項描述一個分割槽的屬性,一般為基本分割槽。第二個分割槽表項描述除基本分割槽外的其餘空間,一般而言,就是我們所說的擴充套件分割槽。這部分的大體說明見表1。


注:上表中的超過1位元組的資料都以實際資料顯示,就是按高位到地位的方式顯示。儲存時是按低位到高位儲存的。兩者表現不同,請仔細看清楚。以後出現的表,圖均同。

也可以在winhex中看到這些引數的意義:

    說明: 每個分割槽表項佔用16個位元組,假定偏移地址從0開始。如圖3的分割槽表項3。分割槽表項4同分區表項3。

1、0H偏移為活動分割槽是否標誌,只能選00H和80H。80H為活動,00H為非活動。其餘值對microsoft而言為非法值。

2、重新說明一下(這個非常重要):大於1個位元組的數被以低位元組在前的儲存格式格式(little endian format)或稱反位元組順序儲存下來。低位元組在前的格式是一種儲存數的方法,這樣,最低位的位元組最先出現在十六進位制數符號中。例如,相對扇區數字段的值0x3F000000的低位元組在前表示為0x0000003F。這個低位元組在前的格式數的十進位制數為63。

3、系統在分割槽時,各分割槽都不允許跨柱面,即均以柱面為單位,這就是通常所說的分割槽粒度。有時候我們分割槽是輸入分割槽的大小為7000M,分出來卻是6997M,就是這個原因。 偏移2H和偏移6H的扇區和柱面引數中,扇區佔6位(bit),柱面佔10位(bit),以偏移6H為例,其低6位用作扇區數的二進位制表示。其高兩位做柱面數10位中的高兩位,偏移7H組成的8位做柱面數10位中的低8位。由此可知,實際上用這種方式表示的分割槽容量是有限的,柱面和磁頭從0開始編號,扇區從1開始編號,所以最多隻能表示1024個柱面×63個扇區×256個磁頭×512byte=8455716864byte。即通常的8.4GB(實際上應該是7.8GB左右)限制。實際上磁頭數通常只用到255個(由組合語言的定址暫存器決定),即使把這3個位元組按線性定址,依然力不從心。 在後來的作業系統中,超過8.4GB的分割槽其實已經不通過C/H/S的方式定址了。而是通過偏移CH~偏移FH共4個位元組32位線性扇區地址來表示分割槽所佔用的扇區總數。可知通過4個位元組可以表示2^32個扇區,即2TB=2048GB,目前對於大多數計算機而言,這已經是個天文數字了。在未超過8.4GB的分割槽上,C/H/S的表示方法和線性扇區的表示方法所表示的分割槽大小是一致的。也就是說,兩種表示方法是協調的。即使不協調,也以線性定址為準。(可能在某些系統中會提示出錯)。超過8.4GB的分割槽結束C/H/S一般填充為FEH FFH FFH。即C/H/S所能表示的最大值。有時候也會用柱面對1024的模來填充。不過這幾個位元組是什麼其實都無關緊要了。

雖然現在的系統均採用線性定址的方式來處理分割槽的大小。但不可跨柱面的原則依然沒變。本分割槽的扇區總數加上與前一分割槽之間的保留扇區數目依然必須是柱面容量的整數倍。(保留扇區中的第一個扇區就是存放分割槽表的MBR或虛擬MBR的扇區,分割槽的扇區總數線上性表示方式上是不計入保留扇區的。如果是第一個分割槽,保留扇區是本分割槽前的所有扇區。

附:分割槽表型別標誌如圖4

3.2 擴充套件分割槽

擴充套件分割槽中的每個邏輯驅動器都存在一個類似於MBR的擴充套件引導記錄( Extended Boot Record, EBR),也有人稱之為虛擬mbr或擴充套件mbr,意思是一樣的。擴充套件引導記錄包括一個擴充套件分割槽表和該扇區的標籤。擴充套件引導記錄將記錄只包含擴充套件分割槽中每個邏輯驅動器的第一個柱面的第一面的資訊。一個邏輯驅動器中的引導扇區一般位於相對扇區32或63。但是,如果磁碟上沒有擴充套件分割槽,那麼就不會有擴充套件引導記錄和邏輯驅動器。第一個邏輯驅動器的擴充套件分割槽表中的第一項指向它自身的引導扇區。第二項指向下一個邏輯驅動器的EBR。如果不存在進一步的邏輯驅動器,第二項就不會使用,而且被記錄成一系列零。如果有附加的邏輯驅動器,那麼第二個邏輯驅動器的擴充套件分割槽表的第一項會指向它本身的引導扇區。第二個邏輯驅動器的擴充套件分割槽表的第二項指向下一個邏輯驅動器的EBR。擴充套件分割槽表的第三項和第四項永遠都不會被使用。

通過一幅4分割槽的磁碟結構圖可以看到磁碟的大致組織形式。如圖5:

關於擴充套件分割槽,如圖6所示,擴充套件分割槽中邏輯驅動器的擴充套件引導記錄是一個連線表。該圖顯示了一個擴充套件分割槽上的三個邏輯驅動器,說明了前面的邏輯驅動器和最後一個邏輯驅動器之間在擴充套件分割槽表中的差異。

除了擴充套件分割槽上最後一個邏輯驅動器外,表2中所描述的擴充套件分割槽表的格式在每個邏輯驅動器中都是重複的:第一個項標識了邏輯驅動器本身的引導扇區,第二個項標識了下一個邏輯驅動器的EBR。最後一個邏輯驅動器的擴充套件分割槽表只會列出它本身的分割槽項。最後一個擴充套件分割槽表的第二個項到第四個項被使用。

擴充套件分割槽表項中的相對扇區數字段所顯示的是從擴充套件分割槽開始到邏輯驅動器中第一個扇區的位移的位元組數。總扇區數字段中的數是指組成該邏輯驅動器的扇區數目。總扇區數字段的值等於從擴充套件分割槽表項所定義的引導扇區到邏輯驅動器末尾的扇區數。

有時候在磁碟的末尾會有剩餘空間,剩餘空間是什麼呢?我們前面說到,分割槽是以1柱面的容量為分割槽粒度的,那麼如果磁碟總空間不是整數個柱面的話,不夠一個柱面的剩下的空間就是剩餘空間了,這部分空間並不參與分割槽,所以一般無法利用。照道理說,磁碟的物理模式決定了磁碟的總容量就應該是整數個柱面的容量,為什麼會有不夠一個柱面的空間呢。在我的理解看來,本來現在的磁碟為了更大的利用空間,一般在物理上並不是按照外圍的扇區大於裡圈的扇區這種管理方式,只是為了與作業系統相容而抽象出來CHS。可能其實際空間 [email protected]

    四、FAT分割槽原理

先來一幅結構圖:

現在我們著重研究FAT格式分割槽內資料是如何儲存的。FAT分割槽格式是MICROSOFT最早支援的分割槽格式,依據FAT表中每個簇鏈的所佔位數(有關概念,後面會講到)分為fat12、fat16、fat32三種格式"變種",但其基本儲存方式是相似的。

仔細研究圖7中的fat16和fat32分割槽的組成結構。下面依次解釋DBR、FAT1、FAT2、根目錄、資料區、剩餘扇區的概念。提到的地址如無特別提示均為分割槽內部偏移。

4.1 關於DBR.

DBR區(DOS BOOT RECORD)即作業系統引導記錄區的意思,通常佔用分割槽的第0扇區共512個位元組(特殊情況也要佔用其它保留扇區,我們先說第0扇)。在這512個位元組中,其實又是由跳轉指令,廠商標誌和作業系統版本號,BPB(BIOS Parameter Block),擴充套件BPB,os載入程式,結束標誌幾部分組成。 以用的最多的FAT32為例說明分割槽DBR各位元組的含義。見圖8。

圖8的對應解釋見表3

圖9給出了winhex對圖8 DBR的相關引數解釋:

根據上邊圖例,我們來討論DBR各位元組的引數意義。

MBR將CPU執行轉移給引導扇區,因此,引導扇區的前三個位元組必須是合法的可執行的基於x86的CPU指令。這通常是一條跳轉指令,該指令負責跳過接下來的幾個不可執行的位元組(BPB和擴充套件BPB),跳到作業系統引導程式碼部分。

跳轉指令之後是8位元組長的OEM ID,它是一個字串, OEM ID標識了格式化該分割槽的作業系統的名稱和版本號。為了保留與MS-DOS的相容性,通常Windows 2000格式化該盤是在FAT16和FAT32磁碟上的該欄位中記錄了“MSDOS 5.0”,在NTFS磁碟上(關於ntfs,另述),Windows 2000記錄的是“NTFS”。通常在被Windows 95格式化的磁碟上OEM ID欄位出現“MSWIN4.0”,在被Windows 95 OSR2和Windows 98格式化的磁碟上OEM ID欄位出現“MSWIN4.1”。

接下來的從偏移0x0B開始的是一段描述能夠使可執行引導程式碼找到相關引數的資訊。通常稱之為BPB(BIOS Parameter Block),BPB一般開始於相同的位移量,因此,標準的引數都處於一個已知的位置。磁碟容量和幾何結構變數都被封在BPB之中。由於引導扇區的第一部分是一個x86跳轉指令。因此,將來通過在BPB末端附加新的資訊,可以對BPB進行擴充套件。只需要對該跳轉指令作一個小的調整就可以適應BPB的變化。圖9已經列出了專案的名稱和取值,為了系統的研究,針對圖8,將FAT32分割槽格式的BPB含義和擴充套件BPB含義釋義為表格,見表4和表5。

DBR的偏移0x5A開始的資料為作業系統引導程式碼。這是由偏移0x00開始的跳轉指令所指向的。在圖8所列出的偏移0x00~0x02的跳轉指令"EB 58 90"清楚地指明瞭OS引導程式碼的偏移位置。jump 58H加上跳轉指令所需的位移量,即開始於0x5A。此段指令在不同的作業系統上和不同的引導方式上,其內容也是不同的。大多數的資料上都說win98,構建於fat基本分割槽上的win2000,winxp所使用的DBR只佔用基本分割槽的第0扇區。他們提到,對於fat32,一般的32個基本分割槽保留扇區只有第0扇區是有用的。實際上,以FAT32構建的作業系統如果是win98,系統會使用基本分割槽的第0扇區和第2扇區儲存os引導程式碼;以FAT32構建的作業系統如果是win2000或winxp,系統會使用基本分割槽的第0扇區和第0xC扇區(win2000或winxp,其第0xC的位置由第0扇區的0xAB偏移指出)儲存os引導程式碼。所以,在fat32分割槽格式上,如果DBR一扇區的內容正確而缺少第2扇區(win98系統)或第0xC扇區(win2000或winxp系統),系統也是無法啟動的。如果自己手動設定NTLDR雙系統,必須知道這一點。

DBR扇區的最後兩個位元組一般儲存值為0x55AA的DBR有效標誌,對於其他的取值,系統將不會執行DBR相關指令。上面提到的其他幾個參與os引導的扇區也需以0x55AA為合法結束標誌。

    FAT16 DBR:

FAT32中DBR的含義大致如此,對於FAT12和FAT16其基本意義類似,只是相關偏移量和引數意義有小的差異,FAT格式的區別和來因,以後會說到,此處不在多說FAT12與FAT16。我將FAT16的扇區引數意義列表。感興趣的朋友自己研究一下,和FAT32大同小異的。

4.2  關於保留扇區

在上述FAT檔案系統DBR的偏移0x0E處,用2個位元組儲存保留扇區的數目。所謂保留扇區(有時候會叫系統扇區,隱藏扇區),是指從分割槽DBR扇區開始的僅為系統所有的扇區,包括DBR扇區。在FAT16檔案系統中,保留扇區的資料通常設定為1,即僅僅DBR扇區。而在FAT32中,保留扇區的資料通常取為32,有時候用Partition Magic分過的FAT32分割槽會設定36個保留扇區,有的工具可能會設定63個保留扇區。

FAT32中的保留扇區除了磁碟總第0扇區用作DBR,總第2扇區(win98系統)或總第0xC扇區(win2000,winxp)用作OS引導程式碼擴充套件部分外,其餘扇區都不參與作業系統管理與磁碟資料管理,通常情況下是沒作用的。作業系統之所以在FAT32中設定保留扇區,是為了對DBR作備份或留待以後升級時用。FAT32中,DBR偏移0x34佔2位元組的資料指明瞭DBR備份扇區所在,一般為0x06,即第6扇區。當FAT32分割槽DBR扇區被破壞導致分割槽無法訪問時。可以用第6扇區的原備份替換第0扇區來找回資料。

4.3  FAT表和資料的儲存原則

FAT表(File Allocation Table 檔案分配表),是Microsoft在FAT檔案系統中用於磁碟資料(檔案)索引和定位引進的一種鏈式結構。假如把磁碟比作一本書,FAT表可以認為相當於書中的目錄,而檔案就是各個章節的內容。但FAT表的表示方法卻與目錄有很大的不同。

在FAT檔案系統中,檔案的儲存依照FAT表制定的簇鏈式資料結構來進行。同時,FAT檔案系統將組織資料時使用的目錄也抽象為檔案,以簡化對資料的管理。

    ★儲存過程假想:

我們模擬對一個分割槽儲存資料的過程來說明FAT檔案系統中資料的儲存原則。

假定現在有一個空的完全沒有存放資料的磁碟,大小為100KB,我們將其想象為線形的空間地址。為了儲存管理上的便利,我們人為的將這100KB的空間均分成100份,每份1KB。我們來依次儲存這樣幾個檔案:A.TXT(大小10KB),B.TXT(大小53.6KB),C.TXT(大小20.5KB)。

最起碼能夠想到,我們可以順序的在這100KB空間中存放這3個檔案。同時不要忘了,我們還要記下他們的大小和開始的位置,這樣下次要用時才能找的到,這就像是目錄。為了便於查詢,我們假定用第1K的空間來儲存他們的特徵(屬性)。還有,我們設計的儲存單位是1KB,所以,A.TXT我們需要10個儲存單位(為了說明方便,我們把儲存單位叫做“簇”吧。也能少打點字,呵呵。),B.TXT需要54個簇,C.TXT需要21個簇。可能有人會說B.TXT和C.TXT不是各自浪費了不到1簇的空間嗎?幹嘛不讓他們緊挨著,不是省地方嗎?我的回答是,如果按照這樣的方式儲存,目錄中原本只需要記下簇號,現在還需要記下簇內的偏移,這樣會增加目錄的儲存量,而且存取沒有了規則,讀取也不太方便,是得不償失的。

根據上面所說的思想,我們設計了這樣的圖4.3.1所示的儲存方式。

我們再考慮如何來寫這三個檔案的目錄。對於每個檔案而言,一定要記錄的有:檔名,開始簇,大小,建立日期、時間,修改日期、時間,檔案的讀寫屬性等。這裡大小能不能用結束簇來計算呢?一定不能,因為檔案的大小不一定就是整數個簇的大小,否則的話像B.TXT的內容就是54KB的內容了,少了固然不行,可多了也是不行的。那麼我們怎麼記錄呢?可以想象一下。為了管理上的方便,我們用資料庫的管理方式來管理我們的目錄。於是我把1KB再分成10份,假定開始簇號為0,定義每份100B的各個位置的代表含義如圖4.3.2

這樣設計的結構絕對可以對檔案進行正確的讀寫了。接著讓我們設計的檔案系統工作吧。先改動個檔案,比如A.TXT,增加點內容吧!咦?增加後往哪裡放呀,雖然儲存塊的後面有很多空間,但緊隨其後B.TXT的資料還頂著呢?要是把A.TXT移到後邊太浪費處理資源,而且也不一定解決問題。這個問題看來暫時解決不了。

那我們換個操作,把B.txt刪了,b.txt的空間隨之釋放。這時候空間如圖4.3.3,目錄如圖4.3.4

這個操作看來還可以,我們接著做,在存入一個檔案D.txt(大小為60.3KB),總共100簇的空間只用了31簇,還有68簇剩餘,按說能放下。可是?往那裡放呢?沒有61個連續的空間了,目錄行沒辦法寫了,看來無連續塊儲存暫時也不行。

你一定能夠想到我們可以在連續空間不夠或增加檔案長度的時候轉移影響我們操作的其他檔案,從而騰出空間來,但我要問你,那不是成天啥也不要乾了,就是倒騰東西了嗎?

看來我們設計的檔案系統有致命的漏洞,怎麼解決呢?其實可以這樣解決:

首先我們允許檔案的不連續儲存。目錄中依然只記錄開始簇和檔案的大小。那麼我們怎麼記錄檔案佔用那些簇呢,以檔案對映簇不太方便,因為檔名是不固定的。我們換個思想,可以用簇來對映檔案,在整個儲存空間的前部留下幾簇來記錄資料區中資料與簇號的關係。對於上例因為總空間也不大,所以用前部的1Kb的空間來記錄這種對應,假設3個檔案都儲存,空間分配如圖4.3.5,同時修改一下目錄,如圖4.3.6

第一簇用來記錄資料區中每一簇的被佔用情況,暫時稱其為檔案分配表。結合檔案分配表和檔案目錄就可以達到完全的檔案讀取了。我們想到,把檔案分配表做成一個數據表,以圖4.3.7的形式記錄簇與資料的對應。

用圖4.3.7的組織方式是完全可以實現對檔案佔有簇的記錄的。但還不夠效率。比如檔名在檔案分配表中記錄太多,浪費空間,而實際上在目錄中已經記錄了檔案的開始簇了。所以可以改良一下,用鏈的方式來存放佔有簇的關係,變成圖4.3.8的組織方式。

參照圖4.3.8來理解一下檔案分配表的意義。如檔案a.txt我們根據目錄項中指定的a.txt的首簇為2,然後找到檔案分配表的第2簇記錄,上面登記的是3,我們就能確定下一簇是3。找到檔案分配表的第3簇記錄,上面登記的是4,我們就能確定下一簇是4......直到指到第11簇,發現下一個指向是FF,就是結束。檔案便絲毫無誤讀取完畢。

我們再看上面提到的第三種情況,就是將b.txt刪除以後,存入一個大小為60.3KB的d.txt。利用簇鏈可以很容易的實現。實現後的磁碟如圖4.3.9  4.3.10  4.3.11

上面是我們對檔案儲存的一種假設,也該揭開謎底的時候了。上面的思想其實就是fat檔案系統的思想的精髓(但並不是,尤其像具體的引數的意義與我們所舉的例子是完全不同的。請忘掉上邊細節,努力記憶下邊)。

    ★FAT16儲存原理:  

當把一部分磁碟空間格式化為fat檔案系統時,fat檔案系統就將這個分割槽當成整塊可分配的區域進行規劃,以便於資料的儲存。一般來講,其劃分形式如圖7所示。我們把FAT16部分提取出來,詳細描述一下:

FAT16是Microsoft較早推出的檔案系統,具有高度相容性,目前仍然廣泛應用於個人電腦尤其是移動儲存裝置中,FAT16簡單來講由圖4.3.12所示的6部分組成(主要是前5部分)。引導扇區(DBR)我們已經說過,FAT16在DBR之後沒有留有任何保留扇區,其後緊隨的便是FAT表。FAT表是FAT16用來記錄磁碟資料區簇鏈結構的。像前面我們說過的例子一樣,FAT將磁碟空間按一定數目的扇區為單位進行劃分,這樣的單位稱為簇。通常情況下,每扇區512位元組的原則是不變的。簇的大小一般是2n (n為整數)個扇區的大小,像512B,1K,2K,4K,8K,16K,32K,64K。實際中通常不超過32K。 之所以簇為單位而不以扇區為單位進行磁碟的分配,是因為當分割槽容量較大時,採用大小為512b的扇區管理會增加fat表的項數,對大檔案存取增加消耗,檔案系統效率不高。分割槽的大小和簇的取值是有關係的,見表9  

注意:少於32680個扇區的分割槽中,簇空間大小可最多達到每個簇8個扇區。不管使用者是使用磁碟管理器來格式化分割槽,還是使用命令提示行鍵入format命令格式化,格式化程式都建立一個12位的FAT。少於16MB的分割槽,系統通常會將其格式化成12位的FAT,FAT12是FAT的初始實現形式,是針對小型介質的。FAT12檔案分配表要比FAT16和FAT32的檔案分配表小,因為它對每個條目使用的空間較少。這就給資料留下較多的空間。所有用FAT12格式化的5.25英寸軟盤以及1.44MB的3.5英寸軟盤都是由FAT12格式化的。除了FAT表中記錄每簇鏈結的二進位制位數與FAT16不同外,其餘原理與FAT16均相同,不再單獨解釋。

格式化FAT16分割槽時,格式化程式根據分割槽的大小確定簇的大小,然後根據保留扇區的數目、根目錄的扇區數目、資料區可分的簇數與FAT表本身所佔空間 來確定FAT表所需的扇區數目,然後將計算後的結果寫入DBR的相關位置。

FAT16 DBR引數的偏移0x11處記錄了根目錄所佔扇區的數目。偏移0x16記錄了FAT表所佔扇區的資料。偏移0x10記錄了FAT表的副本數目。系統在得到這幾項引數以後,就可以確定資料區的開始扇區偏移了。

FAT16檔案系統從根目錄所佔的32個扇區之後的第一個扇區開始以簇為單位進行資料的處理,這之前仍以扇區為單位。對於根目錄之後的第一個簇,系統並不編號為第0簇或第1簇 (可能是留作關鍵字的原因吧),而是編號為第2簇,也就是說資料區順序上的第1個簇也是編號上的第2簇。

FAT檔案系統之所以有12,16,32不同的版本之分,其根本在於FAT表用來記錄任意一簇連結的二進位制位數。以FAT16為例,每一簇在FAT表中佔據2位元組(二進位制16位)。所以,FAT16最大可以表示的簇號為0xFFFF(十進位制的65535),以32K為簇的大小的話,FAT32可以管理的最大磁碟空間為:32KB×65535=2048MB,這就是為什麼FAT16不支援超過2GB分割槽的原因。

FAT表實際上是一個數據表,以2個位元組為單位,我們暫將這個單位稱為FAT記錄項,通常情況其第1、2個記錄項(前4個位元組)用作介質描述。從第三個記錄項開始記錄除根目錄外的其他檔案及資料夾的簇鏈情況。根據簇的表現情況FAT用相應的取值來描述,見表10

看一幅在winhex所截FAT16的檔案分配表,圖10:

如圖,FAT表以"F8 FF FF FF" 開頭,此2位元組為介質描述單元,並不參與FAT表簇鏈關係。小紅字標出的是FAT扇區每2位元組對應的簇號。

相對偏移0x4~0x5偏移為第2簇(順序上第1簇),此處為FF,表示儲存在第2簇上的檔案(目錄)是個小檔案,只佔用1個簇便結束了。

第3簇中存放的資料是0x0005,這是一個檔案或資料夾的首簇。其內容為第5簇,就是說接下來的簇位於第5簇——〉 FAT表指引我們到達FAT表的第5簇指向,上面寫的資料是"FF FF",意即此檔案已至尾簇。

第4簇中存放的資料是0x0006,這又是一個檔案或資料夾的首簇。其內容為第6簇,就是說接下來的簇位於第6簇——〉FAT表指引我們到達FAT表的第6簇指向,上面寫的資料是0x0007,就是說接下來的簇位於第7簇——〉FAT表指引我們到達FAT表的第7簇指向……直到根據FAT鏈讀取到扇區相對偏移0x1A~0x1B,也就是第13簇,上面寫的資料是0x000E,也就是指向第14簇——〉14簇的內容為"FF FF",意即此檔案已至尾簇。

後面的FAT表資料與上面的道理相同。不再分析。

FAT表記錄了磁碟資料檔案的儲存連結串列,對於資料的讀取而言是極其重要的,以至於Microsoft為其開發的FAT檔案系統中的FAT表建立了一份備份,就是我們看到的FAT2。FAT2與FAT1的內容通常是即時同步的,也就是說如果通過正常的系統讀寫對FAT1做了更改,那麼FAT2也同樣被更新。如果從這個角度來看,系統的這個功能在資料恢復時是個天災。

FAT檔案系統的目錄結構其實是一顆有向的從根到葉的樹,這裡提到的有向是指對於FAT分割槽內的任一檔案(包括資料夾),均需從根目錄定址來找到。可以這樣認為:目錄儲存結構的入口就是根目錄。

FAT檔案系統根據根目錄來定址其他檔案(包括資料夾),故而根目錄的位置必須在磁碟存取資料之前得以確定。FAT檔案系統就是根據分割槽的相關DBR引數與DBR中存放的已經計算好的FAT表(2份)的大小來確定的。格式化以後,跟目錄的大小和位置其實都已經確定下來了:位置緊隨FAT2之後,大小通常為32個扇區。根目錄之後便是資料區第2簇。

FAT檔案系統的一個重要思想是把目錄(資料夾)當作一個特殊的檔案來處理,FAT32甚至將根目錄當作檔案處理(旁:NTFS將分割槽引數、安全許可權等好多東西抽象為檔案更是這個思想的昇華),在FAT16中,雖然根目錄地位並不等同於普通的檔案或者說是目錄,但其組織形式和普通的目錄(資料夾)並沒有不同。FAT分割槽中所有的資料夾(目錄)檔案,實際上可以看作是一個存放其他檔案(資料夾)入口引數的資料表。所以目錄的佔用空間的大小並不等同於其下所有資料的大小,但也不等同於0。通常是佔很小的空間的,可以看作目錄檔案是一個簡單的二維表文件。其具體儲存原理是:

不管目錄檔案所佔空間為多少簇,一簇為多少位元組。系統都會以32個位元組為單位進行目錄檔案所佔簇的分配。這32個位元組以確定的偏移來定義本目錄下的一個檔案(或資料夾)的屬性,實際上是一個簡單的二維表。

這32個位元組的各位元組偏移定義如表11:

對錶11中的一些取值進行說明:

(1)、對於短檔名,系統將檔名分成兩部分進行儲存,即主檔名+副檔名。0x0~0x7位元組記錄檔案的主檔名,0x8~0xA記錄檔案的副檔名,取檔名中的ASCII碼值。不記錄主檔名與副檔名之間的"."  主檔名不足8個字元以空白符(20H)填充,副檔名不足3個字元同樣以空白符(20H)填充。0x0偏移處的取值若為00H,表明目錄項為空;若為E5H,表明目錄項曾被使用,但對應的檔案或資料夾已被刪除。(這也是誤刪除後恢復的理論依據)。檔名中的第一個字元若為“.”或“..”表示這個簇記錄的是一個子目錄的目錄項。“.”代表當前目錄;“..”代表上級目錄(和我們在dos或windows中的使用意思是一樣的,如果磁碟資料被破壞,就可以通過這兩個目錄項的具體引數推算磁碟的資料區的起始位置,猜測簇的大小等等,故而是比較重要的)

(2)、0xB的屬性欄位:可以看作系統將0xB的一個位元組分成8位,用其中的一位代表某種屬性的有或無。這樣,一個位元組中的8位每位取不同的值就能反映各個屬性的不同取值了。如00000101就表示這是個檔案,屬性是隻讀、系統。

(3)、0xC~0x15在原FAT16的定義中是保留未用的。在高版本的WINDOWS系統中有時也用它來記錄修改時間和最近訪問時間。那樣其欄位的意義和FAT32的定義是相同的,見後邊FAT32。

(4)、0x16~0x17中的時間=小時*2048+分鐘*32+秒/2。得出的結果換算成16進位制填入即可。也就是:0x16位元組的0~4位是以2秒為單位的量值;0x16位元組的5~7位和0x17位元組的0~2位是分鐘;0x17位元組的3~7位是小時。

(5)、0x18~0x19中的日期=(年份-1980)*512+月份*32+日。得出的結果換算成16進位制填入即可。也就是:0x18位元組0~4位是日期數;0x18位元組5~7位和0x19位元組0位是月份;0x19位元組的1~7位為年號,原定義中0~119分別代表1980~2099,目前高版本的Windows允許取0~127,即年號最大可以到2107年。

(6)、0x1A~0x1B存放檔案或目錄的表示檔案的首簇號,系統根據掌握的首簇號在FAT表中找到入口,然後再跟蹤簇鏈直至簇尾,同時用0x1C~0x1F處位元組判定有效性。就可以完全無誤的讀取檔案(目錄)了。

(7)、普通子目錄的定址過程也是通過其父目錄中的目錄項來指定的,與資料檔案(指非目錄檔案)不同的是目錄項偏移0xB的第4位置1,而資料檔案為0。

對於整個FAT分割槽而言,簇的分配並不完全總是分配乾淨的。如一個數據區為99個扇區的FAT系統,如果簇的大小設定為2扇區,就會有1個扇區無法分配給任何一個簇。這就是分割槽的剩餘扇區,位於分割槽的末尾。有的系統用最後一個剩餘扇區備份本分割槽的DBR,這也是一種好的備份方法。

早的FAT16系統並沒有長檔名一說,Windows作業系統已經完全支援在FAT16上的長檔名了。FAT16的長檔名與FAT32長檔名的定義是相同的,關於長檔名,在FAT32部分再詳細作解釋。

    ★FAT32儲存原理:

FAT32是個非常有功勞的檔案系統,Microsoft成功地設計並運用了它,直到今天NTFS鋪天蓋地襲來的時候,FAT32依然佔據著Microsoft Windows檔案系統中重要的地位。FAT32最早是出於FAT16不支援大分割槽、單位簇容量大以致空間急劇浪費等缺點設計的。實際應用中,FAT32還是成功的。

FAT32與FAT16的原理基本上是相同的,圖4.3.13標出了FAT32分割槽的基本構成。

FAT32在格式化的過程中就根據分割槽的特點構建好了它的DBR,其中BPB引數是很重要的,可以回過頭來看一下表4和表5。首先FAT32保留扇區的數目預設為32個,而不是FAT16的僅僅一個。這樣的好處是有助於磁碟DBR指令的長度擴充套件,而且可以為DBR扇區留有備份空間。上面我們已經提到,構建在FAT32上的win98或win2000、winXP,其作業系統引導程式碼並非只佔一個扇區了。留有多餘的保留扇區就可以很好的拓展OS引導程式碼。在BPB中也記錄了DBR扇區的備份扇區編號。備份扇區可以讓我們在磁碟遭到意外破壞時恢復DBR。

FAT32的檔案分配表的資料結構依然和FAT16相同,所不同的是,FAT32將記錄簇鏈的二進位制位數擴充套件到了32位,故而這種檔案系統稱為FAT32。32位二進位制位的簇鏈決定了FAT表最大可以定址2T個簇。這樣即使簇的大小為1扇區,理論上仍然能夠定址1TB範圍內的分割槽。但實際中FAT32是不能定址這樣大的空間的,隨著分割槽空間大小的增加,FAT表的記錄數會變得臃腫不堪,嚴重影響系統的效能。所以在實際中通常不格式化超過32GB的FAT32分割槽。WIN2000及之上的OS已經不直接支援對超過32GB的分割槽格式化成FAT32,但WIN98依然可以格式化大到127GB的FAT32分割槽,但這樣沒必要也不推薦。同時FAT32也有小的限制,FAT32卷必須至少有65527個簇,所以對於小的分割槽,仍然需要使用FAT16或FAT12。

分割槽變大時,如果簇很小,檔案分配表也隨之變大。仍然會有上面的效率問題存在。既要有效地讀寫大檔案,又要最大可能的減少空間的浪費。FAT32同樣規定了相應的分割槽空間對應的簇的大小,見表12:

FAT32簇的取值意義和FAT16類似,不過是位數長了點罷了,比較見表13:

FAT32的另一項重大改革是根目錄的檔案化,即將根目錄等同於普通的檔案。這樣根目錄便沒有了FAT16中512個目錄項的限制,不夠用的時候增加簇鏈,分配空簇即可。而且,根目錄的位置也不再硬性地固定了,可以儲存在分割槽內可定址的任意簇內,不過通常根目錄是最早建立的(格式化就生成了)目錄表。所以,我們看到的情況基本上都是根目錄首簇佔簇區順序上的第1個簇。在圖4.3.12中也是按這種情況製作的畫的。

FAT32對簇的編號依然同FAT16。順序上第1個簇仍然編號為第2簇,通常為根目錄所用(這和FAT16是不同的,FAT16的根目錄並不佔簇區空間,32個扇區的根目錄以後才是簇區第1個簇) 

FAT32的檔案定址方法與FAT16相同,但目錄項的各位元組引數意義卻與FAT16有所不同,一方面它啟用了FAT16中的目錄項保留欄位,同時又完全支援長檔名了。

對於短檔案格式的目錄項。其引數意義見表14:

    說明:

(1)、這是FAT32短檔案格式目錄項的意義。其中檔名、副檔名、時間、日期的演算法和FAT16時相同的。

(2)、由於FAT32可定址的簇號到了32位二進位制數。所以系統在記錄檔案(資料夾)開始簇地址的時候也需要32位來記錄,FAT32啟用目錄項偏移0x12~0x13來表示起始簇號的高16位。

(3)、檔案長度依然用4個位元組表示,這說明FAT32依然只支援小於4GB的檔案(目錄),超過4GB的檔案(目錄),系統會截斷處理。

FAT32的一個重要的特點是完全支援長檔名。長檔名依然是記錄在目錄項中的。為了低版本的OS或程式能正確讀取長檔名檔案,系統自動為所有長檔名檔案建立了一個對應的短檔名,使對應資料既可以用長檔名定址,也可以用短檔名定址。不支援長檔名的OS或程式會忽略它認為不合法的長檔名欄位,而支援長檔名的OS或程式則會以長檔名為顯式項來記錄和編輯,並隱藏起短檔名。

當建立一個長檔名檔案時,系統會自動加上對應的短檔名,其一般有的原則:

(1)、取長檔名的前6個字元加上"~1"形成短檔名,副檔名不變。

(2)、如果已存在這個檔名,則符號"~"後的數字遞增,直到5。

(3)、如果檔名中"~"後面的數字達到5,則短檔名只使用長檔名的前兩個字母。通過數學操縱長檔名的剩餘字母生成短檔名的後四個字母,然後加字尾"~1"直到最後(如果有必要,或是其他數字以避免重複的檔名)。

(4)、如果存在老OS或程式無法讀取的字元,換以"_"

長檔名的實現有賴於目錄項偏移為0xB的屬性位元組,當此位元組的屬性為:只讀、隱藏、系統、卷標,即其值為0FH時,DOS和WIN32會認為其不合法而忽略其存在。這正是長檔名存在的依據。將目錄項的0xB置為0F,其他就任由系統定義了,Windows9x或Windows 2000、XP通常支援不超過255個字元的長檔名。系統將長檔名以13個字元為單位進行切割,每一組佔據一個目錄項。所以可能一個檔案需要多個目錄項,這時長檔名的各個目錄項按倒序排列在目錄表中,以防與其他檔名混淆。

長檔名中的字符采用unicode形式編碼(一個巨大的進步哦),每個字元佔據2位元組的空間。其目錄項定義如表15。

系統在儲存長檔名時,總是先按倒序填充長檔名目錄項,然後緊跟其對應的短檔名。從表15可以看出,長檔名中並不儲存對應檔案的檔案開始簇、檔案大小、各種時間和日期屬性。檔案的這些屬性還是存放在短檔名目錄項中,一個長檔名總是和其相應的短檔名一一對應,短檔名沒有了長檔名還可以讀,但長檔名如果沒有對應的短檔名,不管什麼系統都將忽略其存在。所以短檔名是至關重要的。在不支援長檔名的環境中對短檔名中的檔名和副檔名欄位作更改(包括刪除,因為刪除是對首字元改寫E5H),都會使長檔名形同虛設。長檔名和短檔名之間的聯絡光靠他們之間的位置關係維繫顯然遠遠不夠。其實,長檔名的0xD位元組的校驗和起很重要的作用,此校驗和是用短檔名的11個字元通過一種運算方式來得到的。系統根據相應的演算法來確定相應的長檔名和短檔名是否匹配。這個演算法不太容易用公式說明,我們用一段c程式來加以說明。

假設檔名11個字元組成字串shortname[],校驗和用chknum表示。得到過程如下:

int i,j,chknum=0;
for (i=11; i>0; i--)
        chksum = ((chksum & 1) ? 0x80 : 0) + (chksum >> 1) + shortname[j++];

如果通過短檔名計算出來的校驗和與長檔名中的0xD偏移處資料不相等。系統無論如何都不會將它們配對的。

依據長檔名和短檔名對目錄項的定義,加上對簇的編號和連結,FAT32上資料的讀取便遊刃有餘了。

相關推薦

硬碟FAT檔案系統原理詳細分析——轉載

    一、硬碟的物理結構: 硬碟儲存資料是根據電、磁轉換原理實現的。硬碟由一個或幾個表面鍍有磁性物質的金屬或玻璃等物質碟片以及碟片兩面所安裝的磁頭和相應的控制電路組成(圖1),其中碟片和磁頭密封在無塵的金屬殼中。 硬碟工作時,碟片以設計轉速高速旋轉,設定在碟片表面的磁頭則在電路控制下徑向移動到指定位置

java動態代理實現與原理詳細分析(【轉載】By--- Gonjan )

【轉載】By---    Gonjan    關於Java中的動態代理,我們首先需要了解的是一種常用的設計模式--代理模式,而對於代理,根據建立代理類的時間點,又可以分為靜態代理和動態代理。  一、代理模式  

java動態代理實現與原理詳細分析(【轉載】By--- Gonjan )

sleep class 實施 div prot stack 註意 san 由於 【轉載】By--- Gonjan 關於Java中的動態代理,我們首先需要了解的是一種常用的設計模式--代理模式,而對於代理,根據創建代理類的時間點,又可以分為靜態代理和動態代理。

Android查缺補漏(線程篇)-- AsyncTask的使用及原理詳細分析

catch 返回 rri 理解 ams tee ive lean keyword 本文作者:CodingBlock 文章鏈接:http://www.cnblogs.com/codingblock/p/8515304.html 一、AsyncTask的使用 AsyncT

HTTP 2.0 原理詳細分析

target all src coo rime 導致 -a charset afa HTTP 2.0是在SPDY(An experimental protocol for a faster web, The Chromium Projects)基礎上形成的下一代互聯網通信協

FAT檔案系統協議

FAT(File Allocation Table) FAT,檔案配置表。主要分FAT12/FAT16/FAT32,這三者可支配的大小越往後越大,不過協議大體相同。 FAT的整體結構圖: MBR MBR是整個硬碟的起始引導處,不過對於U盤來說,MBR主要用來對整個U盤

1、比較說明FAT檔案系統和NTFS檔案系統的特點

答:NTFS檔案系統的特性:(1)提供檔案和資料夾安全性   (2)可使用長英文名  (3)支援加密  (4)高可靠性  (5)壞簇對映  (6)支援對分割槽,資料夾和檔案的壓縮  (7)更高效的磁碟空間管理  (8)支援磁碟配額管理 &n

java動態代理實現與原理詳細分析

generator result title super java args 設計 需要 edt 關於Java中的動態代理,我們首先需要了解的是一種常用的設計模式--代理模式,而對於代理,根據創建代理類的時間點,又可以分為靜態代理和動態代理。 一、代理模式 代理模式

jvm載入class檔案原理機制分析

案例分析 A、B類中均包含靜態程式碼塊,非靜態程式碼塊以及構造器,A類是B類的父類。 public class A { static { System.out.print("A中靜態程式碼塊>>>"); }

Linux ext4檔案系統原理-檔案系統結構及檔案解析

基本概念 1扇區(sector)=512位元組(byte) 1資料塊(block)=8扇區=4KB(mkfs時指定,預設4KB,可設定為1KB - 64KB) Ext4欄位使用little-endian順序寫入磁碟;但journal日誌使用big-endian順序寫入磁碟。

ubi檔案系統製作指令分析

介紹UBIFS檔案系統,鄙人已經親身製作並使用的ti DM3730 linux平臺上。ubifs檔案系統掛載速度相對快,相比其他型別檔案系統,綜合性能狠強啊,不過鄙人實踐及官方也坦白一個事實,就是ubifs檔案系統對系統異常/突然掉電的容忍性不好,資料可能會嚴重損壞。 -------------

檔案壓縮演算法詳細分析(ZIP)及解壓例項解釋

原文地址:https://www.cnblogs.com/esingchan/p/3958962.html 最近自己實現了一個ZIP壓縮資料的解壓程式,覺得有必要把ZIP壓縮格式進行一下詳細總結,資料壓縮是一門通訊原理和電腦科學都會涉及到的學科,在通訊原理中,一般稱為信

Ubuntu硬碟只讀檔案系統

博主安裝win10和ubuntu雙系統,今日登入ubuntu發現掛載的硬碟無法寫入,顯示只讀檔案系統。 嘗試網上各種重新掛載和修復的方案,重啟無數次均無法解決。 後來登入win10後發現之前開啟的檔案都沒有關,推測是因為之前在win10直接重啟,win10沒有完全關閉,作業

yaffs2檔案系統原理

YAFFS(2) 2008-12-16 20:07 Spare所儲存的資料如下所示: 圖十 Tags: chunkID:指相對於此yaffs_Object的第幾個Chunk。當Chunk ID為0時,則表此Chunk所儲存的是yaffs_ObjectHeader。 serialNumber:用以辨別哪個

VLC視訊播放器原理詳細分析含TS流格式分析

vlc是一個功能強大的玩意,能做很多有意思的事情。 最簡單的,從介面開啟一個檔案播放,也可以在命令列下使用,如 C:\Program Files\VideoLAN\VLC>vlc.exe test.ts 獲取內建的幫助,會寫到vlc-help.txt C:\Pro

Hadoop分散式檔案系統--HDFS結構分析

前言 在Hadoop內部,具體實現了許多類的檔案系統,當然最最被我們用到的就是他的分散式檔案系統HDFS了。但是本篇文章不會講HDFS的主從架構等東西,因為這些東西網上和資料書中都講得很多了。所以,我決定以我個人的學習所得,來講講HDFS內部的一些有意思的東西

FAT32檔案系統FAT分析(二)

1.      FAT表的作用及結構特點 FAT32與FAT16表的作用和結構類似,這裡只道不同 A:FAT32的FAT表也是由FAT表項構成的,每個FAT項的大小為4個位元組 B:FAT項的大小為4個位元組,即32位,但是隻用到了26位,最多管理226 =671088

glusterfs分散式檔案系統詳細原理

1.Glusterfs簡介 GlusterFS是Scale-Out儲存解決方案Gluster的核心,它是一個開源的分散式檔案系統,具有強大的橫向擴充套件能力,通過擴充套件能夠支援數PB儲存容量和處理數千客戶端。GlusterFS藉助TCP/IP或Infi

轉載)Ext2 檔案系統硬碟佈局

轉自http://www.ibm.com/developerworks/cn/linux/filesystem/ext2/#icomments 前言 本文的資料來源是 Linux 核心中 ext3 檔案系統的原始碼。為了便於讀者查閱原始碼,本文中一些關鍵的技術詞彙都使用了核

【好文推薦】公司管理系統含義、類型、功能及價格的詳細分析

管理系統 企業在公司管理系統選型時,都想選性價比高、物有所值的。但市場上公司管理系統品牌眾多,價格各不相同,所以選型時,企業常被這些問題困擾:常用的公司管理系統有哪些?好用的公司管理系統價格多少合適?公司管理系統排行?……每個企業都迫切想知道答案。本文集中整理和逐一解答了大家最關註的一些問題,希望能給各