當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]有了之前讀寫(xiě)block的基礎(chǔ)之后,準(zhǔn)備弄個(gè)文件系統(tǒng),之前沒(méi)有接觸過(guò)這東西,所以有很多都暈暈的,但是看到fat的源代碼之后還是挺有信心的,因?yàn)橹耙恢边^(guò)uboot,所以這個(gè)文件當(dāng)然是小巫見(jiàn)大巫了。首先來(lái)分析一下對(duì)應(yīng)我

有了之前讀寫(xiě)block的基礎(chǔ)之后,準(zhǔn)備弄個(gè)文件系統(tǒng),之前沒(méi)有接觸過(guò)這東西,所以有很多都暈暈的,但是看到fat的源代碼之后還是挺有信心的,因?yàn)橹耙恢边^(guò)uboot,所以這個(gè)文件當(dāng)然是小巫見(jiàn)大巫了。首先來(lái)分析一下對(duì)應(yīng)我的SD的FAT16的相關(guān)信息吧(暫且就這么稱吧,因?yàn)槲乙膊皇呛芰私猓?/p>

一、引導(dǎo)扇區(qū)段

拿比較簡(jiǎn)單的FAT16文件系統(tǒng)來(lái)分析,格式化為FAT16,然后使用Winhex軟件打開(kāi)我的磁盤(pán)驅(qū)動(dòng)器。先貼上一張圖

這上面可以發(fā)現(xiàn)很多有用的信息,首先我們了解一下基本知識(shí),對(duì)于我的SD卡來(lái)說(shuō),從上面的信息可以看出:

1、一個(gè)扇區(qū)定為512字節(jié)。

2、啟動(dòng)扇區(qū)為0扇區(qū),同時(shí)這也是物理扇區(qū)0,但是,從上面可以看出,我的SD卡是沒(méi)有MBR(主引導(dǎo)記錄區(qū))的,所以這個(gè)物理扇區(qū)0也就是我的DBR(系統(tǒng)引導(dǎo)扇區(qū)),也就是所謂的邏輯扇區(qū)0吧(這是我個(gè)人的理解)

補(bǔ)充一下:如果有MBR的,那么MBR為訪問(wèn)的第一個(gè)扇區(qū),該扇區(qū)必須負(fù)責(zé)找到DBR

3、那么下面來(lái)分析一下這個(gè)DBR吧??聪旅嬉粡埍?,就可以知道它的定義了。下面這張表實(shí)在網(wǎng)上找的,所以和我的SD卡描述的不一樣,我把我的SD描述的情況補(bǔ)充在后面。

自然從這個(gè)表上面我們可以獲取如下主要信息:

每扇區(qū)字節(jié)數(shù):0x0200 = 512字節(jié)

每簇扇區(qū)數(shù): 0x20 = 32扇區(qū)

保留扇區(qū)數(shù): 1扇區(qū)

FAT表份數(shù): 0x02 = 2份

根目錄項(xiàng)數(shù): 0x0200 = 512,所以做多能存放的文件或者文件夾數(shù)目 = 512.

每個(gè)FAT表所占的扇區(qū):0x00f3 = 243個(gè)扇區(qū)

FAT表所在的分區(qū)前面隱藏的扇區(qū)數(shù):0x00 = 0,再次驗(yàn)證了我之前的猜測(cè)。沒(méi)有MBR的,只有DBR。

卡的容量(總的扇區(qū)數(shù)): 0x1e5c00 =1989632 ,那么換算成M就是:1989632 * 512B = 971.5M

卡的ID: 0x980b5f1f

FilesysType :0x31544146就是FAT16的ASCII碼。

可執(zhí)行代碼:從0x3c 開(kāi)始的 347和字節(jié)都是可執(zhí)行代碼。

繼續(xù)看表格。

DBR的偏移 0x5A開(kāi)始的數(shù)據(jù)為引導(dǎo)代碼。這是由偏移 0x00 開(kāi)始的跳轉(zhuǎn)指令所指向的。 所列出的偏移 0x00~0x02 的跳轉(zhuǎn)指令"EB 3c 90"清楚地指明了引導(dǎo)代碼的偏移位置。jump 3cH加上跳轉(zhuǎn)指令所需的位移量,即開(kāi)始于 0x3c。此段指令在不同的操作系統(tǒng)上和不同的引導(dǎo)方式上,其內(nèi)容也是不同的。從頭到尾梳理一遍,我們的FAT16文件系統(tǒng)框架就是這樣:

引導(dǎo)扇區(qū)段


字節(jié)位移字節(jié)長(zhǎng)度字段名稱

0x003跳轉(zhuǎn)指令

0x038OEMID

0x0b2BPB

0x2424擴(kuò)展BPB

0x3c448引導(dǎo)代碼

0x1fe4扇區(qū)結(jié)束標(biāo)識(shí)符




二、關(guān)于FAT表

1、FAT 表(File Allocation Table 文件分配表),是 Microsoft 在 FAT 文件系統(tǒng)中用于磁盤(pán)數(shù)據(jù)(文件)索引和定位引進(jìn)的一種鏈?zhǔn)浇Y(jié)構(gòu)。假如把磁盤(pán)比作一本書(shū),F(xiàn)AT 表可以認(rèn)為相當(dāng)于書(shū)中的目錄,而文件就是各個(gè)章節(jié)的內(nèi)容。但FAT 表的表示方法卻與目錄有很大的不同。在 FAT 文件系統(tǒng)中,文件的存儲(chǔ)依照 FAT 表制定的簇鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu)來(lái)進(jìn)行。同時(shí),F(xiàn)AT 文件系統(tǒng)將組織數(shù)據(jù)時(shí)使用的目錄也抽象為文件,以簡(jiǎn)化對(duì)數(shù)據(jù)的管理。

2、FAT16 文件系統(tǒng)從根目錄所占的 32 個(gè)扇區(qū)之后的第一個(gè)扇區(qū)開(kāi)始以簇為單位進(jìn)行數(shù)據(jù)的處理,這之前仍以扇區(qū)為單位。對(duì)于根目錄之后的第一個(gè)簇,系統(tǒng)并不編號(hào)為第 0 簇或第 1 簇 (可能是留作關(guān)鍵字的原因吧),而是編號(hào)為第 2簇,也就是說(shuō)數(shù)據(jù)區(qū)順序上的第 1 個(gè)簇也是編號(hào)上的第 2 簇

3、FAT 文件系統(tǒng)之所以有 12,16,32 不同的版本之分,其根本在于 FAT 表用來(lái)記錄任意一簇鏈接的二進(jìn)制位數(shù)。以 FAT16 為例,每一簇在 FAT 表中占據(jù) 2字節(jié)(二進(jìn)制 16 位)。所以,F(xiàn)AT16 最大可以表示的簇號(hào)為 0xFFFF(十進(jìn)制的65535),以 32K 為簇的大小的話,F(xiàn)AT32 可以管理的最大磁盤(pán)空間為:32KB×65535=2048MB,這就是為什么FAT16 不支持超過(guò) 2GB 分區(qū)的原因。

FAT表記錄了磁盤(pán)數(shù)據(jù)文件的存儲(chǔ)鏈表,對(duì)于數(shù)據(jù)的讀取而言是極其重要的,以至于Microsoft為其開(kāi)發(fā)的FAT文件系統(tǒng)中的FAT表創(chuàng)建了一份備份,就是我們看到的FAT2。FAT2與FAT1的內(nèi)容通常是即時(shí)同步的,也就是說(shuō)如果通過(guò)正常的系統(tǒng)讀寫(xiě)對(duì)FAT1 做了更改,那么FAT2 也同樣被更新。如果從這個(gè)角度來(lái)看,系統(tǒng) 的這個(gè)功能在數(shù)據(jù)恢復(fù)時(shí)是個(gè)天災(zāi)

4、FAT 表實(shí)際上是一個(gè)數(shù)據(jù)表,以 2 個(gè)字節(jié)為單位,我們暫將這個(gè)單位稱為FAT 記錄項(xiàng),通常情況其第 1、2 個(gè)記錄項(xiàng)(前 4 個(gè)字節(jié))用作介質(zhì)描述。從第三個(gè)記錄項(xiàng)開(kāi)始記錄除根目錄外的其他文件及文件夾的簇鏈情況。根據(jù)簇的表現(xiàn)情況 FAT 用相應(yīng)的取值來(lái)描述,特殊情況如下:

5、下面開(kāi)始分析一個(gè)FAT表,我給SD裝入一個(gè)文件,名為BingGe.bin


6、如上圖,F(xiàn)AT表以"F8 FF FF FF" 開(kāi)頭,此2 字節(jié)為介質(zhì)描述單元,并不參與FAT表簇鏈關(guān)系??梢钥闯鍪菢?biāo)識(shí)符和第一簇已被占用的意思。

它的第一個(gè)簇的地址是0x0002。這個(gè)地址從哪里得來(lái)的要看后面的內(nèi)容了,暫且就把它當(dāng)已知條件吧。這也就是說(shuō),在SD卡的第2個(gè)簇里邊存放著dssd.bin的第1個(gè)16K數(shù)據(jù),那么它的第二個(gè)16K放在哪里呢,我們要看FAT表,每2個(gè)簇對(duì)應(yīng)于FAT表中的第4,5個(gè)字節(jié),里邊的內(nèi)容為0003接下來(lái)的第4、5字節(jié)表示 0x0003,這是第2簇,

第6、7字節(jié)表示0x0004,這是第3簇

。。。

。。。

可以發(fā)現(xiàn)總共是到0x000b結(jié)束的。

所以可以推斷出這個(gè)文件占用空間是9個(gè)簇,那么大小= (10*32*512) =163840(簇注意結(jié)束符才算最后一個(gè)簇),那么我們截張圖看一下,占用大小是多少


顯然占用空間也是163840,完全和我們計(jì)算的一樣。那么,我們繼續(xù)跟蹤一下,既然文件是按照簇為單位進(jìn)行存儲(chǔ)的,那么我們的一個(gè)簇是16KB,暫且不管第2個(gè)簇是什么內(nèi)容。因?yàn)槲覀兾募械膬?nèi)容是從第2簇開(kāi)始的,第2簇存放的是0003,數(shù)據(jù)0003表示接下來(lái)的簇是第3簇,以此類推,可以知道第9簇里面的內(nèi)容是000b,接下來(lái)是第b簇也就是結(jié)束簇,至此完成FAT表的初步分析。

三、有關(guān)根目錄

根目錄區(qū)里面放的東西就是根目錄下所見(jiàn)的東西,根據(jù)對(duì)引導(dǎo)扇區(qū)的分析,我們可以找到根目錄區(qū)在第448扇區(qū)內(nèi),如何知道的呢?看一張圖示表


紅色箭頭部分,表示保留扇區(qū),這里我的SD卡是由兩個(gè)保留扇區(qū)的。所以我們的根文件目錄扇區(qū) = (FAT*2)+保留+引導(dǎo)扇區(qū) = 446+1+1 = 448扇區(qū),從0開(kāi)始,也就是第447扇區(qū)。那么我們的根文件目錄就是第448扇區(qū)了。其實(shí),當(dāng)我們了解了整個(gè)結(jié)構(gòu)之后,就能夠通過(guò)winhex來(lái),整體把握這個(gè)FAT的結(jié)構(gòu)了。

1、開(kāi)始貼上根目錄里面的內(nèi)容


FAT16和FAT32每個(gè)文件名都占32個(gè)字節(jié),這里放的是短文件名。但FAT16的根目錄區(qū)只有32個(gè)扇區(qū),計(jì)算一下,每個(gè)扇區(qū)512字節(jié),共32個(gè)扇區(qū),而每個(gè)文件要占用32個(gè)字節(jié),很顯然,根目錄只能放512個(gè)文件了。我們對(duì)照這下面的這個(gè)表格來(lái)提取信息


就看最前面的32字節(jié)吧,它表示了一個(gè)文件(或文件夾),現(xiàn)在對(duì)它分析一下。前11個(gè)字節(jié)是文件名。從后面的ASCII表中可以看出,它就是我寫(xiě)進(jìn)去的那個(gè)名為BingGe.bin。至于為什么會(huì)出現(xiàn)那個(gè)A,我也不得而知了。第0x0B個(gè)字節(jié)內(nèi)容為0x20,可以知道它的屬性為存檔,這與我們從windows中觀察到的它的屬性是一致的。

0x18~0x19 中的日期=(年份-1980)*512+月份*32+日。得出的結(jié)果換
算成 16 進(jìn)制填入即可。也就是:0x18 字節(jié) 0~4 位是日期數(shù);0x18 字節(jié) 5~7 位
和 0x19 字節(jié) 0 位是月份;0x19 字節(jié)的 1~7 位為年號(hào),原定義中 0~119 分別代
表 1980~2099,目前高版本的Windows允許取 0~127,即年號(hào)最大可以到 2107
年。

那么我看看我們的修改日期:3f 89 = 0011111 1100 01001,那么日期為9 ,月份為12月,年份為31+1980 = 2011年,所以修改日期應(yīng)該為2011.12.9,再看看我們的文件


果然是沒(méi)有錯(cuò)的。接著看目錄是怎樣訪問(wèn)的。


可以看到我們的一個(gè)文件夾地址是0x0c那么,跳轉(zhuǎn)到這個(gè)簇去看一看就行了。


前面那個(gè)項(xiàng),一個(gè)是2E,一個(gè)是2E 2E,它倒底是何方神圣,對(duì)照ASCII表,它就是一個(gè)小點(diǎn)“.”。這個(gè)小點(diǎn)什么意思,那第二項(xiàng)就是“..”,有沒(méi)有什么啟發(fā)?——DOS!那個(gè)
古老的操作系統(tǒng)是怎么訪問(wèn)文件夾的?cd ..就是返回上一層目錄。難道是它……?沒(méi)錯(cuò)!就是它,一個(gè)點(diǎn)代表當(dāng)前目錄,兩個(gè)點(diǎn)代表上級(jí)目錄。哈哈??匆幌庐?dāng)前目錄那一項(xiàng),看一下它的地址,000A,就是這個(gè)目錄。而..對(duì)應(yīng)的那一項(xiàng),分析一下地址。00 00,也就是根目錄。所以就可以利用這里找到上一級(jí)目錄,于是就可以實(shí)現(xiàn)一級(jí)一級(jí)目錄的訪問(wèn)了。到這里根目錄也就初步分析完畢了。接下來(lái)準(zhǔn)備開(kāi)始進(jìn)行初步的移植文件系統(tǒng)了。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉