中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
圖文并茂 USB Mass Storage FAT文件系統(tǒng)徹底剖解(一)
圖文并茂 USB Mass Storage FAT文件系統(tǒng)徹底剖解(一) 發(fā)布時(shí)間:2010-09-20 12:55:05
技術(shù)類別:嵌入式
需要確認(rèn)注冊(cè)郵箱后才能下載,立即確認(rèn)我的郵箱
本文將以詳解的圖片和文字對(duì)比描述FAT文件系統(tǒng)的基本構(gòu)架細(xì)節(jié)。這是本人自己的學(xué)習(xí)筆記。希望大家能參照?qǐng)D片與文字(文中涉及的一些具體的數(shù)字請(qǐng)仔細(xì)留意一下),這將有利于你更深入的了解文件系統(tǒng)的簡(jiǎn)單構(gòu)架,跟著我的思路往下理順,相信對(duì)大家會(huì)有所收獲。
關(guān)于底層單片機(jī)的U盤固件程序在此就不談了,這里只涉及上層文件系統(tǒng)部分。如果后面有時(shí)間,我再發(fā)貼上來。
本例在LPC1768內(nèi)存中開辟8K字節(jié)作為整個(gè)U盤文件系統(tǒng)緩沖區(qū)。通過USB接口向主機(jī)發(fā)送USB設(shè)備描述符,接口描述符,端點(diǎn)描述符,配置描述符。。。。。Bulk Only(批量傳輸)模式響應(yīng)主機(jī)發(fā)送的CBW(Command Block Wrapper,即命令塊包),將設(shè)備枚舉為USB 海量存儲(chǔ)設(shè)備(USB Mass Storage Class)。關(guān)于具體細(xì)節(jié)不屬于本文的范疇,大家可以參考具體的USB協(xié)議,USB Mass Storage Class協(xié)議或是其他朋友寫的文章。。。。。。
成功枚舉后,在電腦上將會(huì)看到如圖1所示的硬盤圖標(biāo),在我的電腦上是P盤。
圖 1
(在寫這里的時(shí)候,本人著實(shí)郁悶了半天,U盤插到我筆記本上WIN7時(shí),是完整的空盤,而插到臺(tái)式機(jī)上時(shí)就顯示已使用空間1KB。起初懷疑是單片機(jī)程序中硬盤鏡像的FAT表有問題,弄了半天,最后用WinHex查看從臺(tái)式機(jī)取下的U盤數(shù)據(jù),發(fā)現(xiàn)里面被塞了兩個(gè)文件,這下明白了,臺(tái)式機(jī)有病毒,插上去就生成了兩個(gè)文件。剛好占用兩個(gè)扇區(qū)。所以在調(diào)試任何程序時(shí),有些細(xì)節(jié)是蠻折騰人的。)
容量為6.00KB, 可用空間6.00KB。按道理我的硬盤應(yīng)該有8KB才對(duì),因?yàn)槲以趩纹瑱C(jī)內(nèi)存中開辟了8KB。但為何會(huì)少了2KB呢?這個(gè)問題在看完后面之后你就會(huì)明白。
此時(shí)U盤里無任何文件數(shù)據(jù),是一張空盤。
接下來用WinHex打開此盤,大家將會(huì)看到以下一些數(shù)據(jù)圖片。
首先是前512字節(jié),也就是“扇區(qū)0”
圖 2
注意左邊的一些信息,此U盤的大小為8K字節(jié),(分為16個(gè)扇區(qū) × 512字節(jié))。也就是共有16個(gè)扇區(qū)。和我內(nèi)存中開辟的緩沖區(qū)大小一致。但空閑的僅為6K字節(jié),也就是說有2KB(即4個(gè)扇區(qū))的容量被占用了。它們分別是:
圖 3
DBR區(qū)           占用0 扇區(qū)。
FAT1表          占用 1 2 兩個(gè)扇區(qū)
FAT2表          無
根目錄            占用 3 扇區(qū)
數(shù)據(jù)區(qū)            占用 4------15 扇區(qū)
DBR區(qū)(DOS BOOT RECORD)即操作系統(tǒng)引導(dǎo)記錄區(qū)的意思,通常占用分區(qū)的 第 0 扇區(qū)共 512 個(gè)字節(jié)(特殊情況也要占用其它保留扇區(qū),我們先說第 0 扇)。在這 512 個(gè)字節(jié)中,其實(shí)又是由跳轉(zhuǎn)指令,廠商標(biāo)志和操作系統(tǒng)版本號(hào),BPB(BIOS Parameter Block),擴(kuò)展BPB,os引導(dǎo)程序,結(jié)束標(biāo)志幾部分組成。
圖 4
表 1
JUMP
圖 2列出的偏移0x00-0x02的跳轉(zhuǎn)指令“EB 3C 90“,清楚地指明了引導(dǎo)代碼的偏移位置?!癹ump 3CH“加上跳轉(zhuǎn)指令所需的位移量2,即開始于0x3E。此段指令在不同的操作系統(tǒng)上和不同的引導(dǎo)方式上,其內(nèi)容也是不同的。
廠商標(biāo)志
跳轉(zhuǎn)指令之后是8 字節(jié)長(zhǎng)的OEM ID,它是一個(gè)字符串,OEM ID標(biāo)識(shí)了格式化該分區(qū)的操作系統(tǒng)的名稱和版本號(hào)。為了保留與MS-DOS的兼容性,通常Windows格式化該盤是在FAT16磁盤上的該字段中記錄了“MSDOS5.0”,如圖2所示。
和擴(kuò)展BPB
BPB(BIOS Parameter Block)參數(shù)塊記錄著本分區(qū)的起始扇區(qū)、結(jié)束扇區(qū)、文件存儲(chǔ)格式、硬盤介質(zhì)描述符、根目錄大小、FAT個(gè)數(shù)、分配單元(也稱之為簇)的大小等重要參數(shù)。如表2所示
表2  FAT16分區(qū)的BPB字段
表2  FAT16分區(qū)的BPB字段
字節(jié)位移
字段長(zhǎng)度(字節(jié))
例 值
名稱、定義和描述
0x0B
2
00 02
扇區(qū)字節(jié)數(shù)(Bytes Per Sector) 硬件扇區(qū)的大小。本字段合法的十進(jìn)制值有512、1024、2048和4096。對(duì)大多數(shù)磁盤來說,本字段的
值為512
0x0D
1
01
每簇扇區(qū)數(shù)(Sectors Per Cluster) 一個(gè)簇中的扇區(qū)數(shù)。由于FAT16文件系統(tǒng)只能跟蹤有限個(gè)簇(最多為65536個(gè))。因此,通過增加每簇的扇區(qū)數(shù)可以支持最大分區(qū)數(shù)。分區(qū)的缺省的簇的大小取決于該分區(qū)的大小。本字段合法的十進(jìn)制值有 1、2、4、8、16、32、64和128。導(dǎo)致簇大于32KB(每扇區(qū)字節(jié)數(shù)*每簇扇區(qū)數(shù))的值會(huì)引起磁盤錯(cuò)誤和軟件錯(cuò)誤
0x0E
2
01 00
保留扇區(qū)數(shù)(Reserved Sector) 第一個(gè)FAT開始之前的扇區(qū)數(shù),包括引導(dǎo)扇區(qū)。
0x10
1
01
FAT數(shù)(Number of FAT)該分區(qū)上FAT的副本數(shù)。本字段的值一般為2
0x11
2
10 00
根目錄項(xiàng)數(shù)(Root Entries) 能夠保存在該分區(qū)的根目錄文件夾中的32個(gè)字節(jié)長(zhǎng)的文件和文件夾名稱項(xiàng)的總數(shù)。在一個(gè)典型的硬盤上,本字段的值為512。其中一個(gè)項(xiàng)常常被用作卷標(biāo)號(hào)(Volume Label),長(zhǎng)名稱的文件和文件夾每個(gè)文件使用多個(gè)項(xiàng)。文件和文件夾項(xiàng)的最大數(shù)一般為511,但是如果使用的長(zhǎng)文件名,往往都達(dá)不到這個(gè)數(shù)。
0x13
2
10 00
小扇區(qū)數(shù)(Small Sector) 該分區(qū)上的扇區(qū)數(shù),表示為16位(<65536)。對(duì)大于65536個(gè)扇區(qū)的分區(qū)來說,本字段的值為0,而使用大扇區(qū)數(shù)來取代它。
0x15
1
F8
媒體描述符( Media Descriptor)提供有關(guān)媒體被使用的信息。值0xF8表示硬盤,0xF0表示高密度的3.5寸軟盤。媒體描述符要用于MS-DOS FAT16磁盤,在Windows 2000中未被使用
0x16
2
02 00
每FAT扇區(qū)數(shù)(Sectors Per FAT) 該分區(qū)上每個(gè)FAT所占用的扇區(qū)數(shù)。計(jì)算機(jī)利用這個(gè)數(shù)和FAT數(shù)以及隱藏扇區(qū)數(shù)來決定根目錄在哪里開始。計(jì)算機(jī)還可以根據(jù)根目錄中的項(xiàng)數(shù)(512)決定該分區(qū)的用戶數(shù)據(jù)區(qū)從哪里開始
0x18
2
01 00
每道扇區(qū)數(shù)(Sectors Per Trark)
0x1A
2
01 00
磁頭數(shù)(Number of head)
0x1C
4
00 00 00 00
隱藏扇區(qū)數(shù)(Hidden Sector) 該分區(qū)上引導(dǎo)扇區(qū)之前的扇區(qū)數(shù)。在引導(dǎo)序列計(jì)算到根目錄和數(shù)據(jù)區(qū)的絕對(duì)位移的過程中使用了該值
0x20
4
00 00 00 00
大扇區(qū)數(shù)(Large Sector) 如果小扇區(qū)數(shù)字段的值為0,本字段就包含該FAT16分區(qū)中的總扇區(qū)數(shù)。如果小扇區(qū)數(shù)字段的值不為0,那么本字段的值為0
結(jié)合圖2和表2的數(shù)據(jù)可以得出以下信息:
1. 本U盤的扇區(qū)大小為512字節(jié)
2. 每簇扇區(qū)數(shù)為1,也就是說U盤共有15簇。
3. 保留扇區(qū)數(shù)為1,也就是說U盤在FAT開始之前僅有一個(gè)引導(dǎo)扇區(qū)。
4. 只有1個(gè)FAT表,占用2個(gè)扇區(qū)。
5. 本U盤共有 16個(gè)扇區(qū),總?cè)萘繛?KB。
6. 每道扇區(qū)1個(gè),磁頭1個(gè),無隱藏扇區(qū)。
在圖2中,偏移0x3E開始的數(shù)據(jù)為操作系統(tǒng)引導(dǎo)代碼。這是由偏移0x00開始的跳轉(zhuǎn)指令所指向的,此段指令在不同的操作系統(tǒng)上和不同的引導(dǎo)方式上,其內(nèi)容也是不同的,這里就不對(duì)引導(dǎo)代碼進(jìn)行探討了,因?yàn)樗婕暗暮芏鄸|西,且本設(shè)計(jì)并沒有使用到它。
扇區(qū)的最后兩個(gè)字節(jié)存儲(chǔ)值為0xAA55的DBR有效標(biāo)志,對(duì)于其他的取值,系統(tǒng)將不會(huì)執(zhí)行DBR相關(guān)指令。
操作系統(tǒng)之所以設(shè)置保留扇區(qū),是為了對(duì)DBR作備份或留待以后升級(jí)時(shí)用。當(dāng)DBR扇區(qū)被破壞導(dǎo)致分區(qū)無法訪問時(shí)??梢杂帽A羯葏^(qū)的備份替換第0扇區(qū)來找回?cái)?shù)據(jù)。在圖2中,DBR偏移量0x0E位置的2個(gè)字節(jié)是0x0001,指明了保留的扇區(qū)數(shù)為1,即第一個(gè)FAT開始之前的扇區(qū)數(shù),它包括引導(dǎo)扇區(qū)。
表和數(shù)據(jù)的存儲(chǔ)原則
FAT(File Allocation Table 即文件分配表)是Microsoft在FAT文件系統(tǒng)中用于磁盤數(shù)據(jù)(文件)索引和定位引進(jìn)的一種鏈?zhǔn)浇Y(jié)構(gòu)。它有兩個(gè),為的是備份。假如把磁盤比作一本書,F(xiàn)AT表可以認(rèn)為是相當(dāng)于書中的目錄,而文件就是各個(gè)章節(jié)的內(nèi)容,但FAT表的表示方法與目錄有些不同。
在FAT文件系統(tǒng)中,文件的存儲(chǔ)依照FAT表制定的簇鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu)來進(jìn)行。同時(shí),F(xiàn)AT 文件系統(tǒng)將組織數(shù)據(jù)時(shí)使用的目錄也抽象為文件,以簡(jiǎn)化對(duì)數(shù)據(jù)的管理。
圖5所示給出了此U盤上FAT表的數(shù)據(jù)。
圖5 FAT表
FAT 文件系統(tǒng)之所以有12,16,32 不同的版本之分,其根本在于FAT 表用來記錄任意一簇鏈接的二進(jìn)制位數(shù)。以FAT16為例,每一簇在FAT表中占據(jù)2個(gè)字節(jié)(二進(jìn)制16位)。所以,F(xiàn)AT16最大可以表示的簇號(hào)為0xFFFF,以32K為簇的大小的話,F(xiàn)AT16可以管理的最大磁盤空間為:32KB×65535=2048MB,這就是為什么FAT16不支持超過2GB分區(qū)的原因。
FAT表實(shí)際上是一個(gè)數(shù)據(jù)表,以2個(gè)字節(jié)為單位,我們暫將這個(gè)單位稱為FAT記錄項(xiàng),從圖5中,可以知道,前一個(gè)記錄項(xiàng)(即前兩個(gè)字節(jié))是0xFFF8,它是FAT表的標(biāo)志,通常情況,第1、2個(gè)記錄項(xiàng)用作介質(zhì)描述。從第三個(gè)記錄項(xiàng)開始記錄除根目錄外的其他文件及文件夾的簇鏈情況。根據(jù)簇的表現(xiàn)情況FAT用相應(yīng)的取值來描述,見表1-4。
因?yàn)榇藶榭毡P,所以FAT表記錄中僅有一個(gè)FAT表標(biāo)志 F8 FF。
FAT表的另一扇區(qū)圖,見圖6。
圖6
FAT文件系統(tǒng)的目錄結(jié)構(gòu)其實(shí)是一顆有向的從根到葉的樹,這里提到的有向是指對(duì)于FAT 分區(qū)內(nèi)的任一文件(包括文件夾),均需從根目錄尋址來找到??梢赃@樣認(rèn)為:目錄存儲(chǔ)結(jié)構(gòu)的入口就是根目錄。
FAT 文件系統(tǒng)根據(jù)根目錄來尋址其他文件(包括文件夾),故而根目錄的位置必須在磁盤存取數(shù)據(jù)之前得以確定。FAT文件系統(tǒng)就是根據(jù)分區(qū)的相關(guān)DBR參數(shù)與DBR中存放的已經(jīng)計(jì)算好的FAT表(2 份)的大小來確定的。格式化以后,根目錄的大小和位置其實(shí)都已經(jīng)確定下來了——位置緊隨FAT2之后。但此U盤無FAT2,所以就緊隨FAT1之后,占據(jù)第3扇區(qū)。
FAT文件系統(tǒng)的一個(gè)重要思想是把目錄(文件夾)當(dāng)作一個(gè)特殊的文件來處理,在FAT16中,雖然根目錄地位并不等同于普通的文件或者說是目錄,但其組織形式和普通的目錄(文件夾)并沒有不同。FAT 分區(qū)中所有的文件夾(目錄)文件,實(shí)際上可以看作是一個(gè)存放其他文件(文件夾)入口參數(shù)的數(shù)據(jù)表。其具體存儲(chǔ)原理是:不管目錄文件所占空間為多少簇,一簇為多少字節(jié)。系統(tǒng)都會(huì)以32個(gè)字節(jié)為單位進(jìn)行目錄文件所占簇的分配。這32個(gè)字節(jié)以確定的偏移來定義本目錄下的一個(gè)文件(或文件夾)的屬性,實(shí)際上是一個(gè)簡(jiǎn)單的二維表。這32個(gè)字節(jié)的各字節(jié)偏移定義如表1-5所示。
因?yàn)榇吮P目前為空盤,所以根目錄除了磁盤名稱數(shù)據(jù)外,還無任何文件記錄。在后面會(huì)具體舉例說明。
根目錄扇區(qū)數(shù)據(jù)請(qǐng)看圖7.
圖7
紅色圈出來的32字節(jié),作用是在盤符中顯示名稱“YangYong”。文件名“YangYong”;無擴(kuò)展名;屬性為歸檔卷標(biāo);其它項(xiàng)目全為0。
從第4扇區(qū)到第15扇區(qū)全為數(shù)據(jù)區(qū),見圖8。
圖 8
下面我們通過在U盤中新建一個(gè)文件名為ReadMe.txt的文件來對(duì)比上面空盤,看存儲(chǔ)內(nèi)容發(fā)生了那些變化,幫助大家更好的了解FAT構(gòu)架。
此時(shí)U盤容量變?yōu)?.5KB可用,見圖9
圖9
打開U盤可以看到我們新建的文件,見圖10
圖10
雖然文件只有79個(gè)字節(jié),但卻占據(jù)了512個(gè)字節(jié),也就是一個(gè)扇區(qū)的容量。留意一下文件屬性,后面我們會(huì)做對(duì)比。
打開文件,可以看到里面的內(nèi)容,見圖11。
圖 11
用WinHex打開此U盤。扇區(qū)0的數(shù)據(jù)沒有任何變化,而扇區(qū)1也就是FAT1區(qū)的數(shù)據(jù)發(fā)生了變化,如圖12,請(qǐng)此圖與前面的圖5對(duì)比看
圖 12
FAT1區(qū)多了兩個(gè)字節(jié),即“FF FF”表示此文件僅占一個(gè)扇區(qū)就結(jié)束了。
扇區(qū)2的數(shù)據(jù)也沒有任何變化,
而扇區(qū)3作為根目錄區(qū),已經(jīng)發(fā)生了變化,如圖13,請(qǐng)與前面的圖7對(duì)比看。
圖13
紅色圈起來的部分,為新增加的內(nèi)容,下面具體分析一下其含義。
圖14
1. “52 45 41 44 4D 45 20 20” 為文件名的ASCII碼,字符串為“ReadMe”。
2. “54 58 54” 為擴(kuò)展名“txt”。
3. “20” 表示此文件屬性為歸檔。
4. “00” 系統(tǒng)保留
5. “2C” 創(chuàng)建時(shí)間的10毫秒位
6. “B2 9A” 文件創(chuàng)建時(shí)間
時(shí)間 =小時(shí)*2048+分鐘*32+秒/2 =19×512 + 21×32 +36/2 =0x9AB2
7. “33 3D” 文件創(chuàng)建日期
日期 =(年份-1980)*512+月份*32+日 =(2010 -1980)×512 +9×32 +19 =0x3D33
8. “33 3D” 文件最近訪問日期
日期 =(年份-1980)*512+月份*32+日 =(2010 -1980)×512 +9×32 +19 =0x3D33
9. “00 00” 文件起始簇號(hào)高16位
10. “A4 9A” 文件最近修改時(shí)間
時(shí)間 =小時(shí)*2048+分鐘*32+秒/2 =19×512 + 21×32 +8/2 =0x9AA4
11. “33 3D” 文件最近修改日期
日期 =(年份-1980)*512+月份*32+日 =(2010 -1980)×512 +9×32 +19 =0x3D33
12. “02 00” 文件起始簇號(hào)為 0002 即 第二簇
13. “4F 00 00 00” 文件長(zhǎng)度為0x4F 即79個(gè)字節(jié)。
文章部分內(nèi)容參考了http://blog.csdn.net/menghnhhuan/archive/2009/06/15/4270168.aspx,在此表示感謝!
第一次論壇發(fā)貼,著實(shí)耗時(shí),初淺之極,不妥之處在所難免。。。。。。。
下面順便上傳一個(gè)查看工具和此文中用到的U盤數(shù)據(jù)文件
下一節(jié),將以一個(gè)32MB的TF卡的實(shí)例更深入的探討FAT文件構(gòu)造的數(shù)據(jù)組織形式。請(qǐng)?jiān)L問http://blog.ednchina.com/singlechip/
附件:
c4386c65-3e9c-47ad-817b-0c732f4562d7.rar 下載次數(shù): 225
ceacf04e-4da7-4d9c-89d1-e94e08baeab1.rar 下載次數(shù): 183
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
FAT文件系統(tǒng)原理+FAT32文件系統(tǒng)學(xué)習(xí)+FAT32 FAT區(qū)__FAT表解析
Windows文件系統(tǒng)分析
FAT32文件系統(tǒng)解析
硬盤數(shù)據(jù)恢復(fù)入門教程(邏輯盤BPB表篇)
FAT32文件系統(tǒng)的存儲(chǔ)組織結(jié)構(gòu)(一)
FAT系統(tǒng)簡(jiǎn)介
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服