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