FAT32文件系统结构详解[通俗易懂](详解FAT32文件系统)
1. SD卡中FAT32文件系統快速入門
1.1. 理論知識
1.1.1. MBR(Main Boot Record)
- 主引導記錄,占446字節, 為計算機啟動后從可啟動介質上首先裝入內存并且執行的代碼,通常用來解釋分區結構
1.1.2. DBR(DOS Boot Record)
- DOS引導記錄,為操作系統進入文件系統以后可以訪問的第一個扇區,通常用來解釋文件系統,DBR是由硬盤的MBR裝載的程序段。DBR裝入內存后,即開始執行該引導程序段,其主要功能是完成操作系統的自舉并將控制權交給操作系統。每個分區都有引導扇區,但只有被設為活動分區才會被MBR裝的DBR入內存運行
1.1.3. EBR(Extended Boot Record)
- 擴展分區引導記錄,類似于主引導記錄MBR.因為MBR四條分區信息的限制,可以使用EBR方便擴展.它的結構與MBR類似,但是沒有引導程序和磁盤簽名,僅僅保留了分區表和結束標志
1.1.4. 工具說明
- 本文中的SD卡為SanDisk,大小為8G(卡上面寫的),每簇8個扇區,每扇區512bytes
- 使用的查看工具為“Winhex.exe”
1.2. 硬盤結構與SD卡結構
1.2.1. 硬盤結構
-
以4分區的硬盤為例加以說明:
-
主引導扇區包括主引導記錄(446bytes),4個DPT(Disk partition table硬盤分區表)(4*16=64bytes),分區有效標志0x55AA
-
擴展分區中的每個邏輯驅動器都存在一個類似于MBR的擴展引導記錄EBR。擴展引導記錄包括一個擴展分區表和該扇區的標簽。如果磁盤上沒有擴展分區,那么就不會有擴展引導記錄和邏輯驅動器。第一個邏輯驅動器的擴展分區表中的第一項指向它自身的引導扇區。第二項指向下一個邏輯驅動器的EBR。如果不存在進一步的邏輯驅動器,第二項就不會使用,而且被記錄成一系列零。如果有附加的邏輯驅動器,那么第二個邏輯驅動器的擴展分區表的第一項會指向它本身的引導扇區。第二個邏輯驅動器的擴展分區表的第二項指向下一個邏輯驅動器的EBR。擴展分區表的第三項和第四項永遠都不會被使用。
關于擴展分區,如下圖所示,擴展分區中邏輯驅動器的擴展引導記錄是一個連接表。該圖顯示了一個擴展分區上的三個邏輯驅動器,說明了前面的邏輯驅動器和最后一個邏輯驅動器之間在擴展分區表中的差異 -
除了擴展分區上最后一個邏輯驅動器外,擴展分區表的格式在每個邏輯驅動器中都是重復的:第一個項標識了邏輯驅動器本身的引導扇區,第二個項標識了下一個邏輯驅動器的EBR。最后一個邏輯驅動器的擴展分區表只會列出它本身的分區項。最后一個擴展分區表的第二個項到第四個項未被使用
1.2.2. MBR分析
- MBR放置在硬盤物理地址0的地方。總共512字節的主引導扇區中,MBR只占用了其中的446個字節,另外64個字節交給了 DPT,最后兩個字節“55,AA”是分區的結束標志。DPT由4個分區表組成,每個16字節。下圖為硬盤的MBR圖
- 你的硬盤的MBR引導代碼可能并非這樣。不過即使不同,所執行的功能大體是一樣的
-
紅色劃線部分即為DPT分區表,詳細定義如下表,僅以第一個分區表為例說明,需要注意的是FAT32文件系統數據存儲方式為小端字節序,數據反著看就對了~就像下表中總扇區數一樣
1.2.3. SD卡結構
SD卡是沒有分區的,默認只有一個分區,使用winhex打開如下
- unpartitioned space:非分區空間,即MBR所在扇區,0扇區
- Partition1(F:):分區空間,數據即是保存在此處的,開始扇區為305152,此值可以在MBR中找到
- 分區是以柱面的容量為分區粒度的,如果磁盤總空間不是整數個柱面的話,不夠一個柱面空間就是剩余空間了,這部分空間并不參與分區,無法利用
- 卡空間說明:7.3G=8*1000*1000*1000/1024/1024/1024,8G使用單位是十進制的,十進制下1G=1000M=1000000K=1000000000Bytes,而二進制下1G=1024M、1M=1024K,1K=1024bytes,而硬盤制造商一般會以10進制為單位
1.2.4. SD卡MBR
打開上圖非分區空間,如下:
- 紅色劃線(0x0004A800):相對扇區數,305152,四不四很熟悉?
- 綠色劃線(0x00E83800):總扇區數,15218688
- 總空間=總扇區數*每扇區字節數=15218688*512=7791968256,winhen顯示的總字節數為7948206080差不多啦~~~
1.2.5. SD卡存儲結構
SD卡文件系統并不是處在整個SD卡最開始的地方,它處在MBR所處的保留區之后,于是我們可以對使用FAT32文件系統的SD卡整體布局給出如下圖示。
1.3. FAT32文件系統
1.3.1. FAT文件系統介紹
-
FAT(File Allocation Table,文件分配表)文件系統是windows操作系統所使用的一種文件系統,它的發展過程經歷了FAT12、FAT16、FAT32三個階段。FAT文件系統用“簇”作為數據單元。一個“簇”由一組連續的扇區組成,簇所含的扇區數必須是2的整數次冪。簇的最大值為64個扇區,即32KB。所有簇從2開始進行編號,每個簇都有一個自己的地址編號。用戶文件和目錄都存儲在簇中。 本文每簇4KB大小。
-
FAT文件系統的數據結構中有兩個重要的結構:文件分配表和目錄項:
文件分配表:文件和文件夾內容儲存在簇中,如果一個文件或文件夾需要多于一個簇的空間,則用FAT表來描述,如何找到另外的簇。FAT結構用于指出文件的下一個簇,同時也說明了簇的分配狀態。FAT12、FAT16、FAT32這三種文件系統之間的主要區別在與FAT項的大小不同。
目錄項:FAT文件系統的每一個文件和文件夾都被分配到一個目錄項,目錄項中記錄著文件名、大小、文件內容起始地址以及其他一些元數據。 - 在FAT文件系統中,文件系統的數據記錄在“引導扇區中(DBR)”中。引導扇區位于整個文件系統的0號扇區,是文件系統隱藏區域(也稱為保留區)的一部分,我們稱其為DBR扇區,DBR中記錄著文件系統的起始位置、大小、FAT表個數及大小等相關信息。在FAT文件系統中,同時使用“扇區地址”和“簇地址”兩種地址管理方式。這是因為只有存儲用戶數據的數據區使用簇進行管理(FAT12和FAT16的根目錄除外),所有簇都位于數據區。其他文件系統管理數據區域是不以簇進行管理的,這部分區域使用扇區地址進行管理。文件系統的起始扇區為0號扇區(邏輯0扇區)。
1.3.2. FAT32文件系統結構
FAT文件系統整體分布如1.2.5節所示
- 深綠色:保留區含有一個重要的數據結構——DOS引導扇區(DBR)。FAT12、FAT16的保留區通常只有一個扇區,而FAT32的保留扇區要多一些,除0號扇區外,還有其他一些扇區,其中包括了DBR的備份扇區。
- 黃色:FAT區由兩個大小相等的FAT表組成——FAT1、FAT2,FAT2緊跟在FAT1之后。
- 灰色:FAT12、FAT16的根目錄雖然也屬于數據區,但是他們并不由簇進行管理。也就是說FAT12、FAT16的根目錄是沒有簇號的,他們的2號簇從根目錄之后開始。而FAT32的根目錄通常位于2號簇。
1.3.3. 保留區(深綠色)
- FAT32文件系統的開始部分有一個由若干個扇區組成的保留區,保留區的大小會記錄在DBR扇區中,比較常見的為32、34或38個扇區。由DBR中0x0e和0x0f兩個地址的數值決定,小端字節序,即N的值。
1.3.4. DBR解析
對讀寫FAT文件系統來說常用的就圖中劃線部分,48個字節,具體定義如下:
- 0x00~0x02:3字節,跳轉指令。
- 0x03~0x0A:8字節,文件系統標志和版本號,這里為MSDOS5.0。
- 0x0B~0x0C:2字節,每扇區字節數,0x0200=512
- 0x0D~0x0D:1字節,每簇扇區數,0x08。
- 0x0E~0x0F:2字節,保留扇區數,0x0C22=3106
- 0x10~0x10:1字節,FAT表個數,0x02。
- 0x11~0x12:2字節,FAT32必須等于0,FAT12/FAT16為根目錄中目錄的個數;
- 0x13~0x14:2字節,FAT32必須等于0,FAT12/FAT16為扇區總數。
- 0x15~0x15:1字節,哪種存儲介質,0xF8標準值,可移動存儲介質。
- 0x16~0x17:2字節,FAT32必須為0,FAT12/FAT16為一個FAT 表所占的扇區數。
- 0x18~0x19:2字節,每磁道扇區數,只對于“特殊形狀”(由磁頭和柱面分割為若干磁道)的存儲介質有效,0x003F=63。
- 0x1A~0x1B:2字節,磁頭數,只對特殊的介質才有效,0x00FF=255。
- 0x1C~0x1F:4字節,EBR分區之前所隱藏的扇區數,0x0004A800=305152又出現了呢,與MBR中地址0x1C6開始的4個字節數值相等。
- 0x20~0x23:4字節,文件系統總扇區數,0x00E83800=15218688
- 0x24~0x27:4字節,每個FAT表占用扇區數,0x000039EF=14831
- 0x28~0x29:2字節,標記,此域FAT32 特有。
- 0x2A~0x2B:2字節,FAT32版本號0.0,FAT32特有。
- 0x2C~0x2F:4字節,根目錄所在第一個簇的簇號,0x02。(雖然在FAT32文件系統下,根目錄可以存放在數據區的任何位置,但是通常情況下還是起始于2號簇)
- 0x30~0x31:2字節,FSINFO(文件系統信息扇區)扇區號0x01,該扇區為操作系統提供關于空簇總數及下一可用簇的信息。
- 0x32~0x33:2字節,備份引導扇區的位置。備份引導扇區總是位于文件系統的6號扇區。
- 0x34~0x3F:12字節,用于以后FAT 擴展使用。
- 0x40~0x40:1字節,與FAT12/16 的定義相同,只不過兩者位于啟動扇區不同的位置而已。
- 0x41~0x41:1字節,與FAT12/16 的定義相同,只不過兩者位于啟動扇區不同的位置而已 。
- 0x42~0x42:1字節,擴展引導標志,0x29。與FAT12/16 的定義相同,只不過兩者位于啟動扇區不同的位置而已
- 0x43~0x46:4字節,卷序列號。通常為一個隨機值。
- 0x47~0x51:11字節,卷標(ASCII碼),如果建立文件系統的時候指定了卷標,會保存在此。
- 0x52~0x59:8字節,文件系統格式的ASCII碼,FAT32。
- 0x5A~0x1FD:共420字節,引導代碼。
- 0x1FE~0x1FF:簽名標志“55 AA”。
FAT文件系統將引導代碼與文件形同數據結構融合在FAT32文件系統引導扇區的512字節中,90~509字節為引導代碼,而FAT12/16則是62~509字節為引導代碼。同時,FAT32還可以利用引導扇區后的扇區空間存放附加的引導代碼。一個FAT卷即使不是可引導文件系統,也會存在引導代碼。
1.3.5. FSINFO扇區
FAT32在保留區中增加了一個FSINFO扇區,用以記錄文件系統中空閑簇的數量以及下一可用簇的簇號等信息,以供操作系統作為參考。FSINFO信息扇區一般位于文件系統的1號扇區,結構非常簡單。
- 0x200~0x203:4個字節,擴展引導標志“0x52526141”。
- 0x204~0x3E3:480個字節,未使用,全部置0。
- 0x3E4~0x3E7:4個字節,FSINFO簽名“0x72724161”。
- 0x3E8~0x3EB:4個字節,文件系統的空簇數,0xFFFFFFFF,這個值感覺有問題,格式化SD卡新建一個小于4K的文件,此處的值變成0x1CF6FE,所以上面的值應該為0x1FF6FF,猜測可能是由于格式化之后就會將此處置FF,新建文件后才會恢復
- 0x3EC~0x3EF:4個字節,下一可用簇號(0x00000002)。
- 0x3F0~0x3FD:14個字節,未使用。
- 0x3FE~0x3FF:2個字節,“55 AA”標志。
溫馨提示:通常情況下,文件系統的2號扇區結尾也會被設置“55 AA”標志。6號扇區也會有一個引導扇區的備份,相應的7號扇區應該是一個備份FSINFO信息扇區,8號扇區可以看做是2號扇區的備份。
1.3.6. FAT表
緊跟在保留分區后面的是FAT區,其由兩個完全相同的FAT(File Allocation Table, 文件分配表)表單組成,FAT文件系統的名字也是因此而來。FAT 表是一組與數據簇號對應的列表。FAT2緊跟在FAT1之后,它的位置可以通過FAT1的位置加上FAT表的扇區數計算出來。
1.3.7. FAT表的作用
-
文件系統分配磁盤空間按簇來分配。因此,文件占有磁盤空間時,基本單位不是字節而是簇,即使某個文件只有一個字節,操作系統也會給它分配一個最小單元:即一個簇。對于大文件,需要分配多個簇。同一個文件的數據并不一定完整地存放在磁盤中一個連續地區域內,而往往會分若干段,像鏈子一樣存放。這種存儲方式稱為文件的鏈式存儲。為了實現文件的鏈式存儲,文件系統必須準確地記錄哪些簇已經被文件占用,還必須為每個已經占用的簇指明存儲后繼的下一個簇的簇號,對于文件的最后一簇,則要指明本簇無后繼簇。這些都是由FAT表來保存的,FAT 表對應表項中記錄著它所代表的簇的有關信息:諸如是空,是不是壞簇,是否是已經是某個文件的尾簇等。
-
對于文件系統來說,FAT表有兩個重要作用:描述簇的分配狀態以及標明文件或目錄的下一簇的簇號。
- 通常情況下,一個FAT文件系統會有兩個FAT表,但有時也允許只有一個FAT表,FAT表的具體個數記錄在引導扇區的偏移0x10字節處。
- 由于FAT區緊跟在文件系統保留區后,所以FAT1在文件系統中的位置可以通過引導記錄中偏移0x0E~0x0F字節處的“保留扇區數”得到,即M值。
1.3.8. FAT表分析說明
- FAT32中每個簇的簇地址是有32bit(4個字節),FAT表中的所有字節位置以4字節為單位進行劃分,并對所有劃分后的位置由0進行地址編號。0號地址與1號地址被系統保留并存儲特殊標志內容。從2號地址開始,每個地址對應于數據區的簇號,FAT表中的地址編號與數據區中的簇號相同。我們稱FAT表中的這些地址為FAT表項,FAT表項中記錄的值稱為FAT表項值。
- 當文件系統被創建,也就是進行格式化操作時,分配給FAT區域的空間將會被清空,在FAT1與FAT2的0號表項與1號表項寫入特定值。由于創建文件系統的同時也會創建根目錄,也就是為根目錄分配了一個簇空間,通常為2號簇,與之對應的2號FAT表項記錄為2號簇,被寫入一個結束標記。
- 由于簇號起始于2號,所以FAT表項的0號表項與1號表項不與任何簇對應。FAT32的0號表項值總是“F8FFFF0F”。
- 1號表項可能被用于記錄臟標志,以說明文件系統沒有被正常卸載或者磁盤表面存在錯誤。不過這個值并不重要。正常情況下1號表項值為“FFFFFFFF”或“FFFFFF0F”。
- 如果某個簇未被分配使用,它對應的FAT表項值0;
- 當某個簇已被分配使用,則它對應的FAT表項內的表項值也就是該文件的下一個存儲位置的簇號。如果該文件結束于該簇,則在它的FAT表項中記錄的是一個文件結束標記,對于FAT32而言,代表文件結束的FAT表項值為0x0FFFFFFF。
- 如果某個簇存在壞扇區,則整個簇會用0xFFFFFF7標記為壞簇,這個壞簇標記就記錄在它所對應的FAT表項中。
- 在文件系統中新建文件時,如果新建的文件只占用一個簇,為其分配的簇對應的FAT表項將會寫入結束標記。如果新建的文件不只占用一個簇,則在其所占用的每個簇對應的FAT表項中寫入為其分配的下一簇的簇號,在最后一個簇對應的FAT表象中寫入結束標記。
- 新建目錄時,只為其分配一個簇的空間,對應的FAT表項中寫入結束標記。當目錄增大超出一個簇的大小時,將會在空閑空間中繼續為其分配一個簇,并在FAT表中為其建立FAT表鏈以描述它所占用的簇情況。
1.3.9. FAT表示例
- 綠色劃線:0號表項,0x0FFFFFF8,FAT表起始固定標識
- 紅色劃線,1號表項,0x0FFFFFFF,不使用,默認值
- 藍色劃線,2號表項,0x0FFFFFFF,標識文件結束,表項對應2號簇,根目錄所在簇
- 如何找到FAT表所在扇區:
DBR的偏移0x0E-0x0F(0x0C22=3106)是保留區大小,保留區之后即為FAT1起始扇區,上圖中偏移0x184400轉換為扇區0x184400/512=3106,扇區從0計數,所以3106扇區即是FAT1所在扇區,讀者可以通過FAT表大小,計算出FAT2的起始扇區嗎?我相信可以的,你們都是最胖的T_T - 計算根目錄起始扇區:
N=保留區大小+2*FAT表大小=0x0C22+2*0x000039EF=32768 - 將SD卡格式化,新建TEST.txt文件,大小為8.5KB,FAT表結構如下:
- 紅色劃線:2號表項,對應2號簇,為根目錄
- 綠色劃線:3號表項,對應3號簇,表項值為0x04,Test.txt的下一個簇為4號簇
- 藍色劃線:4號表項,對應5號簇,表項值為0x05,Test.txt的下一個簇為5號簇
- 黃色劃線:5號表項,對應5號簇,表項值為0x0FFFFFFF,文件結束
1.3.10. 數據區(灰色區域)
- 數據區是真正用于存放用戶數據的區域。數據區緊跟在FAT2之后,被劃分成一個個的簇。所有的簇從2開始進行編號,也就是說,2號簇的起始位置就是數據區的起始位置。
- 雖然原則上FAT32允許根目錄位于數據區的任何位置,但通常情況下它都位于數據區起始扇區。在FAT文件系統中,先要尋找數據區的第一簇(即2號簇)的位置,它不是位于文件系統開始處,而是位于數據區。從前面的學習知道,在數據區前面是保留區域和FAT區域,在前面還有MBR區域,這些區域都不使用FAT表進行管理。因此,數據區以前的區域只能使用扇區地址,而無法使用簇地址。
- 數據區起始扇區號即是根目錄扇區號,上面已計算得出32768。
1.4. 目錄項
目錄所在的扇區,都是以32 Bytes劃分為一個單位,每個單位稱為一個目錄項,即每個目錄項的長度都是32 Bytes 。根目錄由若干個目錄項組成,一個目錄項占用32個字節,可以是長文件名目錄項、文件目錄項、“.”目錄項和“..”目錄項等
此處只是簡單的以上文中創建的TEST.txt為例說明短文件目錄項的結構。
- 0x00-0x07:文件名,不足8個字節0x20補全(短文件名8.3命名規則)
- 0x08-0x0A:擴展名
- 0x0B:文件屬性,0x20表示歸檔
- 0x0D:創建時間的10毫秒位
- 0x0E-0x0F:文件創建時間
- 0x10-0x11:文件創建日期
- 0x12-0x13:文件最后訪問日期
- 0x14-0x15:文件起始簇號的高16位 0x0000
- 0x16-0x17:文件最近修改時間
- 0x18-0x19:文件最近修改日期
- 0x1A-0x1B:文件起始簇號的地16位 0x0003
- 0x1C-0x1F:文件的長度,0x2206=8710bytes=8.5K
原文鏈接:https://blog.csdn.net/u010650845/article/details/60881687
總結
以上是生活随笔為你收集整理的FAT32文件系统结构详解[通俗易懂](详解FAT32文件系统)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: occ-backend-base-url
- 下一篇: SAP Fiori Service Mo