YAFFS2在嵌入式系統中的實(shí)現
3.2 嵌入式Linux內核移植
目前Linux內核還沒(méi)有正式支持YAFFS文件系統,所以需要通過(guò)補丁修改Linux內核,另外YAFFS文件系統也需要MTD設備驅動(dòng)的支持。首先下載最新版本的2.6內核,這里以linux-2.6.29.4為例。盡管Linux 2.6并不是一個(gè)真正的實(shí)時(shí)操作系統,但其改進(jìn)的特性能夠滿(mǎn)足系統響應需求。再下載YAFFS代碼包。內有YAFFS和YAFFS 2兩個(gè)文件夾。其中YAFFS已經(jīng)不再維護,進(jìn)入YAFFS2。文件夾內有patch-ker.sh補丁文件,使用以下命令將YAFFS2加入到Linux內核。

以上命令完成了三件事情:
(1)修改內核fs/Kconfig。增加一行:source”fs/YAFFS2/Kconfig”。
(2)修改內核fs/Kconfig。增加一行:ojb-MYM(CONFIG_YAFFS_FS)+=YAFFS2/。
(3)在內核fs/目錄下創(chuàng )建YAFFS2目錄;將YAFFS2源碼目錄下面的Makefile.kernel文件復制為內核fs/YAFFS2/Makefie;將YAFFS2源碼目錄的Kconfig文件復制到內核fs/YAFFS2目錄下;將YAFFS2源碼目錄下的*.C*.h文件復制到內核fs/YAFFS2目錄下。
進(jìn)入內核目錄,修改makefile,并對內核進(jìn)行默認配置進(jìn)行修改,使其支持本開(kāi)發(fā)板。

結合U-Boot信息修改NAND FLASH分區,使其兩者結構大小保持一致。注意分區的大小要以128 kB為單位。

根據具體NAND FLASH芯片特性,修改tacls,twrph0,twrphl的值。
修改arch/arm/tools/math-types文件,使其Linux內核的機器號與Bootloader傳遞來(lái)的參數一致。建立好交叉編譯環(huán)境,在環(huán)境變量PATH中添加交叉編譯工具路徑?;蛘咧苯釉趍akefile文件內添加修改也可以。使用make s3c2410_defconfig命令,將2410的默認配置文件寫(xiě)到當前目錄下的.config。使用make me-nuconfig命令配置內核模塊的功能,要選中MTD和YAFFS2支持。在Boot options選項中增加以下語(yǔ)句。

使用make zImage命令,生成是zlmage映像文件。再用mkimage工具制作ulmage,uImage是U-Boot專(zhuān)用的映像文件,它在zImage之前加上一個(gè)長(cháng)度為0x40的“頭”,說(shuō)明這個(gè)映像文件的類(lèi)型、加載位置、生成時(shí)間、大小等信息。
3.3 制作文件系統
嵌入式Linux系統都需要構建根文件系統,構建根文件系統的規則在文件系統層次標準(Filesystem Hi-erarchy Standard,FHS)文檔中。首先建立根文件系統目錄和動(dòng)態(tài)鏈接庫,然后使用Busybox工具可以生成根文件系統所需的bin,sbin,usr目錄和linuxrc文件。Bosybox是一個(gè)遵循GPL v2協(xié)議的開(kāi)源項目,它在編寫(xiě)過(guò)程總對文件大小進(jìn)行優(yōu)化,并考慮了系統資源有限(比如內存等)的情況,為嵌入式系統提供了一個(gè)比較完整的工具集。
YAFFS2源代碼包內除了本身文件系統代碼外,utils 目 錄下還包含了 mkYAFFSimage/mkYAFFS2image的代碼,修改Makefile里的內核路
徑編譯出mkYAFFSimage/mkYAFFS2image工具。其中mkYAFFSimage用于制作512 B的小頁(yè)YAFFS文件系統,mkYAFFS2image用于制作2 KB以上的大頁(yè)YAFFS2文件系統。輸入以下格式命令,制作出支持大頁(yè)的YAFFS2文件系統映像。
mkYAFFS2image MYM{PRJROOT}rootfs rootfs.YAFFS
通過(guò)mkYAFFS2image制做出來(lái)的映像文件其OOB中包含的ECC是使用YAFFS2/YAFFS ecc.c文件中的YAFFS ECCCaimJlate函數計算出來(lái)的
ECC校驗碼,其校驗算法和nand ecc.c文件內的nand_calculate_ecc函數校驗算法不同,如果在內核中由MTD來(lái)處理ECC,當讀取NAND FLASH中的數據時(shí),會(huì )通過(guò)nand_calculate_ecc函數的算法再生成一個(gè)新的ECC校驗和,校驗的時(shí)候,將從OOB區中讀出的原ECC校驗和新ECC校驗和按位異或,其錯誤的結果會(huì )造成系統認為所有的頁(yè)面都是錯誤的。解決辦法有兩種,一是在內核編譯時(shí)把Lets YAFFS do itsown ECC選上,同時(shí)修改內核把MTD驅動(dòng)中的ECC校驗關(guān)閉;二是修改mkYAFFS2image.c文件,使其制作image時(shí)使用nand_caleulate_ecc函數的校驗算法,在內核編譯時(shí)不要把Lets YAFFS do its own ECC選上,同時(shí)打開(kāi)MTD驅動(dòng)中的ECC校驗。
3.4 系統測試
啟動(dòng)系統后,Bootloader首先運行,然后它將內核復制到內存中,并且在內存某個(gè)固定的地址設置好要傳遞給內核的參數,最后運行內核。內核啟動(dòng)之后,它會(huì )將文件系統掛載為根文件系統,接著(zhù)啟動(dòng)文件系統中的應用程序。啟動(dòng)途中會(huì )顯示如下信息:

以上信息說(shuō)明系統已經(jīng)找到NAND FLASH設備,并識別出分區。進(jìn)入系統后,輸入下面命令。

在輸出結果中,顯示了YAFFS2的相關(guān)信息,說(shuō)明Linux內核已經(jīng)支持YAFFS2文件系統。
建立掛載點(diǎn),掛載blockdevice設備。

查看mount上的目錄,可以看到該目錄下有剛才拷貝的文件,將其umount后,再次mount上來(lái),發(fā)現拷貝的文件仍然存在,這時(shí)刪除該文件然后umount,再次mount后,發(fā)現拷貝的文件已經(jīng)被刪除,說(shuō)明該分區能正常讀/寫(xiě)。
在FLASH上建立根文件系統:

重新啟動(dòng),改變啟動(dòng)參數:

重新啟動(dòng),內核可以從NAND FLASH啟動(dòng)根文件系統。
4 結語(yǔ)
大頁(yè)NAND FLASH的快速擦除、讀/寫(xiě)性能滿(mǎn)足了系統對實(shí)時(shí)性的要求,YAFFS2可靠的掉電保護和高效率的讀寫(xiě)以及對NAND FLASH存儲設備的保護等優(yōu)勢增加了整個(gè)系統的安全性和健壯性,兩者的結合達到了裝備對數據的大容量存儲和管理的需求。目前,該系統已裝備于某部,用于實(shí)時(shí)監測裝備的戰技術(shù)狀況,以及長(cháng)時(shí)間實(shí)時(shí)記錄裝備工作數據,用于事后分析評估裝備性能和操作手水平,在部隊作訓中發(fā)揮了重大作用。本文引用地址:http://dyxdggzs.com/article/151830.htm linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論