新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于Flash存儲(chǔ)器的嵌入式文件系統(tǒng)設(shè)計(jì)

基于Flash存儲(chǔ)器的嵌入式文件系統(tǒng)設(shè)計(jì)

作者: 時(shí)間:2012-04-06 來源:網(wǎng)絡(luò) 收藏



內(nèi)存中的文件節(jié)點(diǎn)不包含文件真正的數(shù)據(jù),而使用指針。文件被打開時(shí),在內(nèi)存中創(chuàng)建一塊新存儲(chǔ)區(qū)域存放數(shù)據(jù),數(shù)據(jù)指針便指向此存儲(chǔ)區(qū),未被打開時(shí),此指針指向空。 對(duì)于每個(gè)目錄有1 個(gè)目錄層數(shù),表示此目錄的深度,如根目錄的目錄層數(shù)為0 ,根目錄的下一級(jí)目錄則為1 ,依此類推。 存儲(chǔ)地址保存文件或目錄在 中的地址。文件和目錄都被存在上一級(jí)目錄下,所屬目錄指針即指向上一級(jí)目錄在內(nèi)存中的數(shù)據(jù)結(jié)構(gòu),根目錄的所屬目錄指針即為空。對(duì)于同目錄下的不同節(jié)點(diǎn),在內(nèi)存中使用鏈表將其串聯(lián),同目錄文件指針即聯(lián)成鏈表。 鏈表的首指針保存在上一級(jí)目錄中,首目錄項(xiàng)指針即指向鏈表的首項(xiàng)。為提高塊擦寫的效率,存儲(chǔ)在同一個(gè)可擦寫塊中的各個(gè)節(jié)點(diǎn)在內(nèi)存中也建立一個(gè)鏈表,塊隊(duì)列指針即用于連成此鏈表。為標(biāo)識(shí)被修改的節(jié)點(diǎn),利用一個(gè)未保存隊(duì)列,未保存隊(duì)列指針即用來建立此隊(duì)列。

載入(mount ) 時(shí),首先順序掃描 中的每個(gè)索引節(jié)點(diǎn),查找出最大的索引節(jié)點(diǎn)更新號(hào),此更新號(hào)對(duì)應(yīng)的索引節(jié)點(diǎn)即為最新的索引節(jié)點(diǎn)。查找到最新索引節(jié)點(diǎn)后,將簇狀態(tài)表等信息映射到內(nèi)存的數(shù)據(jù)結(jié)構(gòu)中。依據(jù)索引節(jié)點(diǎn)中的根目錄信息,遍歷所有節(jié)點(diǎn),建立內(nèi)存中的目錄文件結(jié)構(gòu),并將節(jié)點(diǎn)添加到對(duì)應(yīng)的擦寫塊隊(duì)列中。 對(duì)一個(gè)文件編輯并保存的過程見圖6。


文件打開時(shí),先在內(nèi)存中分配一塊空間作為數(shù)據(jù)區(qū),將內(nèi)容寫入,并定位文件節(jié)點(diǎn)的數(shù)據(jù)指針指向該內(nèi)存中的數(shù)據(jù)區(qū)。如果文件內(nèi)容被修改,就將文件節(jié)點(diǎn)添加到未存盤隊(duì)列,依次寫入 中,并修改簇狀態(tài)表。 保存時(shí)將內(nèi)存中數(shù)據(jù)區(qū)內(nèi)容寫入Flash 中,釋放申請(qǐng)的內(nèi)存空間,修改節(jié)點(diǎn)中的數(shù)據(jù)指針和簇狀態(tài)表,再將文件的所有上級(jí)目錄重新寫入Flash ,最后將更新后的索引節(jié)點(diǎn)內(nèi)容寫入Flash。如果文件未被修改,則只需修改數(shù)據(jù)指針即可。

節(jié)點(diǎn)加入未存盤隊(duì)列的順序按照目錄層數(shù)的大小排列,文件節(jié)點(diǎn)排在隊(duì)列首,目錄層數(shù)最大的排在其后,目錄層數(shù)為1 的排在隊(duì)列末尾,根目錄不加入未存盤隊(duì)列。

特殊處理機(jī)制

均衡擦寫機(jī)制 

為了避免任意一個(gè)可擦除塊因擦寫次數(shù)過多而過早報(bào)廢,對(duì)Flash擦寫時(shí)采用了均衡擦寫機(jī)制。 考慮到系統(tǒng)的精簡(jiǎn)性,擦寫在整片F(xiàn)lash 的各塊中依次進(jìn)行,一塊擦寫完后,下一個(gè)被擦寫的塊即為后一個(gè)塊,在系統(tǒng)的索引節(jié)點(diǎn)中保存了下一個(gè)要擦除的塊號(hào)。當(dāng)文件系統(tǒng)中的剩余空間減少到設(shè)定值時(shí),系統(tǒng)會(huì)擦除此塊,以回收臟簇占用的空間。對(duì)應(yīng)每個(gè)可擦寫塊都有一個(gè)節(jié)點(diǎn)隊(duì)列,此塊中包含的節(jié)點(diǎn)都加入其中。塊擦除的流程見圖7。

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉