基于Flash存儲器的嵌入式文件系統設計
引言
Flash 存儲器( Flash Memory) 是一種高可靠性、高密度的固態存儲器件。其存儲方式是完全非易失性的,掉電后可以保存數據;可以在線寫入,并可按頁連續字節寫入,存取速度快,所以嵌入式系統通常使用Flash 存儲器作為存儲設備。 但Flash存儲器也存在著兩個主要缺陷:一是在重寫之前必須進行擦除,因為Flash 存儲器劃分成很多擦除塊(SectorOErase) ,對任何一位數據進行修改必須先擦除整個塊(Sector) ;二是擦除塊的擦除次數有限,當一個塊提前達到擦除次數上限時, 將導致整個Flash 存儲器無法使用。 所以,目前PC 機上很多成熟的基于磁盤的文件系統在Flash 存儲器上使用都存在著不足。
嵌入式系統應具有的特點: 一是高可靠性,在惡劣環境下系統仍能正常工作;二是低消耗,受成本限制系統設計必須量體裁衣,去除冗余;三是高效率,在占用較少資源情況下保證功能需求,這樣就要求算法簡單,效率高。 而日志文件系統(Log-St ruct ured File System) 在數據更新時無需將數據寫入原存儲區域,適應Flash 存儲器無法進行重寫這一特點。 目前,針對Flash 存儲器的缺陷而設計的Linux 下的J FFS 文件系統,就是采用簡化的日志文件系統。 J FFS 文件系統將磨損均衡集成于清除機制之中,在帶來掉電可恢復功能的同時,大大減少了塊擦除的次數,提高了文件系統的存取速度和效率。 但是,J FFS 文件系統無法單獨使用,或者使用于其它實時操作系統中。 對由于受成本和實時性限制而無法使用Linux 的一些嵌入式系統,也就無法使用J FFS 文件系統。基于上述分析,該嵌入式文件系統適合在開源實時操作系統(如μC/OS-II) 和無操作系統的情況下使用。
嵌入式文件系統原理
在日志文件系統中,一個文件被修改后不是被寫入到原來的存儲空間,而是被加到所有內容的后面,象日志一樣被更新,這就是日志文件系統的基本原理。由于同一個文件在文件系統中會留下不同的版本,所以系統需要設置一張表標注文件的最新與以前的版本。在內容不斷添加時為不將存儲空間占滿,系統設計了一種回收機制,回收無效內容占用的空間。
日志文件系統在文件更新時不用將文件寫回原來的地址,這對Flash 存儲器這種存儲介質最為適合。 文中所設計的嵌入式文件系統采用了日志文件系統的設計原理,以及J FFS 文件系統將磨損均衡集成于清除機制之中的方法。 該系統將一個可擦寫塊平分為多個簇,文件的讀寫以簇為單位進行。簇的狀態有3 種:臟、干凈和空。臟表示所存內容已被置為無效;干凈表示所存數據有效;空表示可以寫入數據。文件和目錄在該系統中被作為節點,一個節點占用若干個簇,節點中的內容連續存儲,但不能越過塊邊界存儲。該系統設置一個索引節點,保存整個系統的信息,其中包含保存有各簇狀態的簇狀態表。
每一次文件更新后內容都將被添加至末尾處,索引節點也被更新,總是占用最末尾的干凈簇。 回收臟簇時,將所要擦除塊中的干凈簇重寫到空簇中,再進行塊擦除。 當內容寫至存儲體末端,則從頭部重新開始循環存儲。 所設計的文件系統的操作過程見圖1。
嵌入式文件系統設計
Flash 存儲器中的存儲結構
Flash 存儲器中的存儲結構見圖2。 該存儲器中每個簇的第一個字作為簇的狀態字,表示此簇是否為一個節點的首簇或空簇。 每個節點的首部存放此節點屬性(文件/目錄/索引節點) 和節點標識號。
索引節點
索引節點存放該文件系統的大部分信息。 包括32 位的索引節點更新號、一張簇狀態表、下一個要被擦除塊的塊號、給下一個新建節點(文件或目錄) 的節點編號、系統根目錄信息表。系統每一次更新都會產生新的索引節點,索引節點更新號加1。 按照Flash 存儲器的使用壽命10 年計算,需要每秒更新136 次以上,才能達到索引節點更新號的上限,所以認為擁有最大更新號的索引節點為最新的索引節點。簇狀態表中對應每一個簇有兩個Bit 位,表示各個簇的狀態(干凈01 ,臟11 ,空00) 。根目錄信息表存放根目錄下的各個目錄項,每個目錄項包括:屬性(文件0x1/目錄0x0) 、文件名或目錄名、節點編號、此文件(或目錄) 對應節點的起始簇地址、根目錄表的大小可變。
目錄節點
目錄節點存放的內容有目錄名,目錄項個數,及所有目錄項信息。 文件節點存放文件名,文件大小,文件屬性及文件內容,內存中的目錄結構見圖3。
內存數據結構及基本操作
該文件系統載入(Mount ) 后,會在內存中建立一個系統的映象。該映象包括:索引節點中的信息、目錄及文件信息、每個可擦寫塊中包含的節點信息、未存盤的節點信息。簇狀態表、索引節點更新號、新節點編號、下一擦除塊號等索引節點中的內容,在內存中均作為不同的變量。內存中為每個文件和目錄都建立了映象,數據結構見圖4 和圖5。
linux操作系統文章專題:linux操作系統詳解(linux不再難懂)
評論