基于Flash存儲器的嵌入式文件系統設計


內存中的文件節點(diǎn)不包含文件真正的數據,而使用指針。文件被打開(kāi)時(shí),在內存中創(chuàng )建一塊新存儲區域存放數據,數據指針便指向此存儲區,未被打開(kāi)時(shí),此指針指向空。 對于每個(gè)目錄有1 個(gè)目錄層數,表示此目錄的深度,如根目錄的目錄層數為0 ,根目錄的下一級目錄則為1 ,依此類(lèi)推。 存儲地址保存文件或目錄在Flash 中的地址。文件和目錄都被存在上一級目錄下,所屬目錄指針即指向上一級目錄在內存中的數據結構,根目錄的所屬目錄指針即為空。對于同目錄下的不同節點(diǎn),在內存中使用鏈表將其串聯(lián),同目錄文件指針即聯(lián)成鏈表。 鏈表的首指針保存在上一級目錄中,首目錄項指針即指向鏈表的首項。為提高塊擦寫(xiě)的效率,存儲在同一個(gè)可擦寫(xiě)塊中的各個(gè)節點(diǎn)在內存中也建立一個(gè)鏈表,塊隊列指針即用于連成此鏈表。為標識被修改的節點(diǎn),利用一個(gè)未保存隊列,未保存隊列指針即用來(lái)建立此隊列。
該文件系統載入(mount ) 時(shí),首先順序掃描Flash 中的每個(gè)索引節點(diǎn),查找出最大的索引節點(diǎn)更新號,此更新號對應的索引節點(diǎn)即為最新的索引節點(diǎn)。查找到最新索引節點(diǎn)后,將簇狀態(tài)表等信息映射到內存的數據結構中。依據索引節點(diǎn)中的根目錄信息,遍歷所有節點(diǎn),建立內存中的目錄文件結構,并將節點(diǎn)添加到對應的擦寫(xiě)塊隊列中。 對一個(gè)文件編輯并保存的過(guò)程見(jiàn)圖6。

文件打開(kāi)時(shí),先在內存中分配一塊空間作為數據區,將內容寫(xiě)入,并定位文件節點(diǎn)的數據指針指向該內存中的數據區。如果文件內容被修改,就將文件節點(diǎn)添加到未存盤(pán)隊列,依次寫(xiě)入Flash 存儲器中,并修改簇狀態(tài)表。 保存時(shí)將內存中數據區內容寫(xiě)入Flash 中,釋放申請的內存空間,修改節點(diǎn)中的數據指針和簇狀態(tài)表,再將文件的所有上級目錄重新寫(xiě)入Flash ,最后將更新后的索引節點(diǎn)內容寫(xiě)入Flash。如果文件未被修改,則只需修改數據指針即可。
節點(diǎn)加入未存盤(pán)隊列的順序按照目錄層數的大小排列,文件節點(diǎn)排在隊列首,目錄層數最大的排在其后,目錄層數為1 的排在隊列末尾,根目錄不加入未存盤(pán)隊列。
嵌入式文件系統特殊處理機制
均衡擦寫(xiě)機制
為了避免任意一個(gè)可擦除塊因擦寫(xiě)次數過(guò)多而過(guò)早報廢,文件系統對Flash擦寫(xiě)時(shí)采用了均衡擦寫(xiě)機制。 考慮到系統的精簡(jiǎn)性,擦寫(xiě)在整片Flash 的各塊中依次進(jìn)行,一塊擦寫(xiě)完后,下一個(gè)被擦寫(xiě)的塊即為后一個(gè)塊,在系統的索引節點(diǎn)中保存了下一個(gè)要擦除的塊號。當文件系統中的剩余空間減少到設定值時(shí),系統會(huì )擦除此塊,以回收臟簇占用的空間。對應每個(gè)可擦寫(xiě)塊都有一個(gè)節點(diǎn)隊列,此塊中包含的節點(diǎn)都加入其中。塊擦除的流程見(jiàn)圖7。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論