天天看點

FAT32檔案系統結構詳解1. SD卡中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分區的硬碟為例加以說明:
    FAT32檔案系統結構詳解1. SD卡中FAT32檔案系統快速入門
  • 主引導扇區包括主引導記錄(446bytes),4個DPT(Disk partition table硬碟分區表)(4*16=64bytes),分區有效标志0x55AA
  • 擴充分區中的每個邏輯驅動器都存在一個類似于MBR的擴充引導記錄EBR。擴充引導記錄包括一個擴充分區表和該扇區的标簽。如果磁盤上沒有擴充分區,那麼就不會有擴充引導記錄和邏輯驅動器。第一個邏輯驅動器的擴充分區表中的第一項指向它自身的引導扇區。第二項指向下一個邏輯驅動器的EBR。如果不存在進一步的邏輯驅動器,第二項就不會使用,而且被記錄成一系列零。如果有附加的邏輯驅動器,那麼第二個邏輯驅動器的擴充分區表的第一項會指向它本身的引導扇區。第二個邏輯驅動器的擴充分區表的第二項指向下一個邏輯驅動器的EBR。擴充分區表的第三項和第四項永遠都不會被使用。 

    關于擴充分區,如下圖所示,擴充分區中邏輯驅動器的擴充引導記錄是一個連接配接表。該圖顯示了一個擴充分區上的三個邏輯驅動器,說明了前面的邏輯驅動器和最後一個邏輯驅動器之間在擴充分區表中的差異

    FAT32檔案系統結構詳解1. SD卡中FAT32檔案系統快速入門
  • 除了擴充分區上最後一個邏輯驅動器外,擴充分區表的格式在每個邏輯驅動器中都是重複的:第一個項辨別了邏輯驅動器本身的引導扇區,第二個項辨別了下一個邏輯驅動器的EBR。最後一個邏輯驅動器的擴充分區表隻會列出它本身的分區項。最後一個擴充分區表的第二個項到第四個項未被使用

1.2.2. MBR分析

  • MBR放置在硬碟實體位址0的地方。總共512位元組的主引導扇區中,MBR隻占用了其中的446個位元組,另外64個位元組交給了 DPT,最後兩個位元組“55,AA”是分區的結束标志。DPT由4個分區表組成,每個16位元組。下圖為硬碟的MBR圖
FAT32檔案系統結構詳解1. SD卡中FAT32檔案系統快速入門
  • 你的硬碟的MBR引導代碼可能并非這樣。不過即使不同,所執行的功能大體是一樣的
  • 紅色劃線部分即為DPT分區表,詳細定義如下表,僅以第一個分區表為例說明,需要注意的是FAT32檔案系統資料存儲方式為小端位元組序,資料反着看就對了~就像下表中總扇區數一樣
    FAT32檔案系統結構詳解1. SD卡中FAT32檔案系統快速入門

1.2.3. SD卡結構

SD卡是沒有分區的,預設隻有一個分區,使用winhex打開如下

FAT32檔案系統結構詳解1. SD卡中FAT32檔案系統快速入門
  • 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

打開上圖非分區空間,如下:

FAT32檔案系統結構詳解1. SD卡中FAT32檔案系統快速入門
  • 紅色劃線(0x0004A800):相對扇區數,305152,四不四很熟悉?
  • 綠色劃線(0x00E83800):總扇區數,15218688
  • 總空間=總扇區數*每扇區位元組數=15218688*512=7791968256,winhen顯示的總位元組數為7948206080差不多啦~~~

1.2.5. SD卡存儲結構

SD卡檔案系統并不是處在整個SD卡最開始的地方,它處在MBR所處的保留區之後,于是我們可以對使用FAT32檔案系統的SD卡整體布局給出如下圖示。

FAT32檔案系統結構詳解1. SD卡中FAT32檔案系統快速入門

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個位元組,具體定義如下:

FAT32檔案系統結構詳解1. SD卡中FAT32檔案系統快速入門
  • 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号扇區,結構非常簡單。

FAT32檔案系統結構詳解1. SD卡中FAT32檔案系統快速入門
  • 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表示例

FAT32檔案系統結構詳解1. SD卡中FAT32檔案系統快速入門
  • 綠色劃線: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表結構如下:
FAT32檔案系統結構詳解1. SD卡中FAT32檔案系統快速入門
  • 紅色劃線: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為例說明短檔案目錄項的結構。

FAT32檔案系統結構詳解1. SD卡中FAT32檔案系統快速入門
  • 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