Chinaunix首页 | 论坛 | 博客
  • 博客访问: 932843
  • 博文数量: 153
  • 博客积分: 4195
  • 博客等级: 上校
  • 技术积分: 2631
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-22 11:32
文章存档

2012年(7)

2010年(35)

2009年(111)

分类:

2009-06-22 12:57:52

最近一直在研究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()这个函数。
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/myleeming/archive/2009/04/10/4062523.aspx
阅读(1608) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~