當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]基于NAND閃存的文件系統(tǒng)YAFFS(Yet Another Flash File System)正逐漸被應(yīng)用到各種嵌入式系統(tǒng)中。本文將詳細闡述YAFFS文件系統(tǒng)在C51系統(tǒng)上的實現(xiàn)過程。

    隨著NAND Flash存儲器作為大容量數(shù)據(jù)存儲介質(zhì)的普及,基于NAND閃存的文件系統(tǒng)YAFFS(Yet Another Flash File System)正逐漸被應(yīng)用到各種嵌入式系統(tǒng)中。本文將詳細闡述YAFFS文件系統(tǒng)在C51系統(tǒng)上的實現(xiàn)過程。

1  NAND Flash的特點

  非易失性閃速存儲器Flash具有速度快、成本低、密度大的特點,被廣泛應(yīng)用于嵌入式系統(tǒng)中。Flash存儲器主要有NOR和NAND兩種類型。NOR型比較適合存儲程序代碼;NAND型則可用作大容量數(shù)據(jù)存儲。NAND閃存的存儲單元為塊和頁。本文使用的Samsung公司的K9F5608包括2 048塊,每一塊又包括32頁,一頁大小為528字節(jié),依次分為2個256字節(jié)的數(shù)據(jù)區(qū),最后是16字節(jié)的備用空間。

  K9F5608具有以下特點: 以頁為單位進行讀/寫操作,而擦除操作以塊為單位,讀、寫和擦除操作均通過命令完成;不能字節(jié)擦除,在每次改寫操作之前需要先擦除一整塊;出廠時有一定比例的壞塊存在;每一塊的擦除次數(shù)有限,為10萬次左右[1]。

2  YAFFS文件系統(tǒng)簡介

  YAFFS是第一個專門為NAND Flash存儲器設(shè)計的嵌入式文件系統(tǒng),適用于大容量的存儲設(shè)備;并且是在GPL(General Public License)協(xié)議下發(fā)布的,可在其網(wǎng)站免費獲得源代碼。

  YAFFS中,文件是以固定大小的數(shù)據(jù)塊進行存儲的,塊的大小可以是512字節(jié)、1 024字節(jié)或者2 048字節(jié)。這種實現(xiàn)依賴于它能夠?qū)⒁粋€數(shù)據(jù)塊頭和每個數(shù)據(jù)塊關(guān)聯(lián)起來。每個文件(包括目錄)都有一個數(shù)據(jù)塊頭與之相對應(yīng),數(shù)據(jù)塊頭中保存了ECC(Error Correction Code)和文件系統(tǒng)的組織信息,用于錯誤檢測和壞塊處理。充分考慮了NAND Flash的特點,YAFFS把這個數(shù)據(jù)塊頭存儲在Flash的16字節(jié)備用空間中。當(dāng)文件系統(tǒng)被掛載時,只須掃描存儲器的備用空間就能將文件系統(tǒng)信息讀入內(nèi)存,并且駐留在內(nèi)存中,不僅加快了文件系統(tǒng)的加載速度,也提高了文件的訪問速度,但是增加了內(nèi)存的消耗。

  為了在節(jié)省內(nèi)存的同時提高文件數(shù)據(jù)塊的查找速度,YAFFS利用更高效的映射結(jié)構(gòu)把文件位置映射到物理位置。文件的數(shù)據(jù)段被組織成樹型結(jié)構(gòu),這個樹型結(jié)構(gòu)具有32字節(jié)的節(jié)點,每個內(nèi)部節(jié)點都包括8個指向其他節(jié)點的指針,葉節(jié)點包括16個2字節(jié)的指向物理地址的指針。YAFFS在文件進行改寫時總是先寫入新的數(shù)據(jù)塊,然后將舊的數(shù)據(jù)塊從文件中刪除。這樣即使在修改文件時意外掉電,丟失的也只是這一次修改數(shù)據(jù)的最小寫入單位,從而實現(xiàn)了掉電保護,保證了數(shù)據(jù)完整性。

  結(jié)合貪心算法的高效性和隨機選擇的平均性,YAFFS實現(xiàn)了兼顧損耗平均和減小系統(tǒng)開銷的目的。當(dāng)滿足特定的小概率條件時,就會嘗試隨機選擇一個可回收的頁面;而在其他情況下,則使用貪心算法來回收最“臟”的塊[2]。

  YAFFS文件系統(tǒng)是按層次結(jié)構(gòu)設(shè)計的,分成以下4部分: yaffs_guts.c,文件系統(tǒng)的主要算法,這部分代碼完全是用可移植的C語言編寫的;yaffs_fs.c,Linux VFS層的接口;NAND 接口,yaffs_guts 和NAND 內(nèi)存訪問函數(shù)之間的包裝層,例如調(diào)用Linux mtd 層或者RAM模擬層;可移植函數(shù),服務(wù)的包裝函數(shù)。最重要的一點是,為了獲得更好的移植性,YAFFS提供直接調(diào)用的模式,這才使得我們有機會來實現(xiàn)YAFFS文件系統(tǒng)在C51系統(tǒng)上的移植。

3  移植過程

  可在http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/ 獲得direct源碼,包括以下幾個文件及其頭文件。

  ◆ yaffscfg.c: 設(shè)置各種設(shè)備參數(shù)和系統(tǒng)參數(shù)。
  ◆ yaffsfs.c: 主要實現(xiàn)直接調(diào)用的接口函數(shù),如打開文件、寫文件和關(guān)閉文件等。 使用時在應(yīng)用程序中包含其頭文件即可。
  ◆ yaffs_flashif.c: NAND Flash操作函數(shù)接口,就是直接對存儲器操作的底層函數(shù)。為了測試,此文件中用RAMDISK模擬的方法實現(xiàn)了對Flash存儲器的操作。實際應(yīng)用中,需要修改其中對Flash硬件操作函數(shù)的定義,包括yflash_EraseBlockInNAND()、yflash_WriteChunk?ToNAND()、yflash_ReadChunkFromNAND()和yflash_InitialiseNAND()。
  ◆ yaffs_guts.c: YAFFS文件系統(tǒng)的主要實現(xiàn)算法。
  ◆ nand_ecc.c:: ECC算法。
  ◆ yaffs_ramdisk.c:: RAMDISK支持代碼。
  ◆ yaffs_fileem.c: 用主機上的一個文件來模擬Flash存儲器,僅用于測試。
  ◆ dtest.c:: 直接調(diào)用文件系統(tǒng)的測試函數(shù)。

  獲得源碼以后,移植的過程可以分為2步:①  根據(jù)自己的需要進行裁減;②  將代碼向C51風(fēng)格轉(zhuǎn)化。

3.1  裁減

  YAFFS是一個功能強大的文件系統(tǒng),考慮到C51系統(tǒng)的程序代碼存儲器和RAM資源都很有限,而應(yīng)用中可能不需要某些文件操作的功能,所以有必要對這個文件系統(tǒng)進行裁減。裁減包括代碼裁減和數(shù)據(jù)結(jié)構(gòu)的修改。

  首先,將用來測試的yaffs_ramdisk.c、yaffs_ramdisk.h、yaffs_fileem.c和interface.h這幾個文件去掉,并在yaffscfg.c加上#include yaffs_flashif.h。

  本系統(tǒng)中,只是對K9F5608中的3個數(shù)據(jù)庫文件進行讀/寫,一級目錄足夠,單用戶不存在操作權(quán)限問題,簡單的文件存儲不涉及連接(Linux類操作系統(tǒng)文件間的關(guān)系)問題,所以可在系統(tǒng)中刪除與目錄操作、操作權(quán)限以及文件連接相關(guān)的操作函數(shù)。

  在yaffsfs.c及其頭文件中包括(省略yaffs_前綴): readlink(), DumpDir(), readdir(), opendir(), lstat(), stat(), freespace(), chmod(), mkdir(), rename(),link(), closedir(), FollowLink(), fstat(), listclear(), fchmod(),sylink()和mknod()。

  在yaffs_guts.c及其頭文件中包括(省略yaffs_前綴): Renameobject(), mknodedirectoty(), mknodSymLink(), mknodSpecial(), Link(), GetAttributes(), GetSymLinkAlias(), root(), LostNFound(), GutsTest(), DumpObject(), GetNumberofFreeChunk(), GetObjectLInkCount()和GetEquivalentObject()。

  然后根據(jù)自己的需要進行數(shù)據(jù)結(jié)構(gòu)修改,與上文提到的目錄操作、操作權(quán)限以及文件連接相關(guān)的數(shù)據(jù)結(jié)構(gòu)(如Uid、Gid、nlink等)對我們來說就沒有意義了,因此需要修改相關(guān)的數(shù)據(jù)結(jié)構(gòu)。為了節(jié)省內(nèi)存,還要修改一些宏定義的數(shù)據(jù)常量,例如同時在運行的句柄數(shù)目和文件名的最大長度等。

  裁減工作最好能在一臺裝有Linux操作系統(tǒng)的機器上進行,可以邊裁減,邊利用模擬方式來檢查是否能實現(xiàn)自己所需的功能。

3.2  向C51風(fēng)格轉(zhuǎn)化

  YAFFS文件系統(tǒng)是在Linux環(huán)境下利用開發(fā)用戶程序的C語言開發(fā)的。它與C51是有些差別的,主要有:

  ◇ C51不支持__inline__函數(shù)修飾符,可以將其宏定義為空;
  ◇ u8、u16、u32都需要重新宏定義成為C51的數(shù)據(jù)類型unsigned char、unsigned int和unsigned long;
  ◇ off_t定義為long。

  在YAFFS源代碼中有用data和bit作為變量的,而在C51中這些都是關(guān)鍵詞,須將其替換。

  在YAFFS源代碼中yaffs_Device結(jié)構(gòu)體的定義中使用了帶參數(shù)的函數(shù)指針,通過調(diào)用該指針指向的函數(shù)來對Flash硬件進行操作,而C51中通過寄存器函數(shù)指針來調(diào)用函數(shù)不能傳遞實際參數(shù),除非所得參數(shù)可在寄存器間傳遞。因此這里將yaffs_Device結(jié)構(gòu)體定義中的函數(shù)指針去掉,而直接調(diào)用yaffs_if.c中的Flash接口函數(shù)。

  向C51風(fēng)格轉(zhuǎn)化時,最好是在Keil集成開發(fā)環(huán)境中一邊修改,一邊編譯,發(fā)現(xiàn)錯誤后再進行修改。當(dāng)編譯器提示有多個錯誤時,要從第一個錯誤開始修改;可能前面的錯誤修改完畢,后面的錯誤就不再是錯誤了。

4  C51系統(tǒng)下的YAFFS使用實例

  下面的程序代碼是設(shè)計中的對DBF數(shù)據(jù)庫文件操作的關(guān)鍵代碼。

yaffs_StartUp();//設(shè)置一些參數(shù),包括各分區(qū)在Flash中的起始塊和結(jié)束塊的地址、預(yù)留塊數(shù)等
yaffs_mount("/flash"); //YAFFS支持多個分區(qū),這里選擇掛載/flash分區(qū)新建文件db1.dbf
f=yaffs_open("/flash/db1.dbf", O_CREAT,S_IREAD | S_IWRITE);
yaffs_close(f);//關(guān)閉文件db1.dbf
f=yaffs_open("/flash/db1.dbf", O_RDWR,0);//以讀/寫的方式打開文件db1.dbf
r=yaffs_write(f,"hello",5);//向文件寫數(shù)據(jù)
yaffs_lseek(f,2,SEEK_SET);//移動文件讀/寫指針
r=yaffs_write(f,"world",5);
r=yaffs_lseek(f,0,SEEK_SET);
r=yaffs_read(f,buffer,10);//從文件讀取數(shù)據(jù)
r=yaffs_close(f);//關(guān)閉文件db1.dbf
r=yaffs_unlink("/flash/db1.dbf");//刪除文件db1.dbf

  可見, YAFFS的接口函數(shù)的使用方法與標(biāo)準(zhǔn)C語言中對文件的操作函數(shù)十分相似,簡單易用。

5  總結(jié)

  YAFFS文件系統(tǒng)是第一個專門為NAND Flash存儲器編寫的嵌入式文件系統(tǒng)。它實現(xiàn)了掉電保護、疲勞均衡和有效的垃圾回收,與JFFS相比占用資源更少,運行速度更快;與FAT相比,更適合用于管理NAND Flash數(shù)據(jù)存儲器。在C51系統(tǒng)中如果需要實現(xiàn)Flash文件系統(tǒng),那么移植YAFFS是個不錯的選擇,但是畢竟它是一個在32位機的Linux下開發(fā)出來的,要讓它能與8位機的C51風(fēng)格完美結(jié)合,還需要進一步的努力。

參考文獻
[1]  Samsung公司.  K9F5608?DataSheet. 20031217.
[2]  毛勇強,黃光明. YAFFS文件系統(tǒng)在嵌入式Linux上的實現(xiàn). 電子設(shè)計應(yīng)用,2006(3).

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

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

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

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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