SD卡中FAT32文件格式快速入门(图文详细介绍)
說明:
MBR?:Master?Boot?Record?(?主引導(dǎo)記錄)?
DBR?:DOS?Boot?Record?(?引導(dǎo)扇區(qū))?
FAT?:File?Allocation?Table?(?文件分配表)?
硬件:本文SD卡為Kingston?4GB,FAT32格式,簇大小4KB,每扇區(qū)512字節(jié)。
?
第一章?硬盤結(jié)構(gòu)與SD卡結(jié)構(gòu)
1.1?硬盤介紹
1.1硬盤結(jié)構(gòu)
?
如果你熟悉硬盤結(jié)構(gòu)跳過本節(jié)。下圖是硬盤的結(jié)構(gòu),如果你只是為了學(xué)習(xí)SD卡FAT32文件系統(tǒng)的話,這里你只需要注意硬盤排序結(jié)構(gòu):主引導(dǎo)記錄(MBR)—引導(dǎo)扇區(qū)—數(shù)據(jù)—引導(dǎo)扇區(qū)—數(shù)據(jù)。
?
圖1
?
1.2?MBR分析
?
MBR(Main?Boot?Record?主引導(dǎo)記錄區(qū))放置在硬盤物理地址0的地方。總共512字節(jié)的主引導(dǎo)扇區(qū)中,MBR只占用了其中的446個(gè)字節(jié),另外64個(gè)字節(jié)交給了?DPT(Disk?Partition?Table硬盤分區(qū)表),最后兩個(gè)字節(jié)“55,AA”是分區(qū)的結(jié)束標(biāo)志。DPT由4個(gè)分區(qū)表組成,每個(gè)16字節(jié)。下圖中以以硬盤的MBR圖,粉紅色為硬盤分區(qū)表。
圖2
?
對(duì)于我們來說,更關(guān)注硬盤分區(qū)表表中紅色區(qū)域:下圖為硬盤分區(qū)表詳細(xì)說明 。如果要對(duì)SD卡、U盤等分多個(gè)區(qū),DPT的內(nèi)容就表示各個(gè)區(qū)的偏移地址和大小。
| 起始地址 | 字節(jié)數(shù) | 描述 |
| 0x1BE | 1 | 可引導(dǎo)標(biāo)志,0x00不可引導(dǎo),0x80可引導(dǎo) |
| 0x1BF~0x1C1 | 3 | 分區(qū)起始CHS地址(CHS=磁頭、柱面、扇區(qū)),起始地址 |
| 0x1C2 | 1 | 分區(qū)類型 |
| 0x1C3~0x1C5 | 3 | 分區(qū)結(jié)束CHS地址 |
| 0x1C6 | 4 | 從磁盤開始到該分區(qū)開始的偏移量(分區(qū)起始LBA地址Little-endian順序) |
| 0x1CA | 4 | 總扇區(qū)數(shù)(Little-endian順序) |
圖3
?
SD結(jié)構(gòu)
SD卡沒有分區(qū),默認(rèn)就是一個(gè)分區(qū)。首先用WinHex文件打開SD所在的盤符,顯示如下圖:
圖4?
① 非分區(qū)空間(紅線所示):?起始扇區(qū)0,我認(rèn)為這個(gè)分區(qū)就是硬盤上的MBR所在區(qū)域,
打開后如下圖所示,也可以稱為SD卡的MBR區(qū)域。
圖5
?
根據(jù)表1知道:
紅線區(qū)域(00002000)為下個(gè)分區(qū)的扇區(qū)地址,即第8192扇區(qū),見圖3分區(qū)1的起始扇區(qū)。
藍(lán)線區(qū)域(00760C00)為SD卡總的扇區(qū)個(gè)數(shù),我們可以計(jì)算一下:
?????0x760C00?*512(每扇區(qū)字節(jié))=?3960995840?(字節(jié)),與實(shí)際大小基本一樣。
?
② 分區(qū)1(藍(lán)線所示):起始扇區(qū)8192.
?
③ 剩余扇區(qū)????:?才疏學(xué)淺,我不知道干嘛的,呵呵
1.3?SD卡存儲(chǔ)結(jié)構(gòu)
由此可知SD卡文件系統(tǒng)并不是處在整個(gè)SD卡最開始的地方,它處在MBR所處的保留區(qū)之后,于是我們可以對(duì)使用FAT32文件系統(tǒng)的SD卡整體布局給出如下圖示。
圖6
?
?
?
第二章?FAT32文件系統(tǒng)介紹
2.1?FAT文件系統(tǒng)簡介
FAT(File?Allocation?Table,文件分配表)文件系統(tǒng)是windows操作系統(tǒng)所使用的一種文件系統(tǒng),它的發(fā)展過程經(jīng)歷了FAT12、FAT16、FAT32三個(gè)階段。FAT文件系統(tǒng)用“簇”作為數(shù)據(jù)單元。一個(gè)“簇”由一組連續(xù)的扇區(qū)組成,簇所含的扇區(qū)數(shù)必須是2的整數(shù)次冪。簇的最大值為64個(gè)扇區(qū),即32KB。所有簇從2開始進(jìn)行編號(hào),每個(gè)簇都有一個(gè)自己的地址編號(hào)。用戶文件和目錄都存儲(chǔ)在簇中。?本文每簇4KB大小。
FAT文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)中有兩個(gè)重要的結(jié)構(gòu):文件分配表和目錄項(xiàng):
文件分配表:文件和文件夾內(nèi)容儲(chǔ)存在簇中,如果一個(gè)文件或文件夾需要多余一個(gè)簇的空間,則用FAT表來描述,如何找到另外的簇。FAT結(jié)構(gòu)用于指出文件的下一個(gè)簇,同時(shí)也說明了簇的分配狀態(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ū)域(也稱為保留區(qū))的一部分,我們稱其為DBR(DOS?Boot?Recorder——DOS引導(dǎo)記錄)扇區(qū),DBR中記錄著文件系統(tǒng)的起始位置、大小、FAT表個(gè)數(shù)及大小等相關(guān)信息。在FAT文件系統(tǒng)中,同時(shí)使用“扇區(qū)地址”和“簇地址”兩種地址管理方式。這是因?yàn)橹挥写鎯?chǔ)用戶
數(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ū)。?
2.2?FAT32文件系統(tǒng)結(jié)構(gòu)
FAT文件系統(tǒng)整體分布如上圖?存儲(chǔ)器文件結(jié)構(gòu)圖?所示,有:
【1深綠色】保留區(qū)含有一個(gè)重要的數(shù)據(jù)結(jié)構(gòu)——系統(tǒng)引導(dǎo)扇區(qū)(DBR)。FAT12、FAT16的保留區(qū)通常只有一個(gè)扇區(qū),而FAT32的保留扇區(qū)要多一些,除0號(hào)扇區(qū)外,還有其他一些扇區(qū),其中包括了DBR的備份扇區(qū)。?
【2黃色】??FAT區(qū)由來年各個(gè)大小相等的FAT表組成——FAT1、FAT2,FAT2緊跟在FAT1之后。?
【3灰色】??FAT12、FAT16的根目錄雖然也屬于數(shù)據(jù)區(qū),但是他們并不由簇進(jìn)行管理。也就是說FAT12、FAT16的根目錄是沒有簇號(hào)的,他們的2號(hào)簇從根目錄之后開始。而FAT32的根目錄通常位于2號(hào)簇。
2.2.1?保留區(qū)(深綠色區(qū)域)
FAT32文件系統(tǒng)的開始部分有一個(gè)由若干個(gè)扇區(qū)組成的保留區(qū),保留區(qū)的大小會(huì)記錄在DBR扇區(qū)中,比較常見的為32、34或38個(gè)扇區(qū)。如上圖:由DBR中)0x0e和0x0f兩個(gè)地址的數(shù)值決定,記得是小端模式,即N的值。?
2.2.1.1?引導(dǎo)扇區(qū)(DBR)
【大小】:512字節(jié);
對(duì)讀寫FAT文件系統(tǒng)來說常用的就圖中紅色劃線部分,48個(gè)字節(jié)。其他的均為一些標(biāo)注信息。想了解具體的定義請(qǐng)看附錄表。
圖7
【1】0x00~0x02:3字節(jié),跳轉(zhuǎn)指令。?
【2】0x03~0x0A:8字節(jié),文件系統(tǒng)標(biāo)志和版本號(hào),這里為MSDOC5.0。?
【3】0x0B~0x0C:2字節(jié),每扇區(qū)字節(jié)數(shù),512(0X02?00)。?
【4】0x0D~0x0D:1字節(jié),每簇扇區(qū)數(shù),8(0x08)。?
【5】0x0E~0x0F:2字節(jié),保留扇區(qū)數(shù),38(0x00?26),符合FAT1起始地址為38扇區(qū)。?
?
【6】0x10~0x10:1字節(jié),FAT表個(gè)數(shù),2。?
【7】0x11~0x12:2字節(jié),FAT32必須等于0,FAT12/FAT16為根目錄中目錄的個(gè)數(shù);?
【8】0x13~0x14:2字節(jié),FAT32必須等于0,FAT12/FAT16為扇區(qū)總數(shù)。?
【9】0x15~0x15:1字節(jié),哪種存儲(chǔ)介質(zhì),0xF8標(biāo)準(zhǔn)值,可移動(dòng)存儲(chǔ)介質(zhì),常用的?0xF0。?
【10】0x16~0x17:2字節(jié),FAT32必須為0,FAT12/FAT16為一個(gè)FAT?表所占的扇區(qū)數(shù)。
【11】0x18~0x19:2字節(jié),每磁道扇區(qū)數(shù),只對(duì)于有“特殊形狀”(由磁頭和柱面每 分割為若干磁道)的存儲(chǔ)介質(zhì)有效,63(0x00?3F)。?
【12】0x1A~0x1B:2字節(jié),磁頭數(shù),只對(duì)特殊的介質(zhì)才有效,255(0x00?FF)。?
【13】0x1C~0x1F:4字節(jié),EBR分區(qū)之前所隱藏的扇區(qū)數(shù),8192(0x00?00?20?00),與MBR中地址0x1C6開始的4個(gè)字節(jié)數(shù)值相等。
?
【14】0x20~0x23:4字節(jié),文件系統(tǒng)總扇區(qū)數(shù),7736320(0x?00?76?0C?00),7736320?*? 512?=?3960995840??≈?3.67GB。
【15】0x24~0x27:4字節(jié),每個(gè)FAT表占用扇區(qū)數(shù),7541(0x?00?00?1D?75)。?
【16】0x28~0x29:2字節(jié),標(biāo)記,此域FAT32?特有。?
【17】0x2A~0x2B:2字節(jié),FAT32版本號(hào)0.0,FAT32特有。?
【18】0x2C~0x2F:4字節(jié),根目錄所在第一個(gè)簇的簇號(hào),2。(雖然在FAT32文件系統(tǒng)?下,根目錄可以存放在數(shù)據(jù)區(qū)的任何位置,但是通常情況下還是起始于2號(hào)簇)?
?
【19】0x30~0x31:2字節(jié),FSINFO(文件系統(tǒng)信息扇區(qū))扇區(qū)號(hào)1,該扇區(qū)為操作 系統(tǒng)提供關(guān)于空簇總數(shù)及下一可用簇的信息。?
【20】0x32~0x33:2字節(jié),備份引導(dǎo)扇區(qū)的位置。備份引導(dǎo)扇區(qū)總是位于文件系統(tǒng) 的6號(hào)扇區(qū)。?
【21】0x34~0x3F:12字節(jié),用于以后FAT?擴(kuò)展使用。?
?
【22】0x40~0x40:1字節(jié),與FAT12/16?的定義相同,只不過兩者位于啟動(dòng)扇區(qū)不
同的位置而已。
? 【23】0x41~0x41:1字節(jié),與FAT12/16?的定義相同,只不過兩者位于啟動(dòng)扇區(qū)不
同的位置而已?。?
【24】0x42~0x42:1字節(jié),擴(kuò)展引導(dǎo)標(biāo)志,0x29。與FAT12/16?的定義相同,只不過?兩者位于啟動(dòng)扇區(qū)不同的位置而已
【25】0x43~0x46:4字節(jié),卷序列號(hào)。通常為一個(gè)隨機(jī)值。?
【26】0x47~0x51:11字節(jié),卷標(biāo)(ASCII碼),如果建立文件系統(tǒng)的時(shí)候指定了卷?標(biāo),會(huì)保存在此。?
【27】0x52~0x59:8字節(jié),文件系統(tǒng)格式的ASCII碼,FAT32。?
【28】0x5A~0x1FD:90~509共410字節(jié),未使用。該部分沒有明確的用途。?
【29】0x1FE~0x1FF:簽名標(biāo)志“55?AA”。?
說明:引導(dǎo)代碼
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í),FAT32還可以利用引導(dǎo)扇區(qū)后的扇區(qū)空間存放附加的引導(dǎo)代碼。一個(gè)FAT卷即使不是可引導(dǎo)文件文件系統(tǒng),也會(huì)存在引導(dǎo)代碼。
2.2.1.2?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)非常簡單。FSINFO信息扇區(qū)結(jié)構(gòu)。
圖8
?
【1】0x00~0x03:?4個(gè)字節(jié),擴(kuò)展引導(dǎo)標(biāo)志“0x52526141”。?
【2】0x04~0x1E3:480個(gè)字節(jié),未使用,全部置0。?
【3】0x1E4~0x1E7:?4個(gè)字節(jié),FSINFO簽名“0x72724161”。?
【4】0x1E8~0x1EB:?4個(gè)字節(jié),文件系統(tǒng)的空簇?cái)?shù),964466(0x00?0E?B7?72)。?
【5】0x1EC~0x1EF:?4個(gè)字節(jié),下一可用簇號(hào)(0x?00?00?00?15)。?
【6】0x1F0~0x1FD:?14個(gè)字節(jié),未使用。?
【7】0x1FE~0x1FF:?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ū)的備份。
2.2.2?文件分區(qū)FAT表(黃色區(qū)域)
緊跟在保留分區(qū)后面的是FAT區(qū),其由兩個(gè)完全相同的FAT(File?Allocation?Table,?文件分配表)表單組成,FAT文件系統(tǒng)的名字也是因此而來。FAT?表(File?Alloacation?Table)是一組與數(shù)據(jù)簇號(hào)對(duì)應(yīng)的列表。FAT2緊跟在FAT1之后,它的位置可以通過FAT1的位置加上FAT表的大小扇區(qū)數(shù)計(jì)算出來。
2.2.2.1?文件系統(tǒng)概述
文件系統(tǒng)分配磁盤空間按簇來分配。因此,文件占有磁盤空間時(shí),基本單位不是字節(jié)而是簇,即使某個(gè)文件只有一個(gè)字節(jié),操作系統(tǒng)也會(huì)給它分配一個(gè)最小單元:即一個(gè)簇。對(duì)于大文件,需要分配多個(gè)簇。同一個(gè)文件的數(shù)據(jù)并不一定完整地存放在磁盤中一個(gè)連續(xù)地區(qū)域內(nèi),而往往會(huì)分若干段,像鏈子一樣存放。這種存儲(chǔ)方式稱為文件的鏈?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表來保存的,FAT?表對(duì)應(yīng)表項(xiàng)中記錄著它所代表的簇的有關(guān)信息:諸如是空,是不是壞簇,是否是已經(jīng)是某個(gè)文件的尾簇等。
?
v?對(duì)于文件系統(tǒng)來說,FAT表有兩個(gè)重要作用:描述簇的分配狀態(tài)以及標(biāo)明文件或目錄的下一簇的簇號(hào)。?
v?通常情況下,一個(gè)FAT把文件系統(tǒng)會(huì)有兩個(gè)FAT表,但有時(shí)也允許只有一個(gè)FAT表,FAT表的具體個(gè)數(shù)記錄在引導(dǎo)扇區(qū)的偏移0x10字節(jié)處。?
v?由于FAT區(qū)緊跟在文件系統(tǒng)保留區(qū)后,所以FAT1在文件系統(tǒng)中的位置可以通過引導(dǎo)記錄中偏移0x0E~0x0F字節(jié)處的“保留扇區(qū)數(shù)”得到,如存儲(chǔ)器結(jié)構(gòu)體圖中M值。?
?
2.2.2.2?FAT表分析說明
?
FAT32中每個(gè)簇的簇地址是有32bit(4個(gè)字節(jié)),FAT表中的所有字節(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)地址開始,每個(gè)地址對(duì)應(yīng)于數(shù)據(jù)區(qū)的簇號(hào),FAT表中的地址編號(hào)與數(shù)據(jù)區(qū)中的簇號(hào)相同。我們稱FAT表中的這些地址為FAT表項(xiàng),FAT表項(xià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)寫入特定值。由于創(chuàng)建文件系統(tǒng)的同時(shí)也會(huì)創(chuàng)建根目錄,也就是為根目錄分配了一個(gè)簇空間,通常為2號(hào)簇,與之對(duì)應(yīng)的2號(hào)FAT表項(xiàng)記錄為2號(hào)簇,被寫入一個(gè)結(jié)束標(biāo)記。
幾點(diǎn)說明:
??由于簇號(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)志,以說明文件系統(tǒng)沒有被正常卸載或者磁盤表面存在錯(cuò)誤。不過這個(gè)值并不重要。正常情況下1號(hào)表項(xiàng)的值為“FFFFFFFF”或“FFFFFF0F”。
??如果某個(gè)簇未被分配使用,它對(duì)應(yīng)的FAT表項(xiàng)內(nèi)容為0;
??當(dāng)某個(gè)簇已被分配使用,則它對(duì)應(yīng)的FAT表項(xiàng)內(nèi)的FAT表項(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ì)寫入結(jié)束標(biāo)記。如果新建的文件不只占用一個(gè)簇,則在其所占用的每個(gè)簇對(duì)應(yīng)的FAT表項(xiàng)中寫入為其分配的下一簇的簇號(hào),在最后一個(gè)簇對(duì)應(yīng)的FAT表象中寫入結(jié)束標(biāo)記。
??新建目錄時(shí),只為其分配一個(gè)簇的空間,對(duì)應(yīng)的FAT表項(xiàng)中寫入結(jié)束標(biāo)記。當(dāng)目錄增大超出一個(gè)簇的大小時(shí),將會(huì)在空閑空間中繼續(xù)為其分配一個(gè)簇,并在FAT表中為其建立FAT表鏈以描述它所占用的簇情況。
?
2.2.2.3?FAT表示例
?
【0號(hào)表項(xiàng)】:0x0FFFFFF8;FAT表起始固定標(biāo)識(shí)
【1號(hào)表項(xiàng)】:0xFFFFFFFF;不是用,默認(rèn)值
【2號(hào)表項(xiàng)】:0x0FFFFFFF;根目錄所在簇,
紫色的為3號(hào)表項(xiàng),綠色的為4號(hào)表項(xiàng),以此類推。注意:0和1號(hào)表項(xiàng)均不與實(shí)際的物理地址對(duì)應(yīng),2號(hào)表項(xiàng)開始才與物理地址對(duì)應(yīng)。2號(hào)表項(xiàng)物理地址為FAT2表后緊跟著的那個(gè)簇!3號(hào)在2號(hào)表項(xiàng)緊跟著的一個(gè)簇。
計(jì)算:FAT所占扇區(qū)數(shù)?7541(0x1D75);FAT2起始扇區(qū)為38+7541=7579;根目錄起始扇區(qū)在7579?+?7541?=?15120。記得本文8個(gè)扇區(qū)為一個(gè)簇,即4K(0x1000),簇是系統(tǒng)分配內(nèi)存的最小單元。
如圖表中的起始地址對(duì)比,發(fā)現(xiàn)根目錄起始地址剛好在15120,所以FAT表中0和1號(hào)表項(xiàng)沒有對(duì)應(yīng)物理地址!
圖9?
我將SD格式化,新建了一個(gè)test.txt的文本文件,大小為8.2kB。如下圖:
圖10?
我們來分析上圖:
在圖中可以看出,test.txt文件起始簇為15128,這個(gè)地址是我們根目錄(2號(hào)簇)后的一個(gè)簇,所以test.txt文件起始簇是3號(hào)簇,也就是3號(hào)表項(xiàng)(FAT表中表項(xiàng)值與簇號(hào)對(duì)應(yīng))。
【1】:2號(hào)表項(xiàng)為根目錄,即2號(hào)簇。
【2】:3號(hào)表項(xiàng)為-0x00?00?00?04,test文件的下一簇號(hào)在4號(hào)表項(xiàng),查看4號(hào)表項(xiàng)。
【3】:4號(hào)表項(xiàng)為-0x00?00?00?05,test文件下一簇號(hào)在5號(hào)表項(xiàng),查看5號(hào)表項(xiàng)。
【4】:5號(hào)表項(xiàng)為-0x0F?FF?FF?FF,結(jié)束符號(hào)。說明文件在5號(hào)簇時(shí)就存儲(chǔ)完畢。
?
2.2.3?數(shù)據(jù)區(qū)(灰色區(qū)域)
數(shù)據(jù)區(qū)時(shí)真正用于存放用戶數(shù)據(jù)的區(qū)域。數(shù)據(jù)區(qū)緊跟在FAT2之后,被劃分成一個(gè)個(gè)的簇。所有的簇從2開始進(jìn)行編號(hào),也就是說,2號(hào)簇的起始位置就是數(shù)據(jù)區(qū)的起始位置。?
2.2.3.1?根目錄
FAT表示例中,根目錄截圖:
?
圖11
雖然原則上FAT32允許根目錄位于數(shù)據(jù)區(qū)的任何位置,但通常情況下它都位于數(shù)據(jù)區(qū)起始扇區(qū),2號(hào)簇,可以在DBR偏移地址0x2C~0x2F查看。在FAT文件系統(tǒng)中,先要尋找數(shù)據(jù)區(qū)的第一簇(即2號(hào)簇)的位置,它不是位于文件系統(tǒng)開始處,而是位于數(shù)據(jù)區(qū)。從前面的學(xué)習(xí)知道,在數(shù)據(jù)區(qū)前面是保留區(qū)域和FAT區(qū)域,在前面還有MBR區(qū)域,這些區(qū)域都不使用FAT表進(jìn)行管理。因此,數(shù)據(jù)區(qū)以前的區(qū)域只能使用扇區(qū)地址,而無法使用簇地址。
其實(shí)在2.2.2.3節(jié),FAT表示例中我們就已經(jīng)計(jì)算過其實(shí)地址(15128),注意這個(gè)地址不是物理地址哦,只是在FAT文件區(qū)域中一個(gè)相對(duì)地址!因?yàn)樵谥斑€有MBR保留區(qū)域!
【保留區(qū)域大小(綠色部分)】:DBR偏移地址0x0E~0x0F,38(0x26),
【FAT表個(gè)數(shù)】:DBR偏移地址0x10開始2字節(jié),2個(gè),
【每個(gè)FAT表扇區(qū)數(shù)】:DBR偏移地址0x24~0x27,7541(0x?00?00?1D?75),
說明:以上值均參見2.2.1.1節(jié)。
?
【計(jì)算公式】:
?????數(shù)據(jù)區(qū)起始扇區(qū)號(hào)?=?保留扇區(qū)數(shù)?+?每個(gè)FAT表大小扇區(qū)數(shù)?×?FAT表個(gè)數(shù)
【示例】:?數(shù)據(jù)區(qū)起始扇區(qū)號(hào)?=?38?+?7541*2?=?15120?
為了避免根目錄被更改,也可以用下面的計(jì)算公式計(jì)算出根目錄扇區(qū):
????根目錄起始扇區(qū)=保留扇區(qū)數(shù)+FAT×2+(根目錄起始簇-2)x每簇的扇區(qū)數(shù)。
說明:1、如果要得到物理地址,需要加上MBR保留區(qū)域大小。
2.2.3.2?根目錄的短文件目錄項(xiàng)定義
目錄所在的扇區(qū),都是以32?Bytes劃分為一個(gè)單位,每個(gè)單位稱為一個(gè)目錄項(xiàng)(Directory?
Entry?),即每個(gè)目錄項(xiàng)的長度都是32?Bytes?。根目錄由若干個(gè)目錄項(xiàng)組成,一個(gè)目錄項(xiàng)占用32個(gè)字節(jié),可以是長文件名目錄項(xiàng)、文件目錄項(xiàng)、子目錄項(xiàng)等。32字節(jié)的具體定義如下圖:
圖12
示例:
圖13
特別關(guān)注的參數(shù)說明:
【1】:文件或者文件夾存儲(chǔ)的起始簇號(hào),上圖中紫色區(qū)域,偏移地址:0x14-0x15(高16為)和0x1A-0x1B(低16位),0x?00?00?00?03?,表示這個(gè)文件存儲(chǔ)在3號(hào)簇的位置,在FAT表中為3號(hào)表項(xiàng)。
【2】:文件大小:偏移地址0x1C-0x1F,0x?00?00?20?EE(8430字節(jié));
【3】文件屬性:偏移地址0x0B-0x0B,0x20?,歸檔。
其他說明:
【0】子目錄存儲(chǔ)在數(shù)據(jù)區(qū)
【1】文件名的第一個(gè)字節(jié),為0xE5,表示該項(xiàng)已被刪除。
【2】名字為0x2E(“.”),表示當(dāng)前目錄。
?
圖14
【3】名字為0x2E?0x2E(“.?.”),表示上一級(jí)目錄。
?
2.2.3.3?長文件目錄定義
圖15
?
點(diǎn)擊鏈接下載本文的pdf版:http://download.csdn.net/detail/mjx91282041/5348397
?
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的SD卡中FAT32文件格式快速入门(图文详细介绍)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何让一个类可以被foreach枚举?
- 下一篇: Keepalived实现LVS-DR双机