YAFFS 文件系统的介绍

一、YAFFS 文件系统

  YAFFS(Yet Another Flash File System)是一个专门为 NAND Flash 存储器设计的嵌入式日志型文件系统,适用于大容量的存储设备,并且是在 GPL 协议下发布,可在其网站免费获得源代码。
  YAFFS 是基于日志的文件系统提供磨损平衡和掉电恢复的健壮性。它还为大容量的Flash 芯片做了很好的调整,针对启动时间和 RAM 的使用做了优化,它适用于大容量的存储设备

二、YAFFS 文件系统的特点

  在YAFFS中,文件是以固定大小的数据块进行存储的,块的大小可以是512字节、1024字节或者2048字节。每个文件(包括目录)都有一个数据块头与之相对应,数据块头中保存了ECC(Error Correction Code)和文件系统的组织信息,用于错误检测和坏块处理。YAFFS把这个数据块头存储在Flash的16字节备用空间中。

YAFFS文件系统的主要优势包括:
①支持大容量NAND FLASH芯片:相比于其他文件系统,YAFFS能够更好地支持大容量的NAND FLASH芯片,满足大容量存储需求。
②性能优越:YAFFS是专门为NAND flash设计的,因此在NAND flash上的读写性能非常优秀,能够提供更快的数据读写速度。
③易于移植:YAFFS提供了直接调用的模式,使得它更容易在不同的硬件平台上进行移植。
  在文件系统进行改写时,YAFFS总是先写入新的数据块,然后将旧的数据块从文件中删除。这种机制即使在修改文件时意外掉电,丢失的也只是这一次修改数据的最小写入单位,从而实现了掉电保护,保证了数据完整性。
  此外,YAFFS文件系统还采用了高效的映射结构来把文件位置映射到物理位置,以及树型结构来组织文件的数据段,这些设计都进一步提高了文件系统的性能和可靠性。

三、名词介绍

YAFFS 专有名词
Page:页单元为基础操作(读操作或写操作或坏块标记)的寻址单元,包括通用区和扩展区,通用区主要用于存储数据,扩展区主要用于存储标记性信息;
Block:块单元为擦除操作的寻址单元;
OOB:存在于扩展区,其中包括 ECC、坏块标记、YAFFS 标记等,通常每 512 字节对应 16 字节的 OOB区,每 2048 字节对应 64 字节的 OOB 区;
YAFFS2 模式下的 YAFFS 标记:

  • 4 字节 32-bit 的数据块 ID;
  • 4 字节 32-bit 的对象 ID;
  • 2 字节本数据块内数据字节数量;
  • 4 字节本块的序列号;
  • 3 字节标记区的 ECC;
  • 12 字节数据区的 ECC(每 256Byte 数据产生 3Byte 的 ECC)。

Chunk:YAFFS 的寻址单元,通常与 Page 大小一致;
Object:YAFFS 对象,通常包括文件、路径、链接、设备等。

四、YAFFS 分区信息

指令

/proc/yaffs 
cd /proc
cat yaffs

在这里插入图片描述

详细信息,参考如何确定当前yaffs2文件系统数据参数

对于YAFFS2文件系统来说,我们可以通过cat /proc/yaffs来获取它的第一手资料,当然最主要还是着手于代码。

[dvr]$ cat /proc/yaffs
Multi-version YAFFS built:Aug 11 2014 12:20:16
Device 0 "File System"
start_block.......... 0         //nand flash当前分区的起始块,相对于分区来的,所以这个值所有的分区都是0
end_block............ 2037     //当前分区结束块
total_bytes_per_chunk 2048     //页大小
use_nand_ecc......... 1     //是否使用nandecc
no_tags_ecc.......... 0     //是否对yaffs2数据进行校验ecc,纯软件的
is_yaffs2............ 1     //
inband_tags.......... 0     
empty_lost_n_found... 1
disable_lazy_load.... 0
refresh_period....... 500     //刷新同期,这个值与回收相关,具体见回收机制一文
n_caches............. 10
n_reserved_blocks.... 5     //系统保留块,使用它表示系统真没空间可用了
always_check_erased.. 0     //擦除一个块后,是否进行块擦除有效检查,一般不检查,太乱费时间了
data_bytes_per_chunk. 2048     //这个也相当于页大小
chunk_grp_bits....... 0
chunk_grp_size....... 1
n_erased_blocks...... 1449     //当前可使用的好块
blocks_in_checkpt.... 0     //checkpt机制正使用的块数,这个比较重要
n_tnodes............. 3011
n_obj................ 745
n_free_chunks........ 92950     //当前可使用的好块 * 64 + 待回收的chunk
n_page_writes........ 281
n_page_reads......... 19684
n_erasures........... 3
n_gc_copies.......... 193
all_gcs.............. 40
passive_gc_count..... 40
oldest_dirty_gc_count 3
n_gc_blocks.......... 3
bg_gcs............... 3
n_retired_writes..... 0
n_retired_blocks..... 0
n_ecc_fixed.......... 0
n_ecc_unfixed........ 0
n_tags_ecc_fixed..... 0
n_tags_ecc_unfixed... 0
cache_hits........... 0
n_deleted_files...... 0
n_unlinked_files..... 0
refresh_count........ 1
n_bg_deletions....... 0
tags_used............ 34752
summary_used......... 2772

下面具体分析需要考虑的几点:
start_block.......... 0         //nand flash当前分区的起始块,相对于分区来的,所以这个值所有的分区都是0
end_block............ 2037     //当前分区结束块
n_erased_blocks...... 1449     //当前可使用的好块
blocks_in_checkpt.... 0     //checkpt机制正使用的块数,这个比较重要
n_free_chunks........ 92950     //当前可使用的好块 * 64 + 待回收的chunk
tags_used............ 34752
summary_used......... 2772
由start_block和end_block决定当前分区的总的空间大小:(0 + 2037) + 1 = 2038块  =》A;
tags_used与summary_used表示当前正在被使用的空间:(34752 + 2772) = 37524页 =》B;
n_free_chunks和n_erased_blocks可得出当前的垃圾页:(92950 - 1449 * 64) = 214页 =》 C;
n_erased_blocks得出当前系统正可以申请的块:1449块 =》D;

另外还有一个要考虑,就是坏块: E

E= A - B - C - D = 0;


下面来个具体有坏块的打印分析:(注意下面显示数据之前,我标记了1451个坏块)
[dvr]$ cat /proc/yaffs
Multi-version YAFFS built:Aug 11 2014 12:20:16
Device 0 "File System"
start_block.......... 0
end_block............ 2037
total_bytes_per_chunk 2048
use_nand_ecc......... 1
no_tags_ecc.......... 0
is_yaffs2............ 1
inband_tags.......... 0
empty_lost_n_found... 1
disable_lazy_load.... 0
refresh_period....... 500
n_caches............. 10
n_reserved_blocks.... 5
always_check_erased.. 0
data_bytes_per_chunk. 2048
chunk_grp_bits....... 0
chunk_grp_size....... 1
n_erased_blocks...... 1
blocks_in_checkpt.... 0
n_tnodes............. 3011
n_obj................ 745
n_free_chunks........ 87
n_page_writes........ 553
n_page_reads......... 19962
n_erasures........... 10
n_gc_copies.......... 461
all_gcs.............. 97
passive_gc_count..... 97
oldest_dirty_gc_count 9
n_gc_blocks.......... 9
bg_gcs............... 9
n_retired_writes..... 0
n_retired_blocks..... 1451
n_ecc_fixed.......... 0
n_ecc_unfixed........ 0
n_tags_ecc_fixed..... 0
n_tags_ecc_unfixed... 0
cache_hits........... 0
n_deleted_files...... 0
n_unlinked_files..... 0
refresh_count........ 1
n_bg_deletions....... 0
tags_used............ 34752
summary_used......... 2772

下面直接将几个有用的数据拿出来分析:
start_block.......... 0
end_block............ 2037 
n_erased_blocks...... 1
blocks_in_checkpt.... 0 
n_free_chunks........ 87 
tags_used............ 34752
summary_used......... 2772
由start_block和end_block决定当前分区的总的空间大小:(0 + 2037) + 1 = 2038块  =》A;
tags_used与summary_used表示当前正在被使用的空间:(34752 + 2772) = 37524页 =》B;
n_free_chunks和n_erased_blocks可得出当前的垃圾页:(87 - 1* 64) =23页 =》 C;
n_erased_blocks得出当前系统正可以申请的块:1块 =》D;
另外还有一个要考虑,就是坏块: E

E= A - B - C - D = 2038 * 64 - 37524 - 23 - 1 * 64 = `在这里插入代码片`

参考:
Yaffs文件系统简介

  • 15
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值