重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
YAFFS是第一个专门为NAND Flash存储设计的嵌入式文件系统,适用于大容量的存储设备,并且是在GPL协议下发布的,可在其网站免费获得源代码。YAFFS也是目前SylixOS下针对Flash类存储设备的主要文件系统。
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名与空间、虚拟空间、营销软件、网站建设、曲麻莱网站维护、网站推广。
在SylixOS中,想要在Flash类存储设备上挂载YAFFS文件系统,需要创建struct yaffs_dev结构体,并填充一系列的启动参数,并再将yaffs_dev结构体注册进YAFFS,其具体流程如程序清单2. 1所示。
程序清单2. 1 YAFFS启动参数
static struct yaffs_dev __GyaffsDev; /* 定义YAFFS设备结构体 */ __GyaffsDev.param.name = cBootDevName; __GyaffsDev.param.total_bytes_per_chunk = pmtdinfoMtd->writesize; __GyaffsDev.param.chunks_per_block = pmtdinfoMtd->erasesize/pmtdinfoMtd->writesize; __GyaffsDev.param.n_reserved_blocks = 10; __GyaffsDev.param.start_block = NAND_N0_SATRT_BLOCK; __GyaffsDev.param.end_block = __GyaffsDev.param.start_block +NAND_N0_BLOCK_NUM; __GyaffsDev.param.spare_bytes_per_chunk = pmtdinfoMtd->oobsize; __GyaffsDev.param.is_yaffs2 = 1; __GyaffsDev.param.use_nand_ecc = 1; __GyaffsDev.param.no_tags_ecc = 0; __GyaffsDev.param.n_caches = 10; __GyaffsDev.driver_context = (void *)pmtdinfoMtd; __GyaffsDev.os_context = (void *)&__GyaffsDev; __GyaffsDev.param.inband_tags = 1; yaffs_mtd_drv_install(&__GyaffsDev); yaffs_add_device(&__GyaffsDev); /* 添加到YAFFS设备 */ yaffs_mount(cBootDevName); /* 挂载YAFFS设备 */
__GyaffsDev.param参数说明如下:
这里需要特别说明的是,挂载YAFFS文件系统后,Flash的每一页都会存在一个tags的结构体,用来记录YAFFS的相关信息,上面的参数inband_tags就表示tags存放的位置,tags的大小为16字节,其定义如程序清单2. 2所示。
程序清单2. 2 tags信息
struct yaffs_packed_tags2_tags_only { unsigned seq_number; unsigned obj_id; unsigned chunk_id; unsigned n_bytes; };
inband_tags参数的值为0时,表示tags存放在Flash页的OOB区域内,值为1时,表示tags存放在Flash页的数据区域内,值得注意的是,对于页大小为512字节的Nand Flash,它的OOB区域大小只有16字节,并且这些字节需要用于记录坏块、ECC校验等信息,不足以保存YAFFS的tags信息,因此页大小为512字节的Nand Flash需要将inband_tags参数设置为1。
另外,对于页大小非512字节的Nand Flash,如果由于控制器需要记录额外信息等原因导致OOB区不足,理论上也可以将tags存放到数据区域内,但在SylixOS中使用时会出现错误,原因未知,可能是YAFFS版本过低导致的,因为低版本YAFFS确实存在这个问题。