? 摘 要: 針對Flash存儲器的特性提出一種分層文件系統(tǒng)" title="文件系統(tǒng)">文件系統(tǒng)架構(gòu),抽象出邏輯存儲器作為中間層" title="中間層">中間層,屏蔽了底層物理器件操作上的不足。本文件系統(tǒng)非常適合1GB以下容量的Flash存儲器,具有可移植性高、訪問效率高、壽命均衡等特性。
? 關(guān)鍵詞: Flash存儲器, Block, Page, 邏輯存儲器, FAT
?
? 隨著嵌入式系統(tǒng)" title="嵌入式系統(tǒng)">嵌入式系統(tǒng)應(yīng)用的迅速發(fā)展,嵌入式系統(tǒng)被廣泛應(yīng)用于各行各業(yè),嵌入式系統(tǒng)的數(shù)據(jù)存儲問題隨之變成了一個最核心的關(guān)鍵問題。由于Flash器件的迅速普及,使得Flash存儲器的使用變得十分重要。同時,F(xiàn)lash器件本身固有的擦寫壽命、不可字節(jié)擦除等特點(diǎn)也使Flash器件存儲管理" title="存儲管理">存儲管理變得非常復(fù)雜。
? 目前嵌入式系統(tǒng)領(lǐng)域已有了一些較為成熟的Flash文件系統(tǒng),如:嵌入式Linux中普遍使用的JFFS2日志文件系統(tǒng)、YAFFS文件系統(tǒng)。但是這些文件系統(tǒng)本身比較大,適合于大系統(tǒng)運(yùn)行;并且經(jīng)實(shí)踐檢驗(yàn),這些文件系統(tǒng)對壽命的均衡處理并不像宣傳的那樣好,文件系統(tǒng)效率和可靠性也有待提高。
? 本文通過中間抽象邏輯存儲器建立一種短小精煉、高性能、高可靠性、適合于嵌入式小型設(shè)備的嵌入式Flash文件系統(tǒng)——μEFFS。
? 實(shí)際上,通過更改底層物理存儲器(軟件),此文件系統(tǒng)也可以很方便地移植到其他器件上。而且通用文件系統(tǒng)(如:FAT文件系統(tǒng))很容易移植到本文提出的中間層邏輯存儲器上,從而使得通用文件系統(tǒng)也獲得了Flash文件系統(tǒng)的特性,如:壽命均衡。
1 Flash存儲器特性
? (1)NAND Flash器件特點(diǎn):高存儲密度,采用頁讀寫(讀寫速度快)、塊擦除方式操作;容易發(fā)生位反轉(zhuǎn);存在壞塊(存儲不可靠性);容量一般較大(大于32MB);擦寫壽命一般為100萬次。
? (2)NOR Flash器件特點(diǎn):隨機(jī)讀寫、塊擦除;壞塊少;器件本身存儲可靠性高;擦寫速度較慢;容量一般較?。ㄐ∮?6MB),擦寫壽命一般為10萬次。
? (3)塊(block):擦除的最小單元。
? (4)頁(page):即扇區(qū),寫的最小單元(NorFlash寫的最小單元是字節(jié),無頁的概念)。
? (5)擦除:存儲單元的相應(yīng)數(shù)據(jù)位由“0”變成“1”。Flash器件和普通存儲器件不一樣,它只能采用塊擦除和片擦除兩種操作方式。
2 Flash器件存儲管理
? 由于Flash器件的讀寫特性,使Flash器件存儲管理較為復(fù)雜,且容易出問題。
? (1)壽命均衡問題:如果經(jīng)常對同一單元進(jìn)行擦寫操作,這些單元將很快達(dá)到壽命極限,導(dǎo)致?lián)p壞。
? (2)效率問題:如果每次改寫1個字節(jié)的數(shù)據(jù)都采用擦寫方式,將導(dǎo)致操作效率低下。
? (3)NOR和NAND兩種Flash區(qū)別明顯。
? 嵌入式Flash文件系統(tǒng)需解決的核心問題都是圍繞壽命均衡產(chǎn)生的,同時要兼顧性能和可靠性,最好能同時兼容兩種Flash器件(NOR和NAND)。
3 μEFFS的核心原理
? 建立一種完美的“邏輯存儲器”,在此邏輯存儲器上,可以完全像操作硬盤一樣進(jìn)行讀、寫操作。
系統(tǒng)層次結(jié)構(gòu)如圖1所示。
?????????????????????????????????
? 這樣利用抽象中間層邏輯存儲器完全屏蔽了底層物理存儲器的具體實(shí)現(xiàn),同時各層之間接口簡單,簡化了系統(tǒng),提高了系統(tǒng)的可移植性。中間層邏輯存儲器將復(fù)雜的Flash操作簡單化。系統(tǒng)結(jié)構(gòu)如圖2所示。
??????????????????????
? 中間層邏輯存儲器是對物理器件的一種抽象,這樣做的好處是上層文件系統(tǒng)無需考慮底層的具體實(shí)現(xiàn),同時有利于移植到其他物理器件上。
? 為適應(yīng)各種不同的器件需要,系統(tǒng)建立統(tǒng)一的邏輯扇區(qū)Logic Sector(LS)。邏輯扇區(qū)大小和物理扇區(qū)相等,但是邏輯扇區(qū)的物理位置不固定,其實(shí)際地址通過BSAT來確定。同時系統(tǒng)為每個邏輯扇區(qū)編號(LSN),這個就是邏輯扇區(qū)訪問的惟一指示器。對于每個物理塊建立一個BSAT(塊內(nèi)扇區(qū)分配表,占用該塊第一個扇區(qū)),用以描述這個塊內(nèi)所有扇區(qū)使用情況,分配表的每個單元最高2位表示扇區(qū)使用情況,剩下各位為邏輯扇區(qū)號。例如BSAT表項(xiàng)采用16位(即BSAT16),BSAT表項(xiàng)結(jié)構(gòu)如表1所示。這樣對整個存儲系統(tǒng)的訪問就完全變成對邏輯扇區(qū)的訪問了。系統(tǒng)本質(zhì)是建立邏輯扇區(qū)到物理扇區(qū)的映射表,同時在操作過程中維護(hù)這個映射表。
?????????????????????
4 底層物理存儲器
? 用于訪問物理層硬件的主要函數(shù)有:
? (1)FlashEraseChip():芯片整片擦除。
? (2)FlashEraseBlock(INT32U dwBlockNo):塊擦除。
? (3)FlashWrite(INT32U dwAddr,INT8U * pBuff,INT32U dwSzie):將緩沖區(qū)的數(shù)據(jù)寫入目標(biāo)地址處。
? (4)FlashWrite1Sec(INT32U dwSecNo,INT8U * pBuff):向目標(biāo)扇區(qū)寫數(shù)據(jù)。
? (5)FlashRead(INT8U * pBuff,INT32 dwAddr,INT32U dwSzie):從指定地址處讀數(shù)據(jù)。
? (6)FlashRead1Sec(INT8U * pBuff,INT32U dwSecNo):從指定扇區(qū)讀數(shù)據(jù)。
5 中間層邏輯存儲器
5.1 系統(tǒng)初始化
? 對Flash進(jìn)行掃描,建立Flash空扇區(qū)表和物理扇區(qū)映射表。
? (1)空扇區(qū)表:EmptySecTable[SecNum/8],表中每一位表示一個扇區(qū),為1表示該扇區(qū)為空,否則該扇區(qū)非空。
? (2)物理扇區(qū)映射表:PhySecTable[LogicSecNum],表中每個單元的值為物理扇區(qū)號。
5.2 讀訪問
? (1)根據(jù)PhySecTable[]找到邏輯扇區(qū)對應(yīng)的物理扇區(qū)號。
? (2)根據(jù)物理扇區(qū)號計(jì)算出物理地址。
? (3)根據(jù)物理地址和扇區(qū)大小讀取數(shù)據(jù)。
5.3 修改訪問
? (1)先按讀訪問,讀取扇區(qū)數(shù)據(jù)。
? (2)在內(nèi)存中修改數(shù)據(jù)。
? (3)根據(jù)EmptySecTable[]選取一個空扇區(qū),將修改后的數(shù)據(jù)寫入新扇區(qū)。
? (4)改寫新扇區(qū)所在塊的BSAT表,標(biāo)記該扇區(qū)為有效狀態(tài),同時將邏輯扇區(qū)號寫入BSAT。
? (5)修改EmptySecTable[]表中該扇區(qū)為非空扇區(qū)。
? (6)修改原扇區(qū)的BSAT項(xiàng),標(biāo)記為無效狀態(tài)。
? 注:修改訪問都選擇一個新物理扇區(qū)(page),然后寫入數(shù)據(jù),再將原物理扇區(qū)標(biāo)記為無效,從而達(dá)到壽命均衡訪問。
5.4 緩沖塊
? 系統(tǒng)保留兩個塊用于碎片整理緩沖,緩沖塊也稱交換塊,如果要實(shí)現(xiàn)更好的壽命均衡,也可以采用邏輯塊的形式建立緩沖塊。
5.5 Flash碎片整理
? Flash碎片整理分為手動整理和自動整理。如果系統(tǒng)空扇區(qū)少于20%時,系統(tǒng)將自動進(jìn)行碎片整理。
? (1)系統(tǒng)復(fù)位初始化時,通過EmptySecTable[]判斷是否需要整理;如果需要,則整理出一個塊(block)。
? (2)增加數(shù)據(jù)或修改數(shù)據(jù)時,如果發(fā)現(xiàn)空扇區(qū)少于10%,則整理出一個塊,然后再進(jìn)行操作。
? (3)由于碎片整理比較耗時,所以每次只整理出一個塊,目的是提高單次操作的性能。
? (4)手動整理將對整個存儲器進(jìn)行整理,它可以在空扇區(qū)少于40%的情況下進(jìn)行。
? (5)整理過程:先擦除緩沖塊(Buff block),然后將欲整理的塊中有效扇區(qū)全部按順序轉(zhuǎn)移到緩沖塊中,再擦除該塊,? 最后將緩沖塊中的數(shù)據(jù)原樣復(fù)制到該塊。整理后需要更新空扇區(qū)表和塊扇區(qū)分配表。
? (6)整個系統(tǒng)只有碎片整理程序才會進(jìn)行擦除操作,因此各塊的壽命(次數(shù))實(shí)際上就等于碎片整理的次數(shù)。
? (7)碎片整理均衡策略:碎片整理每次只整理一個物理塊,設(shè)立一個碎片整理塊指針,用于指示下次需整理的塊。這樣保證均衡整理各塊,均衡了各塊壽命。
5.6 中間層邏輯存儲器主要函數(shù)
? (1)LogicMemFormat():擦除整片F(xiàn)lash,供上層調(diào)用。
? (2)LogicMemInit():系統(tǒng)復(fù)位初始化調(diào)用,通過掃描Flash產(chǎn)生空扇區(qū)表和物理扇區(qū)映射表。
? (3)ReadLogicSec(INT8U * buff,INT16U wLogicSecNo):根據(jù)邏輯扇區(qū)號讀取扇區(qū)數(shù)據(jù)。
? (4)WriteLogicSec(INT16U wLogicSecNo,INT8U * buff):將數(shù)據(jù)寫入邏輯扇區(qū),這個要考慮是追加還是修改。
? (5)INT16U GetAFreeSec():獲取一個空扇區(qū)號(未使用的物理扇區(qū)號)。
? (6)FlashMemRep1Block():碎片整理1塊。
? (7)FlashMemRepAll():整片碎片整理。
6 上層文件系統(tǒng)
? 在中間層邏輯存儲器的基礎(chǔ)上,可以建立各種類型的文件系統(tǒng)。這樣建立的文件系統(tǒng)已經(jīng)具有良好的Flash文件系統(tǒng)特性。本文件系統(tǒng)采用類似于FAT文件系統(tǒng)的處理方法。
? (1)主引導(dǎo)記錄MBR(保留區(qū)):包含啟動代碼和分區(qū)表" title="分區(qū)表">分區(qū)表,這個區(qū)主要借鑒了已有文件系統(tǒng)的設(shè)計(jì)思想(采用磁盤文件系統(tǒng)類似的方法處理),主引導(dǎo)記錄占用邏輯扇區(qū)0。實(shí)際上只要有BIOS的支持,本文件系統(tǒng)完全可以和已有的文件系統(tǒng)一樣引導(dǎo)操作系統(tǒng)或者應(yīng)用軟件(只要搜索到邏輯算區(qū)0就找到了主引導(dǎo)記錄);采用分區(qū)表的方法則有利于擴(kuò)大整個文件系統(tǒng)管理空間的大小(如采用FAT16格式,4個分區(qū)表項(xiàng)分別指示4個不同的分區(qū),相當(dāng)于文件系統(tǒng)所能管理的空間擴(kuò)大了4倍)。
主引導(dǎo)記錄占用邏輯扇區(qū)0。
? (2)系統(tǒng)引導(dǎo)記錄DBR:用于指示文件分配表的位置、大小、個數(shù)和根目錄區(qū)位置、大小、項(xiàng)數(shù)。系統(tǒng)引導(dǎo)記錄占用邏輯扇區(qū)1。
? (3)文件分配表(FAT):用于指示文件的邏輯扇區(qū)號鏈,由于建立了物理扇區(qū)映射表,所以,可以高效地進(jìn)行數(shù)據(jù)訪問。文件分配表本身占用邏輯扇區(qū)號,文件分配表的大小、個數(shù),由系統(tǒng)引導(dǎo)記錄指示。
? (4)文件目錄表(FDT):分為根目錄和子目錄。子目錄實(shí)際上也是文件(和普通文件完全一樣),這里不詳細(xì)討論。根目錄表主要目的用于指示根目錄中各文件(含子目錄)在FAT中的第一個扇區(qū)號。
根目錄的位置和大小在系統(tǒng)引導(dǎo)記錄中指示。
7 系統(tǒng)整體運(yùn)行機(jī)制
? (1)系統(tǒng)初始化:系統(tǒng)啟動時進(jìn)行初始化,構(gòu)建中間層邏輯存儲器。此時建立空扇區(qū)表和邏輯扇區(qū)到物理扇區(qū)的映射表。
? (2)文件讀、寫操作:根據(jù)主引導(dǎo)記錄(邏輯扇區(qū)0)找到所在分區(qū)引導(dǎo)記錄(系統(tǒng)引導(dǎo)記錄);根據(jù)分區(qū)引導(dǎo)記錄找到根目錄區(qū);根據(jù)根目錄項(xiàng),找到文件分配表(FAT)中相應(yīng)的入口;根據(jù)FAT入口進(jìn)行文件讀、寫操作。上述所有操作都是根據(jù)邏輯扇區(qū)號進(jìn)行訪問的,實(shí)際訪問通過查找物理扇區(qū)映射表進(jìn)行。
? 本文通過中間層抽象邏輯存儲器建立了一種Flash文件系統(tǒng),并命名為μEFFS。μEFFS特別適合于小型嵌入式系統(tǒng)(8位、16位、32位系統(tǒng)均可良好運(yùn)行),具有壽命均衡、性能好、可靠性高的特點(diǎn),經(jīng)受了實(shí)踐的考驗(yàn)。通過對本系統(tǒng)的裁剪,很容易將其移植到單片機(jī)系統(tǒng)中,這樣也給目前的低端8位單片機(jī)系統(tǒng)提供了一種數(shù)據(jù)存儲解決方案。
參考文獻(xiàn)
[1] 馬忠梅,李善平,康慨,等.ARM&Linux嵌入式系統(tǒng)教程.北京:北京航空航天大學(xué)出版社,2005.
[2] 周立功.ARM嵌入式系統(tǒng)實(shí)驗(yàn)教程(2).廣州:廣州周立功單片機(jī)發(fā)展有限公司,2005.
[3] LABROSSE J J著,邵貝貝譯.?滋C/OS-Ⅱ-源代碼公開的實(shí)時嵌入式操作系統(tǒng).北京:中國電力出版社,2001.
[4] MALIK V.JFFS-Aracticalguid.http://www.embeddelinuxworks.com/articles/,2001,05.