資料介紹
隨著NAND Flash存儲器作為大容量數據存儲介質的普及,基于NAND閃存的文件系統YAFFS(Yet Another Flash File System)正逐漸被應用到各種嵌入式系統中。本文將詳細闡述YAFFS文件系統在C51系統上的實現過程。
1 NAND Flash的特點
非易失性閃速存儲器Flash具有速度快、成本低、密度大的特點,被廣泛應用于嵌入式系統中。Flash存儲器主要有NOR和NAND兩種類型。NOR型比較適合存儲程序代碼;NAND型則可用作大容量數據存儲。NAND閃存的存儲單元為塊和頁。本文使用的Samsung公司的K9F5608包括2 048塊,每一塊又包括32頁,一頁大小為528字節,依次分為2個256字節的數據區,最后是16字節的備用空間。
K9F5608具有以下特點: 以頁為單位進行讀/寫操作,而擦除操作以塊為單位,讀、寫和擦除操作均通過命令完成;不能字節擦除,在每次改寫操作之前需要先擦除一整塊;出廠時有一定比例的壞塊存在;每一塊的擦除次數有限,為10萬次左右[1]。
2 YAFFS文件系統簡介
YAFFS是第一個專門為NAND Flash存儲器設計的嵌入式文件系統,適用于大容量的存儲設備;并且是在GPL(General Public License)協議下發布的,可在其網站免費獲得源代碼。
YAFFS中,文件是以固定大小的數據塊進行存儲的,塊的大小可以是512字節、1 024字節或者2 048字節。這種實現依賴于它能夠將一個數據塊頭和每個數據塊關聯起來。每個文件(包括目錄)都有一個數據塊頭與之相對應,數據塊頭中保存了ECC(Error Correction Code)和文件系統的組織信息,用于錯誤檢測和壞塊處理。充分考慮了NAND Flash的特點,YAFFS把這個數據塊頭存儲在Flash的16字節備用空間中。當文件系統被掛載時,只須掃描存儲器的備用空間就能將文件系統信息讀入內存,并且駐留在內存中,不僅加快了文件系統的加載速度,也提高了文件的訪問速度,但是增加了內存的消耗。
為了在節省內存的同時提高文件數據塊的查找速度,YAFFS利用更高效的映射結構把文件位置映射到物理位置。文件的數據段被組織成樹型結構,這個樹型結構具有32字節的節點,每個內部節點都包括8個指向其他節點的指針,葉節點包括16個2字節的指向物理地址的指針。YAFFS在文件進行改寫時總是先寫入新的數據塊,然后將舊的數據塊從文件中刪除。這樣即使在修改文件時意外掉電,丟失的也只是這一次修改數據的最小寫入單位,從而實現了掉電保護,保證了數據完整性。
結合貪心算法的高效性和隨機選擇的平均性,YAFFS實現了兼顧損耗平均和減小系統開銷的目的。當滿足特定的小概率條件時,就會嘗試隨機選擇一個可回收的頁面;而在其他情況下,則使用貪心算法來回收最“臟”的塊[2]。
YAFFS文件系統是按層次結構設計的,分成以下4部分: yaffs_guts.c,文件系統的主要算法,這部分代碼完全是用可移植的C語言編寫的;yaffs_fs.c,Linux VFS層的接口;NAND 接口,yaffs_guts 和NAND 內存訪問函數之間的包裝層,例如調用Linux mtd 層或者RAM模擬層;可移植函數,服務的包裝函數。最重要的一點是,為了獲得更好的移植性,YAFFS提供直接調用的模式,這才使得我們有機會來實現YAFFS文件系統在C51系統上的移植。
3 移植過程
可在http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/ 獲得direct源碼,包括以下幾個文件及其頭文件。
◆ yaffscfg.c: 設置各種設備參數和系統參數。
◆ yaffsfs.c: 主要實現直接調用的接口函數,如打開文件、寫文件和關閉文件等。 使用時在應用程序中包含其頭文件即可。
◆ yaffs_flashif.c: NAND Flash操作函數接口,就是直接對存儲器操作的底層函數。為了測試,此文件中用RAMDISK模擬的方法實現了對Flash存儲器的操作。實際應用中,需要修改其中對Flash硬件操作函數的定義,包括yflash_EraseBlockInNAND()、yflash_WriteChunk?ToNAND()、yflash_ReadChunkFromNAND()和yflash_InitialiseNAND()。
◆ yaffs_guts.c: YAFFS文件系統的主要實現算法。
◆ nand_ecc.c:: ECC算法。
◆ yaffs_ramdisk.c:: RAMDISK支持代碼。
◆ yaffs_fileem.c: 用主機上的一個文件來模擬Flash存儲器,僅用于測試。
◆ dtest.c:: 直接調用文件系統的測試函數。
獲得源碼以后,移植的過程可以分為2步:① 根據自己的需要進行裁減;② 將代碼向C51風格轉化。
3.1 裁減
YAFFS是一個功能強大的文件系統,考慮到C51系統的程序代碼存儲器和RAM資源都很有限,而應用中可能不需要某些文件操作的功能,所以有必要對這個文件系統進行裁減。裁減包括代碼裁減和數據結構的修改。
首先,將用來測試的yaffs_ramdisk.c、yaffs_ramdisk.h、yaffs_fileem.c和interface.h這幾個文件去掉,并在yaffscfg.c加上#include yaffs_flashif.h。
本系統中,只是對K9F5608中的3個數據庫文件進行讀/寫,一級目錄足夠,單用戶不存在操作權限問題,簡單的文件存儲不涉及連接(Linux類操作系統文件間的關系)問題,所以可在系統中刪除與目錄操作、操作權限以及文件連接相關的操作函數。
在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()。
然后根據自己的需要進行數據結構修改,與上文提到的目錄操作、操作權限以及文件連接相關的數據結構(如Uid、Gid、nlink等)對我們來說就沒有意義了,因此需要修改相關的數據結構。為了節省內存,還要修改一些宏定義的數據常量,例如同時在運行的句柄數目和文件名的最大長度等。
裁減工作最好能在一臺裝有Linux操作系統的機器上進行,可以邊裁減,邊利用模擬方式來檢查是否能實現自己所需的功能。
3.2 向C51風格轉化
YAFFS文件系統是在Linux環境下利用開發用戶程序的C語言開發的。它與C51是有些差別的,主要有:
◇ C51不支持__inline__函數修飾符,可以將其宏定義為空;
◇ u8、u16、u32都需要重新宏定義成為C51的數據類型unsigned char、unsigned int和unsigned long;
◇ off_t定義為long。
在YAFFS源代碼中有用data和bit作為變量的,而在C51中這些都是關鍵詞,須將其替換。
在YAFFS源代碼中yaffs_Device結構體的定義中使用了帶參數的函數指針,通過調用該指針指向的函數來對Flash硬件進行操作,而C51中通過寄存器函數指針來調用函數不能傳遞實際參數,除非所得參數可在寄存器間傳遞。因此這里將yaffs_Device結構體定義中的函數指針去掉,而直接調用yaffs_if.c中的Flash接口函數。
向C51風格轉化時,最好是在Keil集成開發環境中一邊修改,一邊編譯,發現錯誤后再進行修改。當編譯器提示有多個錯誤時,要從第一個錯誤開始修改;可能前面的錯誤修改完畢,后面的錯誤就不再是錯誤了。
4 C51系統下的YAFFS使用實例
下面的程序代碼是設計中的對DBF數據庫文件操作的關鍵代碼。
yaffs_StartUp();//設置一些參數,包括各分區在Flash中的起始塊和結束塊的地址、預留塊數等
yaffs_mount(“/flash”); //YAFFS支持多個分區,這里選擇掛載/flash分區新建文件db1.dbf
f=yaffs_open(“/flash/db1.dbf”, O_CREAT,S_IREAD | S_IWRITE);
yaffs_close(f);//關閉文件db1.dbf
f=yaffs_open(“/flash/db1.dbf”, O_RDWR,0);//以讀/寫的方式打開文件db1.dbf
r=yaffs_write(f,“hello”,5);//向文件寫數據
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);//從文件讀取數據
r=yaffs_close(f);//關閉文件db1.dbf
r=yaffs_unlink(“/flash/db1.dbf”);//刪除文件db1.dbf
可見, YAFFS的接口函數的使用方法與標準C語言中對文件的操作函數十分相似,簡單易用。
5 總結
YAFFS文件系統是第一個專門為NAND Flash存儲器編寫的嵌入式文件系統。它實現了掉電保護、疲勞均衡和有效的垃圾回收,與JFFS相比占用資源更少,運行速度更快;與FAT相比,更適合用于管理NAND Flash數據存儲器。在C51系統中如果需要實現Flash文件系統,那么移植YAFFS是個不錯的選擇,但是畢竟它是一個在32位機的Linux下開發出來的,要讓它能與8位機的C51風格完美結合,還需要進一步的努力。
?
1 NAND Flash的特點
非易失性閃速存儲器Flash具有速度快、成本低、密度大的特點,被廣泛應用于嵌入式系統中。Flash存儲器主要有NOR和NAND兩種類型。NOR型比較適合存儲程序代碼;NAND型則可用作大容量數據存儲。NAND閃存的存儲單元為塊和頁。本文使用的Samsung公司的K9F5608包括2 048塊,每一塊又包括32頁,一頁大小為528字節,依次分為2個256字節的數據區,最后是16字節的備用空間。
K9F5608具有以下特點: 以頁為單位進行讀/寫操作,而擦除操作以塊為單位,讀、寫和擦除操作均通過命令完成;不能字節擦除,在每次改寫操作之前需要先擦除一整塊;出廠時有一定比例的壞塊存在;每一塊的擦除次數有限,為10萬次左右[1]。
2 YAFFS文件系統簡介
YAFFS是第一個專門為NAND Flash存儲器設計的嵌入式文件系統,適用于大容量的存儲設備;并且是在GPL(General Public License)協議下發布的,可在其網站免費獲得源代碼。
YAFFS中,文件是以固定大小的數據塊進行存儲的,塊的大小可以是512字節、1 024字節或者2 048字節。這種實現依賴于它能夠將一個數據塊頭和每個數據塊關聯起來。每個文件(包括目錄)都有一個數據塊頭與之相對應,數據塊頭中保存了ECC(Error Correction Code)和文件系統的組織信息,用于錯誤檢測和壞塊處理。充分考慮了NAND Flash的特點,YAFFS把這個數據塊頭存儲在Flash的16字節備用空間中。當文件系統被掛載時,只須掃描存儲器的備用空間就能將文件系統信息讀入內存,并且駐留在內存中,不僅加快了文件系統的加載速度,也提高了文件的訪問速度,但是增加了內存的消耗。
為了在節省內存的同時提高文件數據塊的查找速度,YAFFS利用更高效的映射結構把文件位置映射到物理位置。文件的數據段被組織成樹型結構,這個樹型結構具有32字節的節點,每個內部節點都包括8個指向其他節點的指針,葉節點包括16個2字節的指向物理地址的指針。YAFFS在文件進行改寫時總是先寫入新的數據塊,然后將舊的數據塊從文件中刪除。這樣即使在修改文件時意外掉電,丟失的也只是這一次修改數據的最小寫入單位,從而實現了掉電保護,保證了數據完整性。
結合貪心算法的高效性和隨機選擇的平均性,YAFFS實現了兼顧損耗平均和減小系統開銷的目的。當滿足特定的小概率條件時,就會嘗試隨機選擇一個可回收的頁面;而在其他情況下,則使用貪心算法來回收最“臟”的塊[2]。
YAFFS文件系統是按層次結構設計的,分成以下4部分: yaffs_guts.c,文件系統的主要算法,這部分代碼完全是用可移植的C語言編寫的;yaffs_fs.c,Linux VFS層的接口;NAND 接口,yaffs_guts 和NAND 內存訪問函數之間的包裝層,例如調用Linux mtd 層或者RAM模擬層;可移植函數,服務的包裝函數。最重要的一點是,為了獲得更好的移植性,YAFFS提供直接調用的模式,這才使得我們有機會來實現YAFFS文件系統在C51系統上的移植。
3 移植過程
可在http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/ 獲得direct源碼,包括以下幾個文件及其頭文件。
◆ yaffscfg.c: 設置各種設備參數和系統參數。
◆ yaffsfs.c: 主要實現直接調用的接口函數,如打開文件、寫文件和關閉文件等。 使用時在應用程序中包含其頭文件即可。
◆ yaffs_flashif.c: NAND Flash操作函數接口,就是直接對存儲器操作的底層函數。為了測試,此文件中用RAMDISK模擬的方法實現了對Flash存儲器的操作。實際應用中,需要修改其中對Flash硬件操作函數的定義,包括yflash_EraseBlockInNAND()、yflash_WriteChunk?ToNAND()、yflash_ReadChunkFromNAND()和yflash_InitialiseNAND()。
◆ yaffs_guts.c: YAFFS文件系統的主要實現算法。
◆ nand_ecc.c:: ECC算法。
◆ yaffs_ramdisk.c:: RAMDISK支持代碼。
◆ yaffs_fileem.c: 用主機上的一個文件來模擬Flash存儲器,僅用于測試。
◆ dtest.c:: 直接調用文件系統的測試函數。
獲得源碼以后,移植的過程可以分為2步:① 根據自己的需要進行裁減;② 將代碼向C51風格轉化。
3.1 裁減
YAFFS是一個功能強大的文件系統,考慮到C51系統的程序代碼存儲器和RAM資源都很有限,而應用中可能不需要某些文件操作的功能,所以有必要對這個文件系統進行裁減。裁減包括代碼裁減和數據結構的修改。
首先,將用來測試的yaffs_ramdisk.c、yaffs_ramdisk.h、yaffs_fileem.c和interface.h這幾個文件去掉,并在yaffscfg.c加上#include yaffs_flashif.h。
本系統中,只是對K9F5608中的3個數據庫文件進行讀/寫,一級目錄足夠,單用戶不存在操作權限問題,簡單的文件存儲不涉及連接(Linux類操作系統文件間的關系)問題,所以可在系統中刪除與目錄操作、操作權限以及文件連接相關的操作函數。
在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()。
然后根據自己的需要進行數據結構修改,與上文提到的目錄操作、操作權限以及文件連接相關的數據結構(如Uid、Gid、nlink等)對我們來說就沒有意義了,因此需要修改相關的數據結構。為了節省內存,還要修改一些宏定義的數據常量,例如同時在運行的句柄數目和文件名的最大長度等。
裁減工作最好能在一臺裝有Linux操作系統的機器上進行,可以邊裁減,邊利用模擬方式來檢查是否能實現自己所需的功能。
3.2 向C51風格轉化
YAFFS文件系統是在Linux環境下利用開發用戶程序的C語言開發的。它與C51是有些差別的,主要有:
◇ C51不支持__inline__函數修飾符,可以將其宏定義為空;
◇ u8、u16、u32都需要重新宏定義成為C51的數據類型unsigned char、unsigned int和unsigned long;
◇ off_t定義為long。
在YAFFS源代碼中有用data和bit作為變量的,而在C51中這些都是關鍵詞,須將其替換。
在YAFFS源代碼中yaffs_Device結構體的定義中使用了帶參數的函數指針,通過調用該指針指向的函數來對Flash硬件進行操作,而C51中通過寄存器函數指針來調用函數不能傳遞實際參數,除非所得參數可在寄存器間傳遞。因此這里將yaffs_Device結構體定義中的函數指針去掉,而直接調用yaffs_if.c中的Flash接口函數。
向C51風格轉化時,最好是在Keil集成開發環境中一邊修改,一邊編譯,發現錯誤后再進行修改。當編譯器提示有多個錯誤時,要從第一個錯誤開始修改;可能前面的錯誤修改完畢,后面的錯誤就不再是錯誤了。
4 C51系統下的YAFFS使用實例
下面的程序代碼是設計中的對DBF數據庫文件操作的關鍵代碼。
yaffs_StartUp();//設置一些參數,包括各分區在Flash中的起始塊和結束塊的地址、預留塊數等
yaffs_mount(“/flash”); //YAFFS支持多個分區,這里選擇掛載/flash分區新建文件db1.dbf
f=yaffs_open(“/flash/db1.dbf”, O_CREAT,S_IREAD | S_IWRITE);
yaffs_close(f);//關閉文件db1.dbf
f=yaffs_open(“/flash/db1.dbf”, O_RDWR,0);//以讀/寫的方式打開文件db1.dbf
r=yaffs_write(f,“hello”,5);//向文件寫數據
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);//從文件讀取數據
r=yaffs_close(f);//關閉文件db1.dbf
r=yaffs_unlink(“/flash/db1.dbf”);//刪除文件db1.dbf
可見, YAFFS的接口函數的使用方法與標準C語言中對文件的操作函數十分相似,簡單易用。
5 總結
YAFFS文件系統是第一個專門為NAND Flash存儲器編寫的嵌入式文件系統。它實現了掉電保護、疲勞均衡和有效的垃圾回收,與JFFS相比占用資源更少,運行速度更快;與FAT相比,更適合用于管理NAND Flash數據存儲器。在C51系統中如果需要實現Flash文件系統,那么移植YAFFS是個不錯的選擇,但是畢竟它是一個在32位機的Linux下開發出來的,要讓它能與8位機的C51風格完美結合,還需要進一步的努力。
?
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 【文件系統】FatFs文件系統在嵌入式芯片LPC18XX上的移植
- 如何實現Linux內核移植和yaffs2根文件系統制作 9次下載
- 如何使用KEIL C51和proteus實現C51匯編程序的設計實例
- Flash文件系統剖析 4次下載
- Linux日志文件系統解析 0次下載
- 超大容量NANDFlash文件系統-YAFFS2在Linux下的實現 11次下載
- 分析YAFFS文件系統在Linux系統中的構建 0次下載
- 基于閃存YAFFS文件系統的索引機制的改進_李紀扣 0次下載
- 基于S3C2440和μC%2fOS的FAT文件系統的設計與實現 5次下載
- 基于VxWorks的文件系統的研究與實現
- 基于C51的數據存儲器文件系統設計及實現
- YAFFS嵌入式文件系統應用研究
- Bresenham算法在LCM上的C51實現
- 基于μC/OS-II的文件系統設計
- 在嵌入式Linux上實現JFFS文件系統
- 如何修改buildroot和debian文件系統 254次閱讀
- Linux系統如何擴展文件系統 684次閱讀
- 事務性日志結構文件系統的設計及實現 541次閱讀
- Linux 文件系統層的主要結構 872次閱讀
- LPC55S69在RT-Thread上的SDIO驅動和文件系統 1048次閱讀
- C程序設計基礎-文件系統 673次閱讀
- FatFS文件系統在STM32F4上的移植和應用 2245次閱讀
- 什么是分布式文件系統 3990次閱讀
- 基于FPGA和Nios II處理器IP軟核實現實現SD卡接口和文件系統的設計 2117次閱讀
- 在QEMU上用Busybox模擬ARM文件系統的步驟 3101次閱讀
- 使用RT-Thread文件系統 8484次閱讀
- 文件系統是什么?淺談EXT文件系統歷史 5548次閱讀
- debian安裝zfs文件系統 1w次閱讀
- 玩轉Linux,先把文件系統搞懂 2009次閱讀
- 制作ZedBoard上linux根文件系統(ramdisk) 1513次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關電源基礎知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統的設計與實現
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機開發板設計
- 0.70 MB | 2次下載 | 免費
- 751單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機的RGB調色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21548次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多