OOB--linux-2.6.22下文件系统的移植

文章详细解析了NANDFlash中的OOB区及其在YAFFS文件系统中的作用,包括数据块大小、存储层次、ECC检验码和文件系统组织信息等。并通过实例介绍了如何修改YAFFS文件系统代码,以适应新的数据结构和提高文件系统性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NAND Flash中的OOB

NAND Flash由NAND Flash控制器和NAND Flash芯片(例如K 9F1208U0A)两大部分组成。当要访问NAND Flash芯片中的数据时,必须通过NAND Flash控制器发送命令才能完成。所以, NAND Flash相当于MCU的一个外设,并不位于MCU的内存地址区。

一片NAND Flash就是一个设备(device), 其数据存储分层为:

1设备(Device) 4096 块(Blocks);

1块(Block) 32页 (Pages) 

1块(Page) 528字节(Bytes) 数据块大小(512Bytes) OOB区大小(16Bytes)

现在也有数据块大小为1024字节或2048字节的NAND Flash。在NAND Flash中每一页中,最后16个字节(又称OOB)存放ECC(Error Correction Code)检验码和文件系统的组织信息,用于错误检测和坏块处理。当文件系统被挂载时,只须扫描存储器的OOB区就能将文件系统信息读入内存,并且驻留在内存中,这样不仅加快了文件系统的加载速度,也提高了文件的访问速度,但是增加了内存的消耗。前面的512个数据字节又分为前半部分和后半部分。可以通过NAND Flash的命令对前半部、后半部、OOB区进行定位,使NAND Flash内置的指针指向各自的首地址。

  YAFFS文件系统的代码修改

通过以上的对OOB区的结构的分析,可以得出我们需要修改YAFFS文件系统代码的两处:一是ECC校验码的位置,把校验码从OOB区中第8、9、10、13、14和15移到第0、1、2、3、6、和7字节。二是可用空间的数据结构的定义,上文提到新的数据结构的定义已经包含在yaffs_packedtags1.h中了,所以可以直接利用这段代码,而不需要重新去定义了。

下面将具体的讲述如何去修改这些代码,以使makeyaffsimage工具能够生成新格式的YAFFS文件系统。

(1)  增加头文件;

修改makeyaffsimage.c,增加上这一行。

#include “yaffs_packedtags1.h”

在yaffs_packedtags1.h文件中定义了新格式的YAFFS可用空间的数据结构。

(2)  修改makeyaffsimage.c文件中的write_chunk函数。

修改makeyaffsimage.c文件中的write_chunk函数为:

    static int write_chunk(__u8 *data, __u32 objId, __u32 chunkId, __u32 nBytes)

     {

      ifdef CONFIG_YAFFS_9BYTE_TAGS

    yaffs_Tags t;

    yaffs_Spare s;

     ……

  else

    yaffs_PackedTags1 pt1;

    yaffs_ExtendedTags  etags;

    __u8 ecc_code[6];

    __u8 OOBbuf[16];

 

 

    error = write(outFile,data,512);

  if(error < 0) return error;

 

 

    etags.chunkId       = chunkId;

    etags.serialNumber  = 0;

    etags.byteCount     = nBytes;

    etags.objectId      = objId;

etags.chunkDeleted  = 0;

 

 

yaffs_PackTags1(&pt1, &etags);

 

 

    yaffs_CalcTagsECC((yaffs_Tags *)&pt1);

 

    memset(OOBbuf, 0xff, 16);

    memcpy(OOBbuf+8, &pt1, 8);

 

 

    nand_calculate_ecc(data, &ecc_code[0]);

    nand_calculate_ecc(data+256, &ecc_code[3]);

 

    OOBbuf[0] = ecc_code[0];

    OOBbuf[1] = ecc_code[1];

    OOBbuf[2] = ecc_code[2];

    OOBbuf[3] = ecc_code[3];

OOBbuf[6] = ecc_code[4];   

OOBbuf[7] = ecc_code[5];

 

    nPages++;

 

   

    return write(outFile, OOBbuf, 16);

#endif 

 }

在新的代码中,设置新tag结构中增加了chunkDeleted成员,并将计算出来的ECC校验码填入新的ECC的位置,它正是nand_OOB_16结构中的eccpos数组定义的位置。其中nand_calculate_ecc函数是从内核文件drivers/mtd/nand/nand_ecc.c修改而来的。在本文中,内核和文件系统采用的ECC校验为MTD设备层的NAND_ECC_SOFT。在原来的代码中,YAFFS文件系统使用的是yaffs2/yaffs_ecc.c文件中的yaffs_ECC_Calculate函数来计算ECC校验码,但是在本文中配置内核时使用的是ECC校验为MTD设备层的NAND_ECC_SOFT,为了使映像文件和内核保持一致,我们修改了mkyafsimage代码,使用了nand_calculate_ecc函数。

(3) 添加文件,修改Makefile.

在上面的write_chunk函数中的yaffs_PackTags1是在yaffs_packedtags1.h中定义的,所以需要将这个文件复制到当前的目录。

$ cp  ../yaffs_packedtags1.c    ./

另外nand_calculate_ecc函数是新加的nand_ecc.c中定义的,所以要修改Makefile,把yaffs_packedtags1.c和nand_ecc.c也编译进mkyaffsimage工具中。

找到Makefile中的这样一行:

MKYAFFSSOURCES = mkyaffsimage.c

修改为:

MKYAFFSSOURCES = mkyaffsimage.c  yaffs__packedtags1.c  nand_ecc.c

现在,在YAFFS的代码yaffs2/utils目录下执行“make”命令生成的mkyaffsimage工具,就可以制作出支持linux-2.6.22.6版本的文件系统了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值