《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > YAFFS在嵌入式Linux系統中的構建與改進
YAFFS在嵌入式Linux系統中的構建與改進
來源:電子技術應用2012年第3期
熊胤琪,嚴 華
四川大學 電子信息學院,四川 成都610065
摘要: 針對目前YAFFS文件系統啟動時間過長、磨損平衡性差的缺陷,在借助嵌入式平臺Linux-2.6.28+ARMS3C2440構建YAFFS的基礎上改進文件系統,即在啟動時采用空間換取時間策略,為文件屬性節點分配專門的存儲區,減少掃描區域,達到縮短加載時間的目的;在垃圾回收時采用擦除計數機制,根據計數器選擇擦除塊,從而改善擦除塊間的磨損平衡。通過實驗證明了改進策略的有效性。
中圖分類號: TP317
文獻標識碼: A
文章編號: 0258-7998(2012)03-0033-04
Construction and improvement of YAFFS file system based on the embedded Linux system
Xiong Yinqi,Yan Hua
College of Electronics and Information Engineering, Sichuan University, Chengdu 610065,China
Abstract: To solve the problems of the YAFFS file system in start-up times and wear leveling, two improvement strategies are used to implement YAFFS file system based on the embedded Linux-2.6.28 and ARM S3C2440 microprocessor. One is the strategy of trading space for time,namely,a specific storage is distributed for attribute node in order to decrease scan range and reduce mounting time; and the other is the method of choosing erasing blocks according to the mechanism of erasing count, which is good for improving wear leveling. Finally, the effectiveness is proved by the experimental results.
Key words : YAFFS;embedded Linux;mounting time;wear leveling

    在嵌入式Linux的開發工作中,常用的存儲設備有NorFlash和NandFlash,其中價格低廉并適用于高密度和大容量存儲的NandFlash運用更為廣泛[1]。YAFFS(Yet Another Flash File System)文件系統是專門針對NandFlash的特殊構造設計的,是一種日志結構的文件系統,性能超越了原有的JFFS系列文件系統。但隨著嵌入式技術的發展,在NandFlash介質上的嵌入式Linux中構造YAFFS時,YAFFS存在掛載時間過長和損耗均衡性不足兩方面的缺點,需要進一步改進和優化。

1 YAFFS文件系統
    在嵌入式所用的NandFlash中,基本的讀寫單位是頁(page),YAFFS的存儲位也是頁(一般稱為Chunk),分為附加區(OOB)和數據區。32頁組成塊(block)是基本的擦除單位[2]。由于YAFFS的文件偏移地址和閃存的物理地址不一致而建立了一張文件與物理頁的映射表。閃存的頁序號作為表內容,以每頁描述的文件偏移量作為表索引,再把這張大的映射表分為若干小表,組織成樹結構,以提高文件數據塊的查找速度。這種在內存中建立的層次索引目錄稱之為節點樹(TnodeTree),是YAFFS的核心模型,如圖1所示。在節點樹中按照邏輯索引(Logical chunk index)找到物理地址索引(Physical chunk index)。當文件變大時,所需的葉子節點也會增加,此時節點樹就會“拔高”和“增肥”。當文件進行刪除操作時,用遞歸的方法從葉節點向上收縮,釋放已被刪除節點對應的物理頁。

2 構建YAFFS文件系統
2.1 實驗平臺

    開發過程中運用的是目標板與宿主機的交叉編譯模式。宿主機即PC機,采用的是虛擬機+Linux RedHat9.0系統;目標板的硬件是ARM板,采用的是一塊S3C2440的ARM9微處理器,帶有一塊256 MB的NandFlash、64 MB的SDRAM內存。目標板采用的開發軟件是嵌入式Linux2.6.28+交叉編譯工具arm-Linux-gcc4.3.1。YAFFS文件系統的開發流程如圖2所示,引導程序Boot-Loader一般是固定在開板的Flash中(這里不做詳解)。

2.2 內核移植
    (1)修改交叉編譯環境,使其適用于本實驗平臺。修改頂級Makefile中定義的ARM編譯器,使之與所采用的平臺處理器相對應。修改如下:
    ARCH = arm
    CROSS_COMPILE = /usr/local/3.4.1/arm-linux-
    同時,為了支持實驗平臺處理器12 MHz的晶振頻率,修改Linux提供的輸入時鐘,在文件arch/arm/mach-s3c2440/mach-smdk2440.c中定義s3c24xx_init_clocks
(12 000 000);并且在該文件中將Linux支持的machine名稱改為MACHINE_START(S3C2440,“Study-S3C2440”);最后,修改Linux中默認的機器號,使之與BootLoarder傳遞的機器參數782一致。在arch/arm/tools/math-types中,機器型號語句修改為:
    S3C2440 ARCH_S3C2440     S3C2440     782
    (2)內核支持MTD。MTD是閃存與文件系統的接口,NandFlash、YAFFS文件系統與MTD的聯系如圖3所示。

 

 

    老版本的MTD與NandFlash的兼容不是很好,需要安裝最新的MTD。實現Linux對MTD的支持,首先要在MTD子系統內添加NandFlash的硬件設備驅動。在arch/arm/plat-s3c2440目錄下的文件common-smdk.c中定義了Flash硬件平臺的驅動信息,在文件中定義了結構體static struct mtd-partition partition-info[],表示閃存的MTD分區信息,這里將NandFlash分為5個MTD分區,分區內容如下:
[0] = {    .name    = "Boot",
        .size        = 0x00100000,
        .offset    = 0
      },    //mtd0分區,大小為1 MB,相對偏移地址為0x0
[1] = {    .name    = "MyApp",
        .size        = 0x003c0000,
        .offset    = 0x00140000,
      },    //mtd1分區,存儲應用程序
[2] = {    .name    = "Kernel",
        .size        = 0x00300000,
        .offset    = 0x00500000,
      },    //mtd1分區,用于存放內核
[3] = {    .name    = "filesystem",
        .size        = 0x03c00000,    
        .offset    = 0x00800000,
      },    //mtd3分區,大小為30 MB, 用于存放文件系統
[4]……
    }
    在該文件中,還定義了Flash的總線寬度、基本讀寫操作以及硬件相關的控制引腳,可根據相應的需求進行修改。
    (3)增加內核對YAFFS的支持。首先將最新的YAFFS源碼包放入Linux內核的/fs目錄中,執行解壓操作,/fs目錄中添加了YAFFS文件系統的源碼;然后在內核中對YAFFS進行配置,相應地修改為:在/fs/Makefile中增加obj-$(CONFIG_YAFFS_FS)+=yaffs/;在/fs/Kconfig中增加source“fs/yaffs/Kconfig”。
    (4)編譯內核。在Linux2.6.28內核目錄下執行make menuconfig操作,在內核配置菜單中選中支持MTD、NandFlash和YAFFS文件系統的選項。注意一定要選擇選項Let yaffs do its own ECC,因為制作出來的YAFFS文件系統映像中附加區的數據包含了ECC校驗算法。此算法與NandFlash的MTD中的校驗算法不相同,會造成MTD認為頁校驗錯誤;之后運行make zImage,在/linux2.6.28/arch/arm/boot中形成壓縮的內核鏡像zImage,通過S3C2440的專用串口工具DWN,將鏡像燒寫到kernel分區。
2.3 YAFFS根文件系統制作
    (1)制作文件系統。首先,創建文件系統根目錄rootfs,并且在根目錄下創建子目錄bin和sbin(存放自帶命令)、etc(系統配置文件)、proc、lib(程序運行的動態鏈接庫)、user、dev(系統支持的設備文件);然后,安裝Linux的常用命令集Busybox,安裝其源碼到Linux根目錄下,修改其中的makefile,實現交叉編譯:
    ARCH = arm
    CROSS_COMPILE = /usr/arm-linux-
    在Busybox的目錄下執行make menuconfig,進入配置菜單,根據需求添加選項。編譯后將install目錄下的文件拷貝到/rootfs中;其次,安裝交互程序Bash,使系統可進入交互界面,源碼包解壓后,同樣修改鏈接路徑為:export PATH =/usr/local/arm/3.4.1/bin;編譯后將得到的bash靜態鏈接程序拷貝到/rootfs/bin目錄中;最后,建立系統的配置文件及編寫啟動腳本,系統啟動訪問的第一個腳本etc/inittab,編輯etc/init.d/rcS腳本,執行掛載文件系統Ramfs和sysfs的命令,還可以在etc/rc.local中配置系統IP地址。
    (2)制作YAFFS文件系統鏡像。在YAFFS源碼文件包中有util工具包,對工具包中makefile的交叉編譯路徑進行修改,編譯后得到mkyaffsimage工具。根目錄下執行:. /mkyaffsimage /rootfs rootfs.yaffs。
    (3)YAFFS根文件系統燒寫。修改內核的配置參數rootsystem=YAFFS,通過DWN把rootfs.yaffs鏡像文件燒到filesystem分區。啟動系統就會顯示啟動信息:VFS: Mounted root (yaffs filesystem)。
3 YAFFS改進策略
    (1)針對掛載YAFFS時需要掃描Flash上所有被使用的塊從而減慢了啟動速度的問題,在文件系統的加載過程中采用空間換取時間的策略,加入索引區,用于存儲文件屬性信息節點[3],但對于閃存較小的嵌入式系統則沒有太大意義。YAFFS在NandFlash的頁中定義和記錄數據Objectpoint_data和file_data,還增加了index_data數據類型,其中記錄了掛載系統時所需要的數據和節點信息,并分配專門記錄這些數據的塊(即索引塊)。在YAFFS中創建index_data類型的數據結構yaffs_monut_index,組織文件屬性的初始化數據的結構,如yaffs_object及部分相關的yaffs_Device、yafffs_BlockInfo和yaffs_Tnode等,索引塊中每頁的存儲結構如圖4所示。

    inode_num和check及其他有用的數據都是存儲在索引塊每頁的附加空間中的標記位。inode_num用于記錄存儲啟動控制信息所用的頁數,掛載時系統只需要掃描索引塊已使用的頁;check記錄了系統卸載時,控制信息是否正常地寫入閃存中,啟動時如能檢查通過后,則采用改進策略掛載系統,否則運行原有機制,掃描所有塊[4]。YAFFS掛載時,系統掃描每一塊第一頁的附加區,若不是索引塊就跳過檢查下一塊;如果是,則讀取該塊,獲取記錄了節點樹中的葉節點數據的信息,重建節點樹[5]。YAFFS文件系統成功掛載,即以一定的存儲空間換取了大量的掛載時間。采用了該策略后,第一次掛載時系統將運行原有啟動機制,卸載時將文件屬性數據寫入索引塊,第二次掛載時則根據默認設置直接讀取啟動數據[6],而且還避免了隨著文件系統增大而啟動變慢的問題。采用空間換取時間的策略后與原YAFFS加載過程的區別如流程圖5所示。

    (2)當YAFFS系統進行寫操作且NandFlash中未分配空間小于預設的閾值時,啟動垃圾回收機制,選取最臟塊擦除。YAFFS文件系統的垃圾回收策略結合了隨機策略的平衡性和貪心策略的高效性,回收機制包括:回收不再使用的臟塊以及對存有有效數據的壞塊進行處理。但回收算法具有隨機性,系統有可能總是選中同一個塊,認定它是最臟的塊,并連續地擦除回收,造成惡性的使用,而NandFlash的擦除次數是有限的(大約在10次左右)。出現惡性的使用會造成閃存中的部分塊損壞,而其他塊使用次數卻極少,縮短了閃存的壽命。
    (3)針對YAFFS的磨損平衡性差的情況,采用了擦除計數機制[7]:在yaffs.guts.h中定義了存儲在NandFlash的附加區中的數據結構yaffs_tags,用來標志每頁的狀態;定義了chunkID、objectID和有效字數等。其中有2 bit的空間是沒有使用的,并從chunkID和objectID分配7 bit,將這9 bit的空間定義為erase_count,用于記錄該頁被擦除的次數。初始值為零,當被擦除時標記為“1”,表示擦除過一次可達到的最大計數值為511。系統垃圾回收的流程圖如圖6所示。當某一塊的擦除次數達到511時,該塊與被擦除數最小的塊交換各自存儲的數據,使頻繁擦寫的塊存儲很少使用的數據,而被擦除次數少的塊存儲頻繁地更新數據[8](如文件屬性信息數據)。當擦除計數達到最大的塊超過70%以上時,將所有的擦除計數值歸零,循環以上的操作,從而實現NandFlash的損耗基本平衡、延長使用壽命、提高文件系統可靠性。
4 性能測試
    按照以上介紹的策略修改YAFFS文件系統相關部分的源代碼,并且根據YAFFS根文件系統構建的基本步驟,將改進后的文件系統作為根文件系統燒寫入目標板。在實驗平臺上,分別對YAFFS和改進后的文件系統進行性能測試和研究。性能測試的主要內容有:各塊的擦除次數和文件系統掛載的時間。在實驗平臺上大量地進行讀寫和刪除操作,在源代碼中也添加擦除計數(只用于計數),兩個文件系統經過相同數量的讀寫和刪除操作后,讀取每塊的擦除次數,分析數據得出:原YAFFS中存在擦除次數為零的塊,而改進后則沒有;原YAFFS的最大擦除次數與最小擦除次數的比值是無窮大,而改進后都在平均值附近波動,起伏不大。文件系統加載測試的主要方法是在內核源碼和文件系統源碼中添加中斷機制和時鐘,安裝評估系統時間的工具PrintkTimes補丁,運用printk輸出所需數據。測試結果如表1所示。由表1可看出,由于第一次啟動時文件屬性信息還未寫入索引區,系統啟動時間與改進前大致相同,但第二次啟動時索引區機制開始工作,直接從索引塊中讀取文件信息,修改后的YAFFS啟動時間已有明顯的改善,表明改進策略達到縮短加載時間的目的。

    在以NandFlash為介質的嵌入式Linux平臺上構建了YAFFS文件系統,并在原有YAFFS文件系統的基礎上,對YAFFS的啟動時間和損耗平衡進行優化。通過測試證明,啟動時間相比原文件系統縮短了一半以上,且實現了NandFlash的摩擦損耗基本保持平衡,優于改進前的文件系統。
參考文獻
[1] 胡德鵬,李仁發.一種微嵌入式Flash文件系統—uEFFS.電子技術應用,2007,33(7):27-29.
[2] 應駿,江峰,李莉.嵌入式系統上的文件系統優化設計[J]. 電子技術應用,2007,33(12):141-144.
[3] Cao Lu,Shao Shi.A fast mounting method for NAND Flash file system.computer research and development(ICCRD)[C]. 2011 3rd International Conference,2011:416-420.
[4] 楊春林,雷航.NandFlash的嵌入式文件系統的改進與優化[J].計算機應用,2007,27(12):3102-3104.
[5] RYU J,PARK C.Fast initialization and memory management Techniques for log-based flash memory file systems, Proceeding[C]. of the International Conference on Embedded and Systems,Daegu,Korea,May,2007.
[6] CHAN S P,TAE H H.Fast mounting method for NAND Flash memory, advanced communication technology(ICACT)    [C]. The 12th International Conference.2011:416-420.
[7] KEE H J,TAE H H.Efficient garbage collection policy and  block management method for NAND Flash memory[C].2010  2nd International Conference on Mechanical and Electronics   Engineering(ICMEE 2010):327-331.
[8] Yuan-Hao Chang,Jen-Wei Hsieh,Tei-WeiKuo.Improving  Flash wear-leveling by proactively moving static data[C]. IEEE Transactions on Computers,January,2010:53-65.

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
久久aⅴ国产欧美74aaa| 欧美不卡福利| 亚洲国产婷婷| 久久激情五月婷婷| 午夜激情综合网| 亚洲一区二区久久| 日韩视频永久免费| 日韩视频欧美视频| 亚洲精品一区二区三区樱花 | 亚洲综合色自拍一区| 夜夜嗨av色综合久久久综合网| 亚洲国产成人av在线| 在线精品高清中文字幕| 亚洲成色777777女色窝| 在线免费观看一区二区三区| 在线观看欧美日韩国产| 亚洲大片av| 亚洲激情在线观看视频免费| 亚洲欧洲日韩女同| 亚洲免费激情| 中文av一区特黄| 亚洲摸下面视频| 欧美一区二区视频观看视频| 久久精品欧美日韩| 亚洲精品一区在线观看香蕉| aⅴ色国产欧美| 亚洲视频高清| 欧美专区日韩视频| 久久亚洲美女| 欧美人牲a欧美精品| 欧美性大战xxxxx久久久| 国产精品爽爽ⅴa在线观看| 国产欧美精品久久| 韩国av一区二区三区在线观看| 韩国精品在线观看| 亚洲高清免费在线| 一本高清dvd不卡在线观看| 亚洲一区在线看| 久久精品国产欧美激情| 久久夜色精品一区| 日韩视频一区| 亚洲免费网址| 国产伦精品一区二区三区照片91 | 午夜久久一区| 亚洲国产成人av| 一本久道久久综合中文字幕| 亚洲欧美日韩爽爽影院| 久久久精品一区二区三区| 欧美大片在线观看一区| 欧美性天天影院| 国内精品免费午夜毛片| 亚洲欧洲一区二区在线播放| 亚洲丝袜av一区| 久久精品电影| 亚洲一区二区黄色| 久久久亚洲国产天美传媒修理工| 欧美国产日韩免费| 国产美女一区二区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 久久精品视频亚洲| 欧美精品1区| 国产日韩免费| 亚洲三级视频| 欧美亚洲专区| 亚洲视频一二| 蜜桃久久精品乱码一区二区| 国产精品vvv| 亚洲大片在线观看| 午夜欧美不卡精品aaaaa| 亚洲理论在线| 久久久久久久久久看片| 欧美日韩国产精品成人| 韩日视频一区| 亚洲午夜精品网| 亚洲老板91色精品久久| 久久国产精品黑丝| 欧美三日本三级三级在线播放| 一区二区三区在线观看欧美 | 欧美在线视频播放| 欧美日韩中字| 亚洲激情在线观看视频免费| 欧美一区二区大片| 亚洲一区二区三区国产| 欧美激情a∨在线视频播放| 国一区二区在线观看| 亚洲天堂偷拍| 在线一区免费观看| 免费观看日韩av| 国产日韩免费| 亚洲性感激情| 亚洲深夜激情| 欧美精品三级日韩久久| 黄色成人小视频| 亚洲欧美一区二区激情| 中文无字幕一区二区三区| 欧美成年人视频| 狠狠色伊人亚洲综合网站色| 亚洲欧美国产高清| 午夜激情综合网| 欧美性猛交xxxx乱大交蜜桃| 日韩视频不卡| 99国产精品久久| 欧美激情亚洲另类| 亚洲国产三级| 亚洲欧洲综合另类在线| 麻豆国产精品va在线观看不卡| 国产揄拍国内精品对白| 欧美亚洲一区在线| 久久国产精品第一页| 国产欧美日韩麻豆91| 亚洲一区二区三区免费观看| 亚洲一区二区三区午夜| 欧美日韩国产精品一区| 日韩视频在线一区二区| 一区二区免费在线观看| 欧美激情视频一区二区三区免费 | 久久久欧美精品| 国产日韩精品视频一区| 亚洲欧美卡通另类91av| 欧美一区二区三区在线观看| 国产精品一区二区三区久久| 亚洲制服欧美中文字幕中文字幕| 亚洲免费在线精品一区| 国产精品国码视频| 亚洲欧美大片| 久久国产欧美| 激情小说亚洲一区| 亚洲国产欧美一区二区三区久久| 美日韩免费视频| 亚洲区国产区| 亚洲图片在线| 国产精品大片wwwwww| 亚洲一区影院| 久久久久久久综合| 亚洲成色精品| 一级成人国产| 国产精品青草久久久久福利99| 亚洲欧美日韩国产精品| 久久激情视频| 在线观看中文字幕不卡| 日韩视频免费观看高清完整版| 欧美日韩激情小视频| 亚洲色图综合久久| 久久国产精品一区二区三区| 激情综合电影网| 99热这里只有精品8| 国产精品久久一区主播| 欧美一区免费| 欧美激情一区二区三区全黄 | 日韩午夜在线视频| 亚洲欧美精品在线| 国产亚洲精品aa午夜观看| 亚洲国产高清视频| 欧美另类专区| 亚洲在线一区| 美国成人直播| 日韩亚洲精品视频| 久久精品1区| 亚洲黄网站黄| 午夜精品久久久久久久久久久| 黄色日韩在线| 一区二区三区国产在线| 国产欧美一区二区三区国产幕精品 | 一区二区三区日韩欧美| 国产精品永久免费观看| 亚洲品质自拍| 国产农村妇女毛片精品久久莱园子| 亚洲国产高清aⅴ视频| 欧美亚洲不卡| 亚洲欧洲偷拍精品| 国产精品久久久久久久久久免费看 | 性欧美video另类hd性玩具| 在线看片成人| 香蕉久久精品日日躁夜夜躁| 在线精品国产欧美| 午夜久久电影网| 亚洲国产精品小视频| 欧美在线观看www| 亚洲人成久久| 久久久久久9| 99亚洲一区二区| 久久香蕉精品| 在线一区二区三区做爰视频网站| 久久综合九色99| 亚洲午夜精品17c| 欧美va亚洲va国产综合| 亚洲欧美电影院| 欧美日韩另类字幕中文| 亚洲福利视频一区| 国产精品久久99| 亚洲精品中文字幕在线| 国产一区二区久久| 亚洲一区视频在线| 亚洲国产精品久久久久婷婷884| 欧美一区中文字幕| 亚洲视频 欧洲视频| 欧美韩日视频| 亚洲黄色影院| 国产一区二区三区直播精品电影| 亚洲自拍另类|