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

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

創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都網站建設、成都做網站、企業(yè)官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯(lián)網時代的靈山網站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(liá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

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

if(bi->blockState == YAFFS_BLOCK_STATE_FULL &&

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

//pages_in_use:該擦除塊中被使用的chunk數(shù)目,包括已經被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ù)據,而要空出部分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))//如果帶掃描頁中存在內容

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

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

v 刪除Object

        if(tags.chunkId == 0)

{

//它是一個 header

object->chunkId = newChunk;

object->serial = tags.serialNumber;

}

else

{

// 它是一個 數(shù)據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 之前則發(fā)生了斷電(Power Lost)的突發(fā)事件,當電源回復并再重新掃描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去區(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)重復頁,所以設置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)”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

網站欄目:Yaffs_guts垃圾回收怎么實現(xiàn)
文章鏈接:http://www.muchs.cn/article6/geeiog.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站策劃、App設計品牌網站建設、企業(yè)網站制作、域名注冊、小程序開發(fā)

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化