新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > YAFFS文件系統在嵌入式Linux系統中的構建與改進

        YAFFS文件系統在嵌入式Linux系統中的構建與改進

        作者: 時間:2013-09-13 來源:網絡 收藏

        老版本的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)增加內核對的支持。首先將最新的源碼包放入Linux內核的/fs目錄中,執行解壓操作,/fs目錄中添加了的源碼;然后在內核中對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所示。

        linux相關文章:linux教程




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 博乐市| 根河市| 德州市| 竹北市| 五指山市| 乳源| 闽侯县| 东莞市| 岫岩| 伊金霍洛旗| 抚州市| 武陟县| 孟州市| 石台县| 鸡西市| 右玉县| 秦皇岛市| 胶州市| 沭阳县| 和龙市| 图木舒克市| 民丰县| 重庆市| 防城港市| 东阳市| 平塘县| 东至县| 兴宁市| 景谷| 建湖县| 邻水| 涞水县| 青冈县| 内乡县| 桐梓县| 贡嘎县| 泽库县| 新巴尔虎右旗| 石渠县| 双牌县| 鹿邑县|