找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5799|回復(fù): 2
收起左側(cè)

FAT32文件系統(tǒng)的一點(diǎn)知識(shí)

[復(fù)制鏈接]
ID:83710 發(fā)表于 2015-6-23 18:41 | 顯示全部樓層 |閱讀模式
FAT32文件系統(tǒng)尋找文件存儲(chǔ)扇區(qū)
自從我做完12864圖像顯示后就在想做個(gè)視頻玩玩,結(jié)果視頻生成的幀需要大量的儲(chǔ)存空間,僅憑那可憐的8KB啥也做不了,于是就開始找一種大容量的存儲(chǔ)器!可是用什么呢?EEPROM是肯定不行的,外部擴(kuò)展也不行,還是信息的力量讓我知道了-------SD卡;
其實(shí)SD卡我不陌生,以前在日照買的MP4用的是1GB SD卡,想到那東西如果可以用的話,那將會(huì)對(duì)我有質(zhì)的飛躍,于是我找了一些資料,通過(guò)看這些資料我開始知道奧原來(lái)SD卡內(nèi)部是有文件系統(tǒng)的!怪不得電腦能讀取他呢!并且這種文件系統(tǒng)在我們的電腦上,手機(jī)上,到處是,平時(shí)我們只是知道:把一首歌考到MP3播放器里的文件夾里,就可以聽了;熟不知這就是文件系統(tǒng)的功勞。≡谖募到y(tǒng)里我看到了FAT32的存在,于是我決定看看到底什么是FAT32文件系統(tǒng)。
開始在看振南寫的關(guān)于FAT32的資料,不行啊,不懂,后來(lái)又在網(wǎng)上找了些資料綜合后找出了尋找FAT32文件的路徑。
打個(gè)比方:現(xiàn)在我在可移動(dòng)磁盤(H)里建一個(gè)文件文件名為EEE.txt,里面寫ABCDE五個(gè)字符,

然后保存;我要在存儲(chǔ)卡里找到這五個(gè)字符怎么實(shí)現(xiàn)呢?
下面是我找到他的過(guò)程:
首先進(jìn)入DBR中找到BPB
這就是SD卡的0扇區(qū),我們要的是BPB,那BPB在哪里?呵呵在從地址字節(jié)0----地址字節(jié)5960字節(jié)數(shù)據(jù);
當(dāng)然在這60字節(jié)里也有大部分是不必要的,真正有用的是一小部分,那這部分是什么呢?
第一:11——12地址字節(jié)的數(shù)據(jù)代表每扇區(qū)字節(jié)數(shù)(上表中為0002)這里數(shù)據(jù)時(shí)小端(數(shù)據(jù)地位在地址高位)表示所以要轉(zhuǎn)換成大端(數(shù)據(jù)地位在地址地位)為0x0200;再轉(zhuǎn)換成十進(jìn)制為512,原來(lái)是這樣,也就是這兩個(gè)字節(jié)告訴我們每扇區(qū)512個(gè)字節(jié);僅此而已!
第二:13地址字節(jié)數(shù)據(jù)代表每簇扇區(qū)數(shù)(上表位08)表示一個(gè)簇有8個(gè)扇區(qū),也就是8*512=4096=4KB;
第三:14——15地址字節(jié)代表保留扇區(qū)數(shù),也就是FAT表是從這里開始的。(上表中為0C11轉(zhuǎn)成0x110C轉(zhuǎn)成十進(jìn)制4364扇區(qū))
到這里引出第一個(gè)關(guān)鍵項(xiàng)
FAT1地址字節(jié)的開始=4364*512=2234368(記好了)
第四:16地址字節(jié)代表FAT表的個(gè)數(shù)(上表位02)表示有2個(gè)FAT
第五:36——37地址字節(jié)代表FAT表占的扇區(qū)數(shù)(上表為7A07轉(zhuǎn)換0X077A轉(zhuǎn)換成十進(jìn)制1914扇區(qū))為了方便起見我們把它轉(zhuǎn)換成字節(jié)形式:1914*512=979968,與其說(shuō)FAT表占了1914個(gè)扇區(qū)不如說(shuō)FAT表占了979968個(gè)字節(jié)
第六:有了FAT1的初始字節(jié),FAT表的長(zhǎng)度,那么根據(jù)FAT32文件系統(tǒng)的結(jié)構(gòu)可知,FAT1表下面是FAT2
FAT2地址字節(jié)=FAT1地址字節(jié)+FAT長(zhǎng)度=2234368+979968=3214336地址字節(jié)
同理FAT2表下面是根目錄則:
根目錄地址字節(jié)= FAT2地址字節(jié)+ FAT長(zhǎng)度=3214336+979968=4194304地址字節(jié)
至此BPB的有效數(shù)據(jù)已經(jīng)讀完了總結(jié)如下:
通過(guò)上面的對(duì)BPB的分析我們知道了原來(lái)一個(gè)扇區(qū)有512個(gè)字節(jié),一個(gè)簇有4KB8個(gè)扇區(qū)),
關(guān)鍵是我們知道了FAT表和根目錄的位置如下:
FAT1開始地址字節(jié):2234368
FAT2開始地址字節(jié):3214336
根目錄開始地址字節(jié):4194304
下面看看我們找的對(duì)不對(duì)?
FAT1:
FAT2:
根目錄:
這樣我們找到了根目錄,FAT表后有什么用那?還是沒找到文件存哪里。拷酉聛(lái)該是找得到文件的存儲(chǔ)位置的時(shí)候了:
第一:我們現(xiàn)在根目錄里找到EEE.TXT如圖:
這就是了:在對(duì)根目錄進(jìn)行解釋
第一行45 45 45 20 20 20 20 20:表示EEEEASCII碼是4520表示空格,即不滿八位空格補(bǔ),54 58 54表示TXT即文件類型,
第二行5-6個(gè)字符01 00表示此文件開始簇的高位地址
第二行10-11個(gè)字符BC 2F表示此文件開始簇低位地址
把這兩個(gè)字節(jié)結(jié)合為一個(gè)四位:0x00012FBC這就是此文件的開始簇,轉(zhuǎn)換成十進(jìn)制為77756
然后你知道了開始簇你還要到FAT表里找到他,看看他占了幾簇!怎么在FAT表里找到他呢?
FAT表里一簇用4個(gè)字節(jié)表示,數(shù)據(jù)是從FAT表中第二個(gè)簇開始的(也就是第9個(gè)字節(jié)向后,前8個(gè)字節(jié)為FAT標(biāo)志)
所以前兩個(gè)簇是無(wú)用的,要用(777562=77754簇,前面說(shuō)了一個(gè)簇用4字節(jié)表示那么我們要找到77754簇的字節(jié)地址就要把它分解成字節(jié)所以有77754*4字節(jié)=311014字節(jié)(也就是在FAT表中第311014字節(jié)是此文件的FAT對(duì)應(yīng)簇),好了這就找到了?沒有還差一步
你要知道FAT1的首地址,好了我知道然后加上311014才是;
所以=FAT1首地址字節(jié)+此文件在FAT表中占得字節(jié)數(shù)=2234368+311014=2545392(此文件的FAT表中的簇)如果這個(gè)文件大于一簇那么必定會(huì)有下一簇,如果這個(gè)文件不到一簇那么這個(gè)我們找到的FAT表中應(yīng)為FF FF FF 0F(結(jié)束標(biāo)志)好了前面我們寫入的是ABCDE怎么會(huì)大于4KB那?顯然我們找到的這個(gè)簇一定是FF FF FF 0F
看看是不是:
果然是FF FF FF 0F;
這其實(shí)是為超過(guò)一簇的文件制作的鏈表,這個(gè)不滿一簇所以就結(jié)束了,如果滿一簇則會(huì)在下一個(gè)FAT表中給出超出一簇的存處地址,一次類推,這也是FAT表的關(guān)鍵用途;
我們這個(gè)繼續(xù),既然FAT表中顯示我們存儲(chǔ)的數(shù)據(jù)不滿一簇我們直接找就行了,根據(jù)FAT32結(jié)構(gòu),可知根目錄下是數(shù)據(jù)區(qū),所以要這樣計(jì)算存數(shù)扇區(qū)的首地址字節(jié)=根目錄+(此文件的簇大小—2FAT表中的前兩個(gè)簇是FAT標(biāo)志,真正的數(shù)據(jù)從第二簇開始所以要減去】)*一簇的字節(jié)數(shù)=4194304+77756-2*4096=322674688
看看我們寫的ABCDE是不是存在這個(gè)地址字節(jié)下了?
看看吧第一行:41 41 43 44 45 正好是ABCDEASCII
現(xiàn)在我敢說(shuō):我在可移動(dòng)磁盤(H)盤下建立的EEE.TXT文件中的ABCDE被保存在H盤的第322674688/512=630224扇區(qū)看看圖:
第二行邏輯扇區(qū)數(shù):630224
至此找到了,真他媽的麻煩啊





回復(fù)

使用道具 舉報(bào)

ID:83710 發(fā)表于 2015-6-23 18:41 | 顯示全部樓層
   最近在做SD卡讀寫,調(diào)了快一星期了總是調(diào)不通,昨天晚上做的時(shí)候,突然讀到兩個(gè)字節(jié),55 AA,正好是最后兩個(gè),那時(shí)部分扇區(qū)的結(jié)束的標(biāo)志,證明我可能讀到了扇區(qū),可是又讀0及其他字節(jié),令我失望,沒有EB,全是00H,而我讀的是0扇區(qū),WINHEX顯示是EB開頭的,要是不對(duì),那55AA哪來(lái)的?而且位置正確,要是對(duì)那怎么找不到EB呢?橫頭疼,所有的都按照時(shí)序來(lái)的,為什么達(dá)不到預(yù)期的結(jié)國(guó)?這么糾結(jié)還是今年的頭一次!加油吧,畢竟這對(duì)我來(lái)說(shuō)意義非常!@
回復(fù)

使用道具 舉報(bào)

ID:926451 發(fā)表于 2021-5-29 10:35 | 顯示全部樓層
講解得很詳細(xì),辛苦了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表