Yaffs_guts(三)

1.垃圾回收

1.static int yaffs_InitialiseBlocks(yaffs_Device *dev,int nBlocks)//块初始化

dev->chunkBitmapStride = (dev->nChunksPerBlock+7)/8;//???为什么要+7

奥,为了防止页数小于8的情况,照样分配一个Stride

2.static int yaffs_FindDirtiestBlock(yaffs_Device *dev,int aggressive)//查找最脏快,为了GC

个人感觉:这里应该就是牺牲块选择算法需要做的东西

if(bi->blockState == YAFFS_BLOCK_STATE_FULL &&
   (bi->pagesInUse - bi->softDeletions )< pagesInUse)
//pages_in_use:该擦除块中被使用的chunk数目,包括已经被soft delete的chunk
{
dirtiest = b;
pagesInUse = (bi->pagesInUse - bi->softDeletions);
}

如果找不到就返回-1

3.static void yaffs_BlockBecameDirty(yaffs_Device *dev,int blockNo)//将某一块变为脏块

4.static int yaffs_FindBlockForAllocation(yaffs_Device *dev)//寻找可分配块

5.static int yaffs_AllocateChunk(yaffs_Device *dev,int useReserve)

useReserve表示是否使用保留空间。yaffs2文件系统并不会将所有的存储空间全部用于存储文件系统数据,而要空出部分block用于垃圾收集时使用。一般情况下这个参数都是0,只有在垃圾收集时需要分配存储空间的情况下将该参数置1。

6.static int yaffs_GarbageCollectBlock(yaffs_Device *dev,int block)

for(chunkInBlock = 0,oldChunk = block * dev->nChunksPerBlock;
    chunkInBlock < dev->nChunksPerBlock && yaffs_StillSomeChunkBits(dev,block);
    chunkInBlock++, oldChunk++ )//检测待擦除块,直到将所有页遍历完有效页
Ø if(yaffs_CheckChunkBit(dev,block,chunkInBlock))//如果带扫描页中存在内容
v if(object && object->deleted && tags.chunkId != 0)//如果该页中是数据
{删除数据,并且删除对应的Object}
v 删除Object
 if(tags.chunkId == 0)
{
//它是一个 header
object->chunkId = newChunk;
object->serial = tags.serialNumber;
}
else
{
// 它是一个 数据chunk
yaffs_PutChunkIntoFile(object, tags.chunkId, newChunk,0);
}

最后就是删除页yaffs_DeleteChunk(dev,oldChunk,markNAND);

serialNumber:用以辨别哪个Chunk 为最新的Chunk。当更新此Chunk 时,serialNumber 会加1并写入至其他Block 的Chunk 中,并将原Chunk 的设为Invalid(表此Data Chunk 已无效),但若在将该Chunk 设为Invalid 之前则发生了断电(Power Lost)的突发事件,当电源回复并再重新扫描Flash Memory 时,会检查某一yaffs_Object 到有两个一样的Chunk(其ChunkID 相同),但其serialNumber 不同,则会比较此二Chunk的serialNumber,以辨别出哪个Chunk 为较新的Data,并将较旧Data 的Chunk 设为Invalid。

7.static int yaffs_CheckGarbageCollection(yaffs_Device *dev)

//yaffs检查垃圾回收是否成功

2.TAGS

1.static void yaffs_LoadTagsIntoSpare(yaffs_Spare *sparePtr, yaffs_Tags *tagsPtr)//将tags填充到spare去区

2.yaffs_CheckECCOnTags(tagsPtr);//返回可以恢复的错误为1,不可以回复的错误为-1

3.static void yaffs_GetTagsFromSpare(yaffs_Device *dev, yaffs_Spare *sparePtr,yaffs_Tags *tagsPtr)

//if(result> 0)dev->tagsEccFixed++;

//if(result <0)dev->tagsEccUnfixed++;

4.static int yaffs_ReadChunkTagsFromNAND(yaffs_Device *dev,int chunkInNAND, yaffs_Tags *tags, int *chunkDeleted)

5.static int yaffs_WriteNewChunkWithTagsToNAND(yaffs_Device *dev, const __u8 *buffer, yaffs_Tags *tags, int useReserve)

6.static int yaffs_TagsMatch(const yaffs_Tags *tags, int objectId, int chunkInObject, int chunkDeleted)//进行与object进行匹配,若正确返回1,否则返回0

7.int yaffs_FindChunkInFile(yaffs_Object *in,int chunkInInode,yaffs_Tags *tags)//在文件中查找chunk,如果找到返回theChunk,找不到则返回-1

8.int yaffs_FindAndDeleteChunkInFile(yaffs_Object *in,int chunkInInode,yaffs_Tags *tags)//在文件中删除该页,如果找到返回theChunk,找不到则返回-1

9.static int yaffs_CheckFileSanity(yaffs_Object *in)//检测文件是否正常,如果正常返回1,否则返回0

10.static int yaffs_PutChunkIntoFile(yaffs_Object *in,int chunkInInode, int chunkInNAND, int inScan)//为了防止掉电时候出现重复页,所以设置inScan标志进行判断

11.int yaffs_ReadChunkDataFromObject(yaffs_Object *in,int chunkInInode, __u8 *buffer)

12.static void yaffs_DeleteChunk(yaffs_Device *dev,int chunkId,int markNAND)//将页从文件上删除,然后判断是不是该块上所有的页无效,则将该块标记为脏块,可以进行擦除

13.int yaffs_WriteChunkDataToObject(yaffs_Object *in,int chunkInInode, const __u8 *buffer,int nBytes,int useReserve)

14.int yaffs_UpdateObjectHeader(yaffs_Object *in,const char *name, int force)

3.读写文件

1.int yaffs_ResizeFile(yaffs_Object *in, int newSize)//修改文件大小,如果newSize小于oldSize,则返回newSize,如果oldSize大于newSize,则返回oldSize

2.int yaffs_GetFileSize(yaffs_Object *obj)//给出object,得到文件大小

4.Scanning

1.static int yaffs_IsBlockBad(yaffs_Device *dev, int blk)//只检查前两页

原文发布于微信公众号 - 瓜大三哥(xiguazai_tortoise)

原文发表时间:2016-05-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开发技术

flying-saucer + iText + Freemarker实现pdf的导出, 支持中文、css以及图片

      项目中有个需求,需要将合同内容导出成pdf。上网查阅到了 iText , iText 是一个生成PDF文档的开源Java库,能够动态的从XML或者数...

3911
来自专栏程序猿DD

Spring框架中的设计模式(四)​

本文是Spring框架中使用的设计模式第四篇。本文将在此呈现出新的3种模式。一开始,我们会讨论2种结构模式:适配器和装饰器。在第三部分和最后一部分,我们将讨论单...

3956
来自专栏Spark学习技巧

hadoop系列之MR经典案例分享二

4、MapReduce的join(hive已经实现) http://database.51cto.com/art/201410/454277.htm ? 这三种...

35610
来自专栏wannshan(javaer,RPC)

dubbo监控机制之监控中心实现分析

这里的监控中心以dubbo-ops\dubbo-monitor-simple项目说 总的来说是监控中心启动一个sevlet容器,通过web页面向用户多维度的展...

1.4K6
来自专栏分布式系统进阶

Librdkafka的操作处理队列

2872
来自专栏软件开发

MyBatis学习总结(四)——MyBatis缓存与代码生成

缓存可以提高系统性能,可以加快访问速度,减轻服务器压力,带来更好的用户体验。缓存用空间换时间,好的缓存是缓存命中率高的且数据量小的。缓存是一种非常重要的技术。

2623
来自专栏Java 技术分享

MVC 小案例 -- 信息管理

2955
来自专栏爱撒谎的男孩

地址管理之省市区三级联动菜单

9803
来自专栏Java Web

JavaFX-TableView详解

前言 最近在着手一个学生管理系统的编写,涉及到TableView的使用,这前前后后的也有了些经验和想法想要记录和分享一下(事实上我正在想要用html网页代替界面...

4016
来自专栏Java 技术分享

MVC 小案例 -- 信息管理

962

扫码关注云+社区

领取腾讯云代金券