溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Yaffs_guts垃圾回收怎么實現(xiàn)

發(fā)布時間:2021-12-30 15:48:58 來源:億速云 閱讀:207 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容主要講解“Yaffs_guts垃圾回收怎么實現(xiàn)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Yaffs_guts垃圾回收怎么實現(xiàn)”吧!

1.垃圾回收

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

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

奧,為了防止頁數(shù)小于8的情況,照樣分配一個Stride

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

個人感覺:這里應(yīng)該就是犧牲塊選擇算法需要做的東西

if(bi->blockState == YAFFS_BLOCK_STATE_FULL &&

   (bi->pagesInUse - bi->softDeletions )< pagesInUse)

//pages_in_use:該擦除塊中被使用的chunk數(shù)目,包括已經(jīng)被soft delete的chunk

{

dirtiest = b;

pagesInUse = (bi->pagesInUse - bi->softDeletions);

}

如果找不到就返回-1

3.static void yaffs_BlockBecameDirty(yaffs_Device *dev,int blockNo)//將某一塊變?yōu)榕K塊

4.static int yaffs_FindBlockForAllocation(yaffs_Device *dev)//尋找可分配塊

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

useReserve表示是否使用保留空間。yaffs2文件系統(tǒng)并不會將所有的存儲空間全部用于存儲文件系統(tǒng)數(shù)據(jù),而要空出部分block用于垃圾收集時使用。一般情況下這個參數(shù)都是0,只有在垃圾收集時需要分配存儲空間的情況下將該參數(shù)置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))//如果帶掃描頁中存在內(nèi)容

v if(object && object->deleted && tags.chunkId != 0)//如果該頁中是數(shù)據(jù)

{刪除數(shù)據(jù),并且刪除對應(yīng)的Object}

v 刪除Object

        if(tags.chunkId == 0)

{

//它是一個 header

object->chunkId = newChunk;

object->serial = tags.serialNumber;

}

else

{

// 它是一個 數(shù)據(jù)chunk

yaffs_PutChunkIntoFile(object, tags.chunkId, newChunk,0);

}

最后就是刪除頁yaffs_DeleteChunk(dev,oldChunk,markNAND);

serialNumber:用以辨別哪個Chunk 為最新的Chunk。當更新此Chunk 時,serialNumber 會加1并寫入至其他Block 的Chunk 中,并將原Chunk 的設(shè)為Invalid(表此Data Chunk 已無效),但若在將該Chunk 設(shè)為Invalid 之前則發(fā)生了斷電(Power Lost)的突發(fā)事件,當電源回復并再重新掃描Flash Memory 時,會檢查某一yaffs_Object 到有兩個一樣的Chunk(其ChunkID 相同),但其serialNumber 不同,則會比較此二Chunk的serialNumber,以辨別出哪個Chunk 為較新的Data,并將較舊Data 的Chunk 設(shè)為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去區(qū)

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)//為了防止掉電時候出現(xiàn)重復頁,所以設(shè)置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)//只檢查前兩頁

到此,相信大家對“Yaffs_guts垃圾回收怎么實現(xiàn)”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI