您好,登錄后才能下訂單哦!
本篇內容主要講解“Yaffs_guts垃圾回收怎么實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Yaffs_guts垃圾回收怎么實現”吧!
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檢查垃圾回收是否成功
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)
1.int yaffs_ResizeFile(yaffs_Object *in, int newSize)//修改文件大小,如果newSize小于oldSize,則返回newSize,如果oldSize大于newSize,則返回oldSize
2.int yaffs_GetFileSize(yaffs_Object *obj)//給出object,得到文件大小
1.static int yaffs_IsBlockBad(yaffs_Device *dev, int blk)//只檢查前兩頁
到此,相信大家對“Yaffs_guts垃圾回收怎么實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。