新闻中心

EEPW首页>嵌入式系统>设计应用> YAFFS2在嵌入式系统中的实现

YAFFS2在嵌入式系统中的实现

作者: 时间:2010-06-01 来源:网络 收藏

3.2Linux内核移植
目前Linux内核还没有正式支持YAFFS文件,所以需要通过补丁修改Linux内核,另外YAFFS文件也需要MTD设备驱动的支持。首先下载最新版本的2.6内核,这里以linux-2.6.29.4为例。尽管Linux 2.6并不是一个真正的实时操作,但其改进的特性能够满足系统响应需求。再下载YAFFS代码包。内有YAFFS和YAFFS 2两个文件夹。其中YAFFS已经不再维护,进入。文件夹内有patch-ker.sh补丁文件,使用以下命令将加入到Linux内核。

以上命令完成了三件事情:
(1)修改内核fs/Kconfig。增加一行:source”fs//Kconfig”。
(2)修改内核fs/Kconfig。增加一行:ojb-MYM(CONFIG_YAFFS_FS)+=YAFFS2/。
(3)在内核fs/目录下创建YAFFS2目录;将YAFFS2源码目录下面的Makefile.kernel文件复制为内核fs/YAFFS2/Makefie;将YAFFS2源码目录的Kconfig文件复制到内核fs/YAFFS2目录下;将YAFFS2源码目录下的*.C*.h文件复制到内核fs/YAFFS2目录下。
进入内核目录,修改makefile,并对内核进行默认配置进行修改,使其支持本开发板。

结合U-Boot信息修改NAND FLASH分区,使其两者结构大小保持一致。注意分区的大小要以128 kB为单位。

根据具体NAND FLASH芯片特性,修改tacls,twrph0,twrphl的值。
修改arch/arm/tools/math-types文件,使其Linux内核的机器号与Bootloader传递来的参数一致。建立好交叉编译环境,在环境变量PATH中添加交叉编译工具路径。或者直接在makefile文件内添加修改也可以。使用make s3c2410_defconfig命令,将2410的默认配置文件写到当前目录下的.config。使用make me-nuconfig命令配置内核模块的功能,要选中MTD和YAFFS2支持。在Boot options选项中增加以下语句。

使用make zImage命令,生成是zlmage映像文件。再用mkimage工具制作ulmage,uImage是U-Boot专用的映像文件,它在zImage之前加上一个长度为0x40的“头”,说明这个映像文件的类型、加载位置、生成时间、大小等信息。
3.3 制作文件系统
Linux系统都需要构建根文件系统,构建根文件系统的规则在文件系统层次标准(Filesystem Hi-erarchy Standard,FHS)文档中。首先建立根文件系统目录和动态链接库,然后使用Busybox工具可以生成根文件系统所需的bin,sbin,usr目录和linuxrc文件。Bosybox是一个遵循GPL v2协议的开源项目,它在编写过程总对文件大小进行优化,并考虑了系统资源有限(比如内存等)的情况,为系统提供了一个比较完整的工具集。
YAFFS2源代码包内除了本身文件系统代码外,utils 目 录下还包含了 mkYAFFSimage/mkYAFFS2image的代码,修改Makefile里的内核路
径编译出mkYAFFSimage/mkYAFFS2image工具。其中mkYAFFSimage用于制作512 B的小页YAFFS文件系统,mkYAFFS2image用于制作2 KB以上的大页YAFFS2文件系统。输入以下格式命令,制作出支持大页的YAFFS2文件系统映像。
mkYAFFS2image MYM{PRJROOT}rootfs rootfs.YAFFS
通过mkYAFFS2image制做出来的映像文件其OOB中包含的ECC是使用YAFFS2/YAFFS ecc.c文件中的YAFFS ECCCaimJlate函数计算出来的
ECC校验码,其校验算法和nand ecc.c文件内的nand_calculate_ecc函数校验算法不同,如果在内核中由MTD来处理ECC,当读取NAND FLASH中的数据时,会通过nand_calculate_ecc函数的算法再生成一个新的ECC校验和,校验的时候,将从OOB区中读出的原ECC校验和新ECC校验和按位异或,其错误的结果会造成系统认为所有的页面都是错误的。解决办法有两种,一是在内核编译时把Lets YAFFS do itsown ECC选上,同时修改内核把MTD驱动中的ECC校验关闭;二是修改mkYAFFS2image.c文件,使其制作image时使用nand_caleulate_ecc函数的校验算法,在内核编译时不要把Lets YAFFS do its own ECC选上,同时打开MTD驱动中的ECC校验。
3.4 系统测试
启动系统后,Bootloader首先运行,然后它将内核复制到内存中,并且在内存某个固定的地址设置好要传递给内核的参数,最后运行内核。内核启动之后,它会将文件系统挂载为根文件系统,接着启动文件系统中的应用程序。启动途中会显示如下信息:

以上信息说明系统已经找到NAND FLASH设备,并识别出分区。进入系统后,输入下面命令。

在输出结果中,显示了YAFFS2的相关信息,说明Linux内核已经支持YAFFS2文件系统。
建立挂载点,挂载blockdevice设备。

查看mount上的目录,可以看到该目录下有刚才拷贝的文件,将其umount后,再次mount上来,发现拷贝的文件仍然存在,这时删除该文件然后umount,再次mount后,发现拷贝的文件已经被删除,说明该分区能正常读/写。
在FLASH上建立根文件系统:

重新启动,改变启动参数:

重新启动,内核可以从NAND FLASH启动根文件系统。

4 结语
大页NAND FLASH的快速擦除、读/写性能满足了系统对实时性的要求,YAFFS2可靠的掉电保护和高效率的读写以及对NAND FLASH存储设备的保护等优势增加了整个系统的安全性和健壮性,两者的结合达到了装备对数据的大容量存储和管理的需求。目前,该系统已装备于某部,用于实时监测装备的战技术状况,以及长时间实时记录装备工作数据,用于事后分析评估装备性能和操作手水平,在部队作训中发挥了重大作用。

本文引用地址://m.amcfsurvey.com/article/151830.htm
linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭