U盤FAT32文件系統


一、FAT文件系統分為四個部分

參考別人的博客

1.http://blog.163.com/ourhappines@126/blog/static/121363154201311811495492/

  1. 保留扇區(引導區)

最開始的位置,第一個保留扇區是引導區。包括基本的文件系統信息,比如它的類型和其它指向其它扇區的指針。通常包括操作系統啟動調用代碼。保留扇區的總數記錄在引導扇區中的一個參數中。

  1. FAT區(文件分配表)

包含兩份文件分配表,分區信息的映射表,指示簇是如何存儲的。

  1. 根目錄區

在根目錄中存儲文件和目錄信息的目錄表。

  1. 數據區域

實際文件和目錄數據存儲的區域。需要注意的是每個簇只能被一個文件占有。

 

主引導記錄(主引導扇區),讀設備時最開始讀這個分區。

  1. MBR(master boot record)MBR 又稱作主引導記錄占用 Boot Sector 的前 446 個字節 ( 0 to 0x1BD ), 存放系統主引導程序 (它負責從活動分區中裝載並運行系統引導程序).
  2. DPT 即主分區表占用 64 個字節 (0x1BE to 0x1FD), 記錄了磁盤的基本分區信息,主分區表分為四個分區項,,每項 16 字節,分別記錄了每個主分區的信息(因此最多可以有四個主分區).
  3. Boot      Record ID 即引導區標記占用兩個字節 (0x1FE      and 0x1FF), 對於合法引導區,它等於 0xAA55,這是判別引導區是否合法的標志。

 

二、主引導扇區(MBR)的具體結構如下圖所示:

Offset

Description

Size

000h

Executable Code (Boots Computer)

446 Bytes

1BEh

1st Partition Entry (See Next Table)

16 Bytes

1CEh

2nd Partition Entry

16 Bytes

1DEh

3rd Partition Entry

16 Bytes

1EEh

4th Partition Entry

16 Bytes

1FEh

Executable Marker (55h AAh)

2 Bytes

 

USB hound 得到的數據

512  IN     fa 31 c0 8e  d8 8e c0 8e  d0 bc 00 7c  fb fc 89 e6  .1..............        55.1.0(2)    

            bf 00 06 b9  00 01 f3 a5  ea dc 06 00  00 10 00 01  ................        55.1.16      

            00 00 7c 00  00 00 00 00  00 00 00 00  00 80 3f 00  ..............?.        55.1.32      

            ff 00 b4 03  1e 0e 1f 3a  16 10 00 74  06 1f ea 36  .......:...t...6        55.1.48      

            e7 00 f0 3d  fb 54 75 05  8c d8 fb eb  1d 80 fc 08  ...=.Tu.........        55.1.64      

            75 1b e8 81  00 8a 36 13  00 fe ce 8b  0e 15 00 86  u.....6.........        55.1.80      

            cd c0 e1 06  0a 0e 11 00  31 c0 f8 eb  65 80 fc 02  ........1...e...        55.1.96      

            72 cb 80 fc  04 77 c6 60  80 cc 40 50  be 00 00 c7  r....w.`..@P....        55.1.112     

            04 10 00 30  e4 89 44 02  89 5c 04 8c  44 06 66 31  ...0..D..\..D.f1        55.1.128     

            c0 66 89 44  0c 88 f0 f6  26 11 00 88  cf 88 eb c0  .f.D....&.......        55.1.144     

            ef 06 81 e1  3f 00 01 c8  48 89 c7 a1  13 00 f7 26  ....?...H......&        55.1.160     

            11 00 f7 e3  01 f8 81 d2  00 00 89 44  08 89 54 0a  ...........D..T.        55.1.176     

            58 30 c0 8a  16 10 00 e8  0c 00 88 26  03 00 61 a1  X0.........&..a.        55.1.192     

            02 00 1f ca  02 00 9c ff  1e 22 00 c3  80 fa 8f 7f  ........."......        55.1.208     

            04 88 16 2d  06 be 87 07  e8 8d 00 be  be 07 31 c0  ...-..........1.        55.1.224     

            b9 04 00 f6  04 80 74 03  40 89 f5 81  c6 10 00 e2  ......t.@.......        55.1.240     

            f2 48 74 02  cd 18 bf 05  00 be 1d 06  c7 44 02 01  .Ht..........D..        55.1.256     

            00 66 8b 46  08 66 89 44  08 b8 00 42  8a 16 2d 06  .f.F.f.D...B..-.        55.1.272     

            cd 13 73 0d  4f 74 49 30  e4 8a 16 2d  06 cd 13 eb  ..s.OtI0...-....        55.1.288     

            d8 a1 fe 7d  3d 55 aa 75  37 fa 66 a1  4c 00 66 a3  ....=U.u7.f.L.f.        55.1.304     

            3f 06 be 13  04 8b 04 48  89 04 c1 e0  06 8e c0 31  ?......H.......1        55.1.320     

            ff be 1d 06  b9 60 00 fc  f3 a5 c7 06  4c 00 17 00  .....`......L...        55.1.336     

            a3 4e 00 fb  8a 16 2d 06  89 ee fa ea  00 7c 00 00  .N....-.........        55.1.352     

            be aa 07 e8  02 00 eb fe  ac 20 c0 74  09 b4 0e bb  ......... .t....        55.1.368     

            07 00 cd 10  eb f2 c3 53  74 61 72 74  20 62 6f 6f  .......Start boo        55.1.384     

            74 69 6e 67  20 66 72 6f  6d 20 55 53  42 20 64 65  ting from USB de        55.1.400     

            76 69 63 65  2e 2e 2e 0d  0a 00 42 6f  6f 74 20 66  vice......Boot f        55.1.416     

            61 69 6c 65  64 00 00 00  ea eb d4 ca  00 00 00 00  ailed...........        55.1.432  第一分區   

硬盤分區表  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  ................        55.1.448  第二分區   

            00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  ................        55.1.464  第三分區   

            00 00 00 00  00 00 00 00  00 00 00 00  00 00 80 04  ................        55.1.480  第四分區

            05 00 0b fe  ff b3 00 01  00 00 80 8c  e8 00 55 aa  ..............U.        55.1.496     

                    過256扇區后是這個分區       *512byte=7.2G

硬盤分區表

地址

字節數

描述

00~00

1

可引導標志0x00不可引導,0x80可引導

01~03

3

分區起始CHS地址

04~04

1

分區類型

05~07

3

分區結束CHS地址

08~0B

4

分區起始LBA地址

0C~0F

4

分區大小扇區數

分區起始CHS地址(U盤可以直接根據扇區,簇來尋址。就不用考慮了)

第一字節用於記錄分區起始磁頭號,第二字節低六位用於記錄分區起始扇區號,用10bit記錄分區起始柱面號:第二個字節的高兩位作為起始柱面的高兩位,第三個字節作為分區起始柱面的低八位。


三、DBR分區,讀文件系統時最開始讀這個分區。

winhex 讀取的數據

         

【1】0x00~0x02:3 個字節,跳轉指令。
【2】0x03~0x0A:8 個字節,文件系統標志和版本號,這里為 MSDOC5.0。

【3】0x0B~0x0C:2 個字節,每扇區字節數,512(0X02 00)。
【4】0x0D~0x0D:1 個字節,每簇扇區數,8(0x08)。
【5】0x0E~0x0F:2 個字節,保留扇區數,2272(0x08 E0)。 加上256(MBR分區)=2528。FAT分區表從邏輯地址2528扇區開始
【6】0x10~0x10:1 個字節,FAT 表個數,2。
【7】0x11~0x12:2 個字節,根目錄最多可容納的目錄項數,FAT12/16 通常為 512。FAT32 不使用此處值,
置 0。
【8】0x13~0x14:2 個字節,扇區總數,小於 32MB 時使用該處存放。超過 32MB 時使用偏移 0x20~0x23 字
節處的 4 字節存放。筆者的 SD 卡容量為 2GB,所以不使用該處,置 0.
【9】0x15~0x15:1 個字節,介質描述符,0xF8 表示本地硬盤。
【10】0x16~0x17:2 個字節,每個 FAT 表的大小扇區數(FAT12/16 使用,FAT32 不使用此處,置 0)。
【11】0x18~0x19:2 個字節,每磁道扇區數,63(0x00 3F)。
【12】0x1A~0x1B:2 個字節磁頭數,255(0x00 FF)。
【13】0x1C~0x1F:4 個字節,分區前已使用扇區數,63(0x00 00 00 3F)。保留區,數據地址要加上這個。

這個數據就是相對於 MBR的地址偏移量,MBR 的扇區地址才是整個U盤(SD卡)的物理扇區號為 0 的那個地址,也就是說文件系統並不是處在整個 U盤(SD) 卡最開始的地方,它處在 MBR所處的保留區之后。U盤批量傳輸數據時,地址是邏輯扇區地址。

【14】0x20~0x23:4 個字節,文件系統大小扇區數,15646657(0x 00 EEBF C1)。
【15】0x24~0x27:4 個字節,每個 FAT 表的大小扇區數,15248(0x 00 00 3B 90)。 7.4M


【16】0x28~0x29:2 個字節,標記。
【17】0x2A~0x2B:2 個字節,版本號。
【18】0x2C~0x2F:4 個字節,根目錄簇號,2。(雖然在 FAT32 文件系統下,根目錄可以存放在數據區的任
何位置,但是通常情況下還是起始於 2 號簇)
【19】0x30~0x31:2 個字節,FSINFO(文件系統信息扇區)扇區號,1。(上圖的標注即用黃色條紋的標注
有誤,請讀者注意)該扇區為操作系統提供關於空簇總數及下一可用簇的信息。
【20】0x32~0x33:2 個字節,備份引導扇區的位置,6。(上圖的標注即用黃色條紋的標注有誤,請讀者注
意)備份引導扇區總是位於文件系統的 6 號扇區。
【21】0x34~0x3F:12 個字節,未使用。
【22】0x40~0x40:1 個字節,BIOS INT 13H 設備號,0x80。(這個我也不知道什么意思☺)
【23】0x41~0x41:1 個字節,未用。
【24】0x42~0x42:1 個字節,擴展引導標志。0x29。
【25】0x43~0x46:1 個字節,卷序列號。通常為一個隨機值。
【26】0x47~0x51:11 個字節,卷標(ASCII 碼),如果建立文件系統的時候指定了卷標,會保存在此。筆
者當時沒有指定卷表,上圖中的 YCY 是后來指定的。
【27】0x52~0x59:8 個字節,文件系統格式的 ASCII 碼,FAT32。
【28】0x5A~0x1FD:410 個字節,未使用。該部分沒有明確的用途。
【29】0x1FE~0x1FF:簽名標志“55 AA”。

 

 

四、文件分配表FAT

  位於保留區后的是 FAT 區,有兩個完全相同的 FAT(File Allocation Table, 文件分配表)表組成。

1.  FAT32 中每個簇的簇地址,是有 32bit(4 個字節)記錄在 FAT 表中。FAT 表中的所有字節位置以4 字節為單位進行划分,並對所有划分后的位置由 0 進行地址編號。0 號地址與 1 號地址被系統保留並存儲特殊標志內容。從 2 號地址開始,每個地址對應於數據區的簇號,FAT 表中的地址編號與數據區中的簇號相同。我們稱 FAT 表中的這些地址為 FAT 表項,FAT 表項中記錄的值稱為 FAT表項值。
2.  當文件系統被創建,也就是進行格式化操作時,分配給 FAT 區域的空間將會被清空,在 FAT1 與FAT2 的 0 號表項與 1 號表項寫入特定值。由於創建文件系統的同時也會創建根目錄,也就是為根目錄分配了一個簇空間,通常為 2 號簇,所以 2 號簇所對應的 2 號 FAT 表項也會被寫入一個結束標記。

3.  如果某個簇未被分配使用,它所對應的 FAT 表項內的 FAT 表項值即用 0 進行填充,表示該 FAT 表項所對應的簇未被分配。

4.  當某個簇已被分配使用時,則它對應的 FAT 表項內的 FAT 表項值也就是該文件的下一個存儲位置的簇號。如果該文件結束於該簇,則在它的 FAT 表項中記錄的是一個文件結束標記,對於 FAT32而言,代表文件結束的 FAT 表項值為 0x0FFFFFFF
5.  如果某個簇存在壞扇區,則整個簇會用 FAT 表項值 0xFFFFFF7 標記為壞簇,不再使用,這個壞簇標記就記錄在它所對應的 FAT 表項中。
6.  由於簇號起始於 2 號,所以 FAT 表項的 0 號表項與 1 號表項不與任何簇對應。FAT32 的 0 號表項值總是“F8FFFF0F”。如上圖所示。
7.  1 號表項可能被用於記錄臟標志,以說明文件系統沒有被正常卸載或者磁盤表面存在錯誤。不過這個值並不重要。正常情況下 1 號表項的值為“FFFFFFFF”或“FFFFFF0F”。
8.  在文件系統中新建文件時,如果新建的文件只占用一個簇,為其分配的簇對應的 FAT 表項將會寫入結束標記。如果新建的文件不只占用一個簇,則在其所占用的每個簇對應的 FAT 表項中寫入為其分配的下一簇的簇號,在最后一個簇對應的 FAT 表象中寫入結束標記。
9.  新建目錄時,只為其分配一個簇的空間,對應的 FAT 表項中寫入結束標記。當目錄增大超出一個
簇的大小時,將會在空閑空間中繼續為其分配一個簇,並在 FAT 表中為其建立 FAT 表鏈以描述它所占用的簇情況。
10.  對文件或目錄進行操作時,他們所對應的 FAT 表項將會被清空,設置為 0 以表示其所對應的簇處於未分配狀態。

 

 

五、根目錄(數據區的第一簇)

 定位一個 FAT32 文件系統的數據起始處,可以通過引導扇區的相關參數計算出來。

1.從引導扇區的偏移 0x0E~0x0F 字節處得到保留扇區。

2.從偏移 0x10 字節處得到 FAT 表的個數。

3.從偏移 0x24~0x27 字節處得到每個 FAT 表的大小扇區數。

4.利用如下公式計算:
保留扇區數 + 每個 FAT 表大小扇區數 × FAT 表個數 = 數據區起始扇區號

256+2272+15248*2=33024

 

計算其他已知簇號的扇區號,還要由引導扇區的偏移 0x0D 字節處查找到每個簇大小扇區數,並使用如下公式計算:
某簇起始扇區號 = 保留扇區數 + 每個 FAT 表大小扇區數 × FAT 表個數 + (該簇簇號 - 2) × 每簇扇區數

 

 

根目錄在文件系統建立時即已被創建,其目的就是存儲目錄(也稱文件夾)或文件的目錄項。每個目錄項的大小為 32 個字節

卷標Kingston

 

接下來是子目錄

前兩個目錄表項 是當前目錄(.)和父目錄 ( .. )

 

 

下面開始介紹目錄項(短文件名目錄項)

  如果文件名不足 8 個字符,用 0x20 進行填充。
  超過 8 個字符時則會被截短,因為短文件名目錄項中沒有足夠的空間記錄超出的部分。截短的方法是取文件名的前 6 個字符加上“~1”(如果有同名文件,則會依次遞增該數值),然后加上其擴展名。
  如果是子目錄,則將擴展名部分用“0x20”進行填充。
為了解決長文件名的問題,FAT 文件系統又增加了一種“長文件名”目錄項結構。其從 windows95 開始,不管文件名的長度是否超過 8 個字符,都會同時為其創建短文件名目錄項和長文件名目錄項,因為短文件名不區分大小寫,而長文件名則是區分大小寫的。

 

 

具體解釋如下:
【1】0x00~0x00:1 個字節,如果該目錄項正在使用中,則為文件名或子目錄名的第一個字符。
  0x00:說明該目錄項未被分配使用。
  0xE5:說明該目錄項曾經被使用過,但是現在已被刪除。目前處於未分配狀態
【2】0x01~0x0A:10 個字節,文件名的第 2 至第 11 個 ASCII 碼,除擴展名外,如果文件的名字不足 8個字符則用 0x20 進行填充。
【3】0x0B~0x0B:1 個字節,所描述文件的屬性
  0x01-只讀
  0x02-隱藏
  0x04-系統文件
  0x08-卷標
  0x0F-為此值時表示該目錄項為長文件名目錄項
  0x10-目錄
  0x20-存檔
【4】0x0C~0x0C:1 字節,保留
【5】0x0D~0x0D:1 個字節,文件穿件的時間,精確到創建時刻的十分之一秒
【6】0x0E~0x0F:2 個字節,文件創建的時間——時分秒 兩個字節的 16bit 被划分為 3 個部分:
  0~4bit 為秒,以 2 秒為單位,有效值為 0~29,可以表示的時刻為 0~58
  5~10bit 為分,有效值為 0~59
  11~15bit 為時,有效值為 0~23

【7】0x10~0x11:2 個字節,文件創立的日期,16bit 也划分為三個部分:
  0~4bit 為日,有效值為 1~31
  5~10bit 為月,有效值為 1~12
  11~15bit 為時,有效值為 0~127,這是一個相對於 1980 年的年數值,也就是說該值加上 1980即為文件創建的日期值。該部分筆者就不再舉例就計算了,原理和計算創建時間是一樣的。請讀者自己去計算。 
【8】0x12~0x13:2 個字節,最后訪問日期。
【9】0x14~0x15:2 個字節,文件起始簇號的高兩個字節。
【10】0x16~0x17:2 個字節,文件最后修改的時間。

 【11】0x18~0x19:2 個字節,文件最后被修改時的日期。
【12】0x1A~0x1B:文件內容起始簇號的低兩個字節,與 0x14~0x15 字節處的高兩個字節組成文件內容起始簇號。
【13】0x1C~0x1F:文件內容大小字節數,只對文件有效,子目錄的目錄項此處全部設置為 0。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM