最近一直在研究yaffs,准备写个专题系列,当然现在的整理有点零散,而且一些我理解的想法不一定正确,现在先以笔记的形式把我的理解过程记录下来,之后会整理成一个更系统的关于yaffs的专题。
2009 04 10
yaffs的缓存机制
由于nandflash是有一定的读写次数的,所以在对一个文件进行操作的时候往往是先通过缓冲进行,对最后一次性写入nandflash,这有效的减少了用户对nandflash的频繁操作,延长了nandflash的寿命。
下面大致说一下yaffs的缓存机制:
1.首先在yaffs_mount的时候会对yaffs_dev这个结构体进行注册,和缓冲部分相关的有:
dev->nShortOpCaches//这个变量决定了有多少个缓冲,因为缓冲会大量的占用堆栈的空间,所以在yaffs不建议缓冲的数量很大,即使你填一个很大的数,系统也不会超过YAFFS_MAX_SHORT_OP_CACHES的总数。
yaffs_ChunkCache *srCache;//缓冲区的首地址,dev->srCache = YMALLOC( dev->nShortOpCaches * sizeof(yaffs_ChunkCache));
下面介绍一下缓冲区这个结构体的组成:
typedef struct
{
struct yaffs_ObjectStruct *object;//一个缓冲区对应一个文件
int chunkId;
int lastUse; //通过lastUse来
int dirty; //标志了这一个缓冲区是否被使用
int nBytes;
__u8 data[YAFFS_BYTES_PER_CHUNK];//数据区
} yaffs_ChunkCache;
2.什么时候用到缓冲区?
用到缓冲区最多的地方显而易见是对已经创建的文件进行写操作。而且是需要写的大小和512不一致的时候,这是因为如果是刚好512的话,系统会直接写入nandflash中。对于小于512的系统首先会调用yaffs_FindChunkCache(in,chunk)这个函数来判断in这个object是否在缓冲区中存在。如果存在会调用已有缓冲区进行操作。当然如果是第一次对一个object进行操作,肯定在缓冲区中是不存在对应它的空间的,因此系统会调用yaffs_GrabChunkCache函数为此次操作分配一个缓冲区。
深入一下yaffs_GrabChunkCache函数:
首先会调用yaffs_GrabChunkCacheWorker(dev)函数来寻找一个non_dirty 缓冲区;
如果能有空闲的缓冲区,直接将这个缓冲区返回;否则的话将清理一个缓冲区出来;
通过遍历算法,找出最近使用的缓冲区,由于这个缓冲区中的数据还是属于它的object,因 此在使用之前先要将缓冲区的这些数据写入nandflash中,也就是 yaffs_FlushFilesChunkCache()这个函数。
阅读(1948) | 评论(0) | 转发(1) |