yaffs2文件系统提供了一种garbage collection机制,在文件系统内部空间不足时,通过GC机制将一些系统认为的脏数据进行回收,以获得新的使用空间。
那么yaffs2文件系统对NAND Flash的废旧数据块的回收条件是怎样的?
回收时数据是如何进行处理的?
回收条件:
总之,会选择最脏的数据块进行回收。
结合上面一张图片,在加上linux kernel中对nand驱动的理解,就能够对代码中对yaffs的整个调用机制有一个深入和正确的理解。
As we have shown so far, when a block is made up only of deleted chunks, that block can be erased and reused. However, consider what will happen if we have many blocks which each have a few current chunks in them. Clearly we cannot erase any of the current blocks or we will destroy data. What we need to do is copy the useful data chunks off a block, deleting the originals and allowing the block to be erased and reused. This process is referred to as garbage collection. 这段话的意思是指:上面啰嗦那么多,都没说明白垃圾回收是咋回事儿,当一个块上面每个chunk(是逻辑概念,相当于物理上的页概念)都是删除的数据,那么这个块就应该被擦除后重用。然而考虑到有很多块里面只有很少的有用数据的情况,很明显就不能够直接擦除或者说删除上面的数据。这种情况应该怎么处理呢?当然我们需要先把这些有用的数据copy出来放在一些可以使用的存储位置上,然后进行擦除重用。这样的一种处理方式就是垃圾回收机制。
Yaffs2 cannot use a deletion marker because that would violate the zero overwrites mandate and alternate mechanisms are provided to determine which chunks are current and which are deleted. 这句话解释了为什么yaffs文件系统不支持overwrite机制却能够知道一个数据块的数据是删除数据。
The chunks are marked as deleted in the RAM data structures used by garbage collection etc, but there is no deletion marker written to flash.因为我们在使用yaffs文件系统管理文件的过程都是将物理上spare区的数据读取到RAM中之后使用的,因此标记信息都存储在RAM上。
上图的描述中,可以看到VFS,那么VFS是怎样的一种概念呢?摘一段百度的介绍:
“Linux下的VFS: