李文華,徐國洪,胡華文
(仙桃職業(yè)學院機械電子工程學院,湖北 仙桃 433000)
基于FAT32文件系統(tǒng)的SD卡數據存儲結構研究
李文華,徐國洪,胡華文
(仙桃職業(yè)學院機械電子工程學院,湖北 仙桃 433000)
SD卡是嵌入系統(tǒng)中首選的外部數據存儲器,為使嵌入式系統(tǒng)中存儲在SD卡上的數據可以被計算機識別和處理,詳細討論了基于FAT32文件系統(tǒng)的SD卡中主引導記錄區(qū)、引導扇區(qū)、文件分配表區(qū)、文件目錄表區(qū)和文件數據區(qū)的數據存儲結構,并給出了各區(qū)域的訪問方法。
SD卡;FAT32;文件系統(tǒng);數據存儲
SD卡是一種外部存儲器,具有體積小、容量大、功耗低、非易失等特點,廣泛地應用于嵌入式系統(tǒng)中,作海量數據存儲之用。運用SD卡存儲數據時,一般是采取基于文件系統(tǒng)的方式存儲數據,以便保存在SD卡中的數據可被計算機直接訪問和處理,高容量的SD卡一般選用FAT32文件系統(tǒng)。下面,筆者詳細地討論基于FAT32文件系統(tǒng)的SD卡數據存儲結構。
圖1 SD卡數據存儲結構
用FAT32格式對SD卡格式化后,SD卡被劃分為主引導記錄區(qū)、隱藏扇區(qū)、引導扇區(qū)、保留扇區(qū)、文件分配表(FAT)區(qū)和數據區(qū)6部分,這6部分的起始位置固定。其中,數據區(qū)又分為文件目錄表(FDT)區(qū)和文件的數據區(qū)2部分,這2部分分散地分布在數據區(qū)中,它們的起始位置隨著文件的建立而隨機分配。基于FAT32文件系統(tǒng)的SD卡數據存儲結構如圖1所示。其中,主引導記錄區(qū)、隱藏扇區(qū)、引導扇區(qū)、保留扇區(qū)這4個區(qū)域是以扇區(qū)為單位進行分配的,文件分配表區(qū)、文件目錄表區(qū)、文件的數據區(qū)這3個區(qū)域是以簇為單位進行分配的,1簇由若干個扇區(qū)組成,其扇區(qū)數由引導扇區(qū)中偏移地址0DH單元的內容給定。
基于FAT32文件系統(tǒng)的SD卡中,文件的數據區(qū)用來存放文件的內容,文件的內容是以簇為單位按鏈式結構存放的;文件目錄表(FDT)用來存放文件的文件名、文件大小、文件內容存放的起始位置(起始簇的簇號)等信息;文件分配表(FAT)用來存放文件所分配簇的簇號。SD卡中,引導扇區(qū)中記錄了FAT的起始位置、FAT的大小和個數、SD卡中的簇的大小、數據區(qū)的起始位置等FAT32文件系統(tǒng)的訪問信息;主引導記錄區(qū)中保存著引導扇區(qū)的起始位置和SD卡的容量大小。
FAT32文件系統(tǒng)的訪問參數保存在主引導記錄區(qū)和引導扇區(qū)中,這2個區(qū)域的大小都是1扇區(qū)(512字節(jié))。其中主引導記錄區(qū)是SD卡的0扇區(qū),其物理扇區(qū)地址為0扇區(qū),共有11個字節(jié)與文件系統(tǒng)的訪問相關,其作用如表1所示。引導扇區(qū)也叫邏輯0扇區(qū),其扇區(qū)地址存放在物理0扇區(qū)的1C6H~1C9H單元中。引導扇區(qū)中,FAT32文件系統(tǒng)的配置信息如表2所示。
表1 主引導記錄區(qū)中與訪問文件系統(tǒng)相關的信息
表2 引導扇區(qū)中FAT32文件系統(tǒng)的配置信息
文件分配表(FAT)的功能是保存每個文件所分配簇的簇號,FAT32文件系統(tǒng)的簇號為32位的二進制數,需用4個字節(jié)的存儲單元保存。每個簇號對應文件分配表上的一個點,第i簇(i=0、1、2、…)在文件分配表上的偏移地址為4i、4i+1、4i+2、4i+3,這4個字節(jié)單元存儲的是文件的下一簇的簇號(這4個單元的內容叫簇項值)。其中,文件最后一個簇號的簇項值是文件結束標記0FFFFFFFH,文件分配表的存儲結構如圖2所示。SD卡的第0簇、第1簇為保留簇(文件分配表占用了這2個簇),從第2簇開始的簇為可用簇。第0簇的簇項值固定為0FFFFFF8H,第1簇的簇項值固定為0FFFFFFFH。
圖2 文件分配表的存儲結構
一個文件的所有簇的簇號按其先后順序排列就構成了該文件的簇號鏈。設某個文件的內容依次存放在第i簇、第j簇、第k簇、…、第m簇中(第i簇為文件的起始簇,第m簇為文件的最后一簇,文件的簇號鏈為i→j→k→……→m),文件的簇號鏈存儲方法是:起始簇號i保存在文件目錄表(FDT)中,其他簇號保存在文件分配表中。在文件分配表中,第i簇的地址單元(4i~4i+3)中保存文件的第2簇的簇號j,j簇的地址單元(4j~4j+3)中保存文件的第3簇的簇號k,…,第m簇的地址單元(4m~4m+3)中保存文件的結束標志0FFFFFFFH,如圖3所示。
圖3 文件的簇號鏈
文件目錄表位于數據區(qū)中,分為根目錄表和子目錄表2類,它們的結構相同,都是由若干個目錄登記項組成,每個目錄登記項對應一個文件或者目錄,用來保存文件或者目錄的名字以信文件內容或者子目錄表存放的起始位置等信息。FAT32文件系統(tǒng)的目錄登記項分為短文件名目錄登記項和長文件名目錄登記項2種,文件目錄表的結構如圖4所示。
圖4 文件目錄表的結構
短文件名目錄登記項由32字節(jié)組成,這32字節(jié)的定義如圖4右邊部分所示。
長文件名目錄登記項由1個短文件名目錄登記項和若干個目錄碎片登記項組成。其中,短文件名目錄登記項存放文件名開始幾個字符的ASCII碼(若文件名為漢字,則是存放漢字的內碼,下同。)、文件的擴展名、屬性、創(chuàng)建時間和日期、起始簇、文件大小等信息。目錄碎片登記項用來存放長文件名(含文件的主文件名、園點、文件擴展名,下同)字符的Unicode編碼以及目錄碎片的順序號,每個目錄碎片登記項32個字節(jié),存放13個Unicode編碼。目錄碎片登記項的定義如圖4左邊部分所示。
目錄碎片登記項的個數與長文件名的字符數相關。設長文件名的字符數為m(每個漢字計1個字符,若無擴展名,則不計園點),則目錄碎片登記項的個數為:
n個目錄碎片登記項按照第n-1、n-2、…、1、0個目錄碎片登記項的順序依次連續(xù)地存放長文件名字符的Unicode編碼。第n-1個目錄碎片登記項存放的是最開始的13字符的Unicode編碼,第0個目錄碎片登記項中存放的是最后m%13個字符的Unicode編碼。第0個目錄碎片登記項的00H(碎片順序號)單元的內容為40H+n。第i個(i≠0)目錄碎片登記項的00H單元的內容為目錄碎片登記項的編號i。
圖5 目錄樹型結構
FAT32文件系統(tǒng)的目錄呈樹型結構,如圖5所示。目錄表中,子目錄登記項的簇項域的內容為子目錄表的簇號。在子目錄表中,第1個目錄登記項為當前目錄登記項,其名字域的內容為字符“·”,簇號域的內容是當前目錄的簇號;第2個目錄登記項為當前目錄的父目錄登記項,其名字域的內容為字符“…”,簇號域的內容是父目錄的簇號。子目錄登記項、父目錄登記項用于目錄的檢索和回溯。
根據圖1所示的SD卡數據存儲結構圖和表1、表2中的參數,可以計算出SD卡中各區(qū)域的扇區(qū)地址。主引導記錄區(qū)的扇區(qū)地址固定為0000H,讀主引導記錄區(qū)中偏移地址1C6H~1C9H單元的內容就可以獲得引導扇區(qū)的地址BootSector。讀引導扇區(qū)的內容,就可以獲得表2中各參數,并計算出文件分配表1的扇區(qū)地址、根目錄的扇區(qū)地址、數據區(qū)任意簇的扇區(qū)地址。
文件分配表1的扇區(qū)地址SectorOfFAT1的計算方法如下:
SectorOfFAT1=BootSector+ReservedSectors
根目錄的扇區(qū)地址SectorOfRootDir的計算方法如下:
數據區(qū)中第n簇的扇區(qū)地址SectorOfDataClustor的計算方法如下:
計算機是以文件的形式訪問存儲介質上的數據的,掌握基于FAT32文件系統(tǒng)的SD卡數據存儲結構,有利于實現在嵌入式系統(tǒng)中按文件系統(tǒng)的格式要求在SD卡中存儲數據,從而實現在嵌入式系統(tǒng)中保存在SD卡上的數據可被計算機直接訪問和處理。
[1]吳萬釗,黃占江,宋涵.計算機病毒防治大全[M].北京:學苑出版社,1994.
[2]戴士劍,涂彥輝.數據恢復技術[M].第2版.北京: 電子工業(yè)出版社,2007.
[3]劉偉.數據恢復技術深度揭秘[M].北京:電子工業(yè)出版社,2010.
[編輯] 洪云飛
10.3969/j.issn.1673-1409(N).2012.06.034
TP393
A
1673-1409(2012)06-N0102-03