色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Micrium全家桶之uC-FS: 0x02 NAND FTL算法原理詳解

嵌入式USB開(kāi)發(fā) ? 來(lái)源:嵌入式USB開(kāi)發(fā) ? 作者:嵌入式USB開(kāi)發(fā) ? 2023-06-08 10:55 ? 次閱讀

本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注

Micrium全家桶之uC-FS: 0x02 NAND FTL算法原理詳解 (qq.com)

前言

uC-FS的NAND驅(qū)動(dòng)實(shí)現(xiàn)基于一篇論文:《KAST: K-Associative Sector Translation for NAND Flash Memory in Real-Time Systems》所以有必要先介紹下該論文的內(nèi)容,以便后面理解代碼的實(shí)現(xiàn)。

物理地址和邏輯地址的映射

NAND的特點(diǎn)是寫(xiě)數(shù)據(jù)前必須擦除,即擦除后數(shù)據(jù)為1,寫(xiě)只能由1寫(xiě)為0.擦除單位為塊,寫(xiě)數(shù)據(jù)單位為頁(yè),對(duì)于SLC塊一般由64個(gè)PAGE組成,而PAGE一般大小是2KB。

FTL管理物理地址和邏輯地址的映射,根據(jù)管理的顆粒度,可以分為塊(BLOCK)級(jí)別的映射,和頁(yè)(PAGE)級(jí)別的映射。前者更新數(shù)據(jù)以塊為單位,后者以頁(yè)為單位。

對(duì)于塊級(jí)別的管理,哪怕是只更新塊的一個(gè)PAGE的數(shù)據(jù),所有屬于該塊的不需要修改的PAGE數(shù)據(jù)和需要修改的PAGE的數(shù)據(jù)都需要重新寫(xiě)入一個(gè)新開(kāi)辟出來(lái)的物理塊中。使得管理成本變高。

為了獲得更高的性能,一般頁(yè)級(jí)別的管理用的更多。

假設(shè)一個(gè)塊由64個(gè)頁(yè)組成。開(kāi)始時(shí)邏輯頁(yè)地址為0的PAGE,映射到第二個(gè)物理塊的第一個(gè)PAGE,其頁(yè)物理地址為64.那么當(dāng)需要更新邏輯地址為0的PAGE時(shí),只需要將更新的內(nèi)容寫(xiě)入第65個(gè)物理PAGE,將映射表的對(duì)應(yīng)關(guān)系,由邏輯PAGE地址為0映射原來(lái)的物理PAGE地址64,改為映射物理PAGE地址65。因?yàn)镹AND是塊擦除,PAGE編程,所以塊擦除后后面的PAGE寫(xiě)不再需要擦除。后續(xù)再繼續(xù)更新邏輯PAGE地址0的時(shí)候,再往后映射到66等等,直到最后映射到第127個(gè)物理頁(yè)。此時(shí)再更新邏輯PAGE0時(shí)則需要將第二個(gè)物理塊的內(nèi)容復(fù)制到新開(kāi)辟的塊中了,然后將該物理塊擦除又可以作為新的更新塊使用。注:上述的物理塊2即為更新塊或者LOG塊, 可以看出基于頁(yè)的管理擦除次數(shù)遠(yuǎn)低于基于塊的管理,后者每更新一個(gè)PAGE都需要擦除一個(gè)塊然后寫(xiě)一個(gè)塊,而前者擦除次數(shù)大大減少。

基于PAGE管理的缺點(diǎn)是需要更大的映射表緩存,因?yàn)轭w粒度變小了,一個(gè)PAGE就需要一個(gè)映射項(xiàng),這對(duì)于嵌入式領(lǐng)域尤其是資源受限的場(chǎng)景是一個(gè)限制。

塊回收

以上舉例的是基于更新塊,LOG的方式,即更新一個(gè)邏輯PAGE的內(nèi)容不是直接修改其對(duì)應(yīng)的物理PAGE的內(nèi)容,而是將其內(nèi)容寫(xiě)入一個(gè)更新塊的某個(gè)PAGE,然后修改其映射關(guān)系,直到更新塊寫(xiě)完或者更新塊不夠用了,然后將更新塊的內(nèi)容寫(xiě)入一個(gè)新開(kāi)辟的塊,修改映射關(guān)系,此時(shí)原來(lái)的塊就是無(wú)效的了。隨著修改的增多無(wú)效塊越來(lái)越多,無(wú)法開(kāi)辟新的塊了此時(shí)就需要回收無(wú)效塊。

需要注意的是上述無(wú)效塊中可能有一部分PAGE是包含有效數(shù)據(jù)一部分是無(wú)效數(shù)據(jù)的,所以如果需要回收,需要將其有效數(shù)據(jù)復(fù)制到新開(kāi)辟的塊中,然后擦除該無(wú)效塊,此時(shí)該塊就可以作為后續(xù)開(kāi)辟塊使用了。上述回收工作需要遍歷所有塊的所有PAGE是一個(gè)非常耗時(shí)的過(guò)程,并且時(shí)間是波動(dòng)的,且波動(dòng)很大,這種波動(dòng)是不適合嵌入式場(chǎng)景的,尤其是實(shí)時(shí)系統(tǒng)的。

混合管理

綜合塊管理的性能低,管理消耗大,需要緩存低;頁(yè)管理的需要緩存大,性能高,管理消耗低的優(yōu)缺點(diǎn),混合管理方式是一個(gè)妥協(xié)或者綜合的方式。

很多領(lǐng)域在面對(duì)矛盾的時(shí)候解決辦法就是綜合,妥協(xié)取中間,這也契合中庸的哲學(xué)思想。

這種綜合的方式

將物理塊分為數(shù)據(jù)塊DATA BLOCK和日志塊LOG BLOCK,日志塊稱為L(zhǎng)OG BUFFER,基于該方式的FTL即稱為log buffer-based FTL。所謂的綜合或者混合即LOG BLOCK采用PAGE級(jí)別的管理,而DATA BLOCK采用塊級(jí)別的管理。LOG BLOCK的最大數(shù)量決定了PAGE級(jí)別映射表的大小。當(dāng)有寫(xiě)更新請(qǐng)求時(shí),先將更新數(shù)據(jù)寫(xiě)入LOG BLOCK原來(lái)舊的DATA BLOCK的數(shù)據(jù)設(shè)置為無(wú)效,如果LOG塊寫(xiě)滿且沒(méi)有空閑的LOG塊時(shí)則需要將LOG塊的有效內(nèi)容(注意LOG塊中不一定全部是有效數(shù)據(jù))移動(dòng)到空閑的DATA塊中,然后擦除LOG塊以便后面繼續(xù)作為L(zhǎng)OG BUFFER使用。上述過(guò)程即稱為塊合并block merge。

block merge是基于LOG塊的,只有LOG塊寫(xiě)滿且無(wú)LOG塊可用時(shí)才會(huì)執(zhí)行merge,所以其比基于PAGE的管理的垃圾回收消耗低很多,而又不需要太大的映射表緩存(因?yàn)榛赑AGE管理的LOG塊數(shù)量不多),所以更適合于嵌入式系統(tǒng)

塊關(guān)聯(lián)映射block associative mapping (BAST Block Associative Sector Translation )

一個(gè)LOG塊只關(guān)聯(lián)一個(gè)DATA塊,即只有同一個(gè)DATA塊的PAGE數(shù)據(jù)可以寫(xiě)入同一個(gè)LOG塊。

圖片

如上圖LLBN表示LOG塊邏輯地址,這里有4個(gè)LOG塊分別是L0~L3

LBN表示DATA塊邏輯地址,這里有6個(gè)DATA塊,分別是B0~B5

LPN表示PAGE邏輯地址

每個(gè)塊有4個(gè)PAGE。

當(dāng)PAGE有更新時(shí),將PAGE數(shù)據(jù)寫(xiě)入LOG塊,同時(shí)將DATA塊中的PAGE置為無(wú)效(灰色部分)

假設(shè)按照p16 p20 p1 p5的次序更新,最開(kāi)始更新p16時(shí)將p16寫(xiě)入L0,設(shè)置B4中的p16無(wú)效,然后更新p20,此時(shí)L0中已經(jīng)有關(guān)聯(lián)的B4的數(shù)據(jù)了,由于一個(gè)LOG塊只能關(guān)聯(lián)一個(gè)DATA塊,所以p20不能寫(xiě)入L0,只能找后續(xù)的寫(xiě)入L1,后面的p1寫(xiě)入L2,p5寫(xiě)入L3也是同樣的道理。此時(shí)如果繼續(xù)有B2和B3的PAGE需要更新,而此時(shí)4個(gè)LOG塊都關(guān)聯(lián)了非B2和B3的塊,此時(shí)就需要merge LOG塊,釋放LOG塊來(lái)關(guān)聯(lián)新的B2和B3的修改。

如果數(shù)據(jù)更新是隨機(jī)的,那么BAST性能會(huì)比較差,因?yàn)檫@會(huì)導(dǎo)致頻繁的MERGE操作,因?yàn)橐粋€(gè)LOG塊只能映射一個(gè)DATA塊,隨機(jī)的多個(gè)DATA塊更新很快就使得LOG塊不夠用需要MERGE。這即所謂的LOG塊抖動(dòng)問(wèn)題log block thrashing problem。

同時(shí)上述過(guò)程可以看到每次LOG塊MERGE時(shí)只有一個(gè)PAGE有效,剩余的3個(gè)PAGE是空的,所以空間利用率很低。

全關(guān)聯(lián)映射fully associative mapping (FAST Fully Associative SectorTranslation )

一個(gè)LOG塊可關(guān)聯(lián)任意的DATA塊,一個(gè)LOG塊可以寫(xiě)入任意DATA塊的數(shù)據(jù)。

該方式可以解決BAST的LOG塊抖動(dòng)問(wèn)題。

圖片

如上圖所示一個(gè)LOG塊可以關(guān)聯(lián)任意的DATA塊,所以只有一個(gè)LOG塊的所有PAGE寫(xiě)滿才會(huì)執(zhí)行MERGE,所以大大減少了MERGE操作。

PAGE按更新次序依次寫(xiě)入LOG塊,而不管它來(lái)自于哪個(gè)DATA塊,這可以解決LOG塊抖動(dòng)問(wèn)題。

上述示例的是按照p0, p4, p8, p12, p16, p20,p1, p5 的更新次序,先寫(xiě)滿L0,然后寫(xiě)滿L1,此時(shí)都還不需要進(jìn)行MERGE,而如果是BAST從p16開(kāi)始就需要merge了。

特別的FAST會(huì)使用一個(gè)sequential log block (SLB) 塊。該塊只關(guān)聯(lián)一個(gè)DATA塊,且該塊內(nèi)的PAGE按照in-place scheme 機(jī)制寫(xiě)(按照PAGE的邏輯地址順序和偏移依次對(duì)應(yīng)寫(xiě)),所以SLB可以采用switch merge 和 partial merge方式。

然而FAST也有缺點(diǎn),即一個(gè)LOG塊可以關(guān)聯(lián)任意的DATA塊,所以MERGE操作消耗非常大,比如上述的L0關(guān)聯(lián)了4個(gè)DATA塊,所以MERGE時(shí)需要更新4個(gè)BLOCK的數(shù)據(jù),需要擦除4個(gè)塊,每個(gè)塊有4個(gè)PAGE所以需要拷貝4次PAGE,一共需要拷貝4x4=16個(gè)PAGE。而B(niǎo)AST只關(guān)聯(lián)一個(gè)DATA BLOCK沒(méi)有這個(gè)問(wèn)題。

定義DATA塊關(guān)聯(lián)到LOG塊L的集合A(L),A(L)中元素的個(gè)數(shù)表示L的關(guān)聯(lián)性,表示為k(L)

所以LOG塊的MERGE消耗是

N · k(L) · Ccopy + (k(L) + 1) · Cerase

擦除次數(shù)是k(L) + 1,所有關(guān)聯(lián)的DATA塊需要擦除,還有LOG塊也需要擦除。

復(fù)制次數(shù)是N · k(L),N是每個(gè)塊的PAGE數(shù),k(L)個(gè)DATA塊即k(L)*N

k(l)最大即為塊中PAGE數(shù)N。所以最壞的merge時(shí)間是N^2Ccopy +(N +1)Cerase。

由于N的變化范圍很大,比如SLC一般是一個(gè)塊是64個(gè)PAGE,MLC是128個(gè)PAGE所以k(L)變化很大,所以上述公式計(jì)算出來(lái)的最好和最壞情況差別很大,也就是程序運(yùn)行時(shí)間抖動(dòng)很大,不適合嵌入式系統(tǒng)使用。

組關(guān)聯(lián)映射set associative mapping (SAST Set Associative Sector

Translation )

一組LOG塊可以關(guān)聯(lián)一組DATA塊的PAGE。

N個(gè)LOG塊只能用于K個(gè)DATA塊,即N:K log block mapping 。

所以LOG塊最大的塊關(guān)聯(lián)度是k。

圖片

如上圖所示是

2:3 mapping SAST 2個(gè)LOG塊最多只能關(guān)聯(lián)3個(gè)DATA塊。

所以SAST是BAST和FAST的中間妥協(xié)版本,可以綜合優(yōu)化但是不能完全解決兩者的問(wèn)題。

MERGE

前面提到的LOG塊的MERGE分為三種

full merge,

Partial **merge ** , switch merge

Partial merge即LOG塊中只有部分PAGE,這些PAGE是按照邏輯PAGE的次序和偏移對(duì)應(yīng)的,還有一些間隙此時(shí)需要從DATA塊中復(fù)制這些間隙PAGE,然后和LOG塊中的內(nèi)容一起寫(xiě)入新的DATA塊。

switch merge即LOG塊中已經(jīng)是和一個(gè)DATA塊對(duì)應(yīng)的序列PAGE,且寫(xiě)滿,可以直接變?yōu)镈ATA塊。

Partial merge 和switch merge 只有LOG塊內(nèi)的PAGE是按照邏輯PAGE地址對(duì)應(yīng)的PAGE偏移順序?qū)懭霑r(shí)才有可能,這種方式稱為in-place機(jī)制。

KAST:K-associative mapping

BAST的MERGE太頻繁性能差,而FAST則是MERGE不頻繁但是每次MERGE的時(shí)間差異很大,都有缺點(diǎn)。所以都不適合嵌入式系統(tǒng)。

此時(shí)我們又要用到中庸思想了,本論文提出的K-associative mapping即類(lèi)似于FAST,但是限制其關(guān)聯(lián)度,以減少最壞情況的消耗。

KAST整體架構(gòu)

有以下特征

l減少LOG的關(guān)聯(lián)度,不同的LBNs 更新盡可能對(duì)應(yīng)不同的LOG塊,類(lèi)似于BAST。

lLOG塊最多只關(guān)聯(lián)K個(gè)DATA塊。保證 k(L) ≤ K,通過(guò)控制參數(shù)K控制最壞的MERGE時(shí)間

l包含多個(gè)SLBs ,不同于FAST只有一個(gè)SLB。SLBs的個(gè)數(shù)通過(guò)參數(shù)配置。

如果沒(méi)有后續(xù)的順序?qū)懭胝?qǐng)求,則可以將SLB更改為隨機(jī)日志塊(RLB),這里是一個(gè)很重要的思想,即動(dòng)態(tài)變化,不死板,既然后面沒(méi)有連續(xù)的PAGE寫(xiě)入了,就認(rèn)為是隨機(jī)寫(xiě),就把他作為RLB塊來(lái)用,這種思想值得借鑒,即走一步看一步,結(jié)合實(shí)際情況進(jìn)行決定。

SAST也是通過(guò)將K個(gè)數(shù)據(jù)塊與日志塊集相關(guān)聯(lián),使日志塊的塊關(guān)聯(lián)性低于K,通過(guò)對(duì)數(shù)據(jù)塊和日志塊進(jìn)行分組,SAST可以在無(wú)形中解決塊抖動(dòng)問(wèn)題。

但KAST不將數(shù)據(jù)塊和日志塊分組,只是限制LOG塊的最大關(guān)聯(lián)度,這是不同點(diǎn)。

此外,KAST試圖通過(guò)在不同的日志塊之間分配不同LBN上的寫(xiě)請(qǐng)求來(lái)最小化每個(gè)日志塊L的k(L)的值

圖片

如上是一個(gè)kAST的示例

寫(xiě)序列p0, p4, p8, p12, p16, p20,p1, p5 ,KAST為不同的數(shù)據(jù)塊分配寫(xiě)請(qǐng)求。

首先,頁(yè)面p0、p4、p8和p12被寫(xiě)入不同的日志塊,這是盡可能減少LOG塊關(guān)聯(lián)的DATA塊數(shù)的思想。

然后p16和p20沒(méi)辦法只能關(guān)聯(lián)到L0和L1增加這兩個(gè)LOG塊的關(guān)聯(lián)度,注意這里是分配到L0和L1而不是都分配到L0,同樣是上述盡可能減少LOG塊關(guān)聯(lián)的DATA塊數(shù)的思想。

最后,頁(yè)p1和p5被寫(xiě)入日志塊L0和L1,因?yàn)閜1所在的DATA塊已經(jīng)有p0在L0中了,所以p1放在 L0中不增加日志塊的關(guān)聯(lián)性,同樣是上述的思想。

總之一句話即盡可能減少LOG塊的關(guān)聯(lián)性,即減小 k ( L ) 。只有LOG快不夠了再去考慮增加LOG塊的關(guān)聯(lián)度。作為一種特殊情況,SLB只與一個(gè)數(shù)據(jù)塊相關(guān)聯(lián)。當(dāng)日志塊被分配時(shí),它被確定為SLB或RLB。

以下是LOG塊的狀態(tài)機(jī)

F , S Ri 狀態(tài)分別表示空閑SLB,和i關(guān)聯(lián)度的RLB。

初始化狀態(tài)是F,即LOG塊是空閑的沒(méi)有關(guān)聯(lián)數(shù)據(jù)。

圖片

F狀態(tài)可變?yōu)镾或者R1狀態(tài),

Ri狀態(tài)寫(xiě)PAGE,如果該P(yáng)AGE已經(jīng)屬于之前關(guān)聯(lián)的塊了則不增加關(guān)聯(lián)度,狀態(tài)不變,否則關(guān)聯(lián)度增加,變?yōu)镽i+1狀態(tài)。

如果SLB狀態(tài)寫(xiě)PAGE,維持其次序,則SLB狀態(tài)S也不改變。

Ri+1也可以變?yōu)镽i狀態(tài),如果對(duì)應(yīng)的PAGE寫(xiě)到了其他的LOG塊,本LOG塊的PAGE設(shè)置為了無(wú)效。

只有在SLB的一小部分被有效數(shù)據(jù)占用的情況下,SLB才能變?yōu)闋顟B(tài)為R1或R2的RLB。

partial 或switch merge 操作將SLB日志塊改變?yōu)镕狀態(tài),

full merge 操作將RLB改變?yōu)镕狀態(tài),Ri狀態(tài)的RLB full merge消耗為N · i · Ccopy + (i + 1) · Cerase.

寫(xiě)LOG BUFFER

當(dāng)一個(gè)PAGE需要寫(xiě)入LOG BUFFER時(shí),需要查找LOG塊中有空閑空間的寫(xiě)入,如果找不到則需要進(jìn)行l(wèi)og block merge操作,這個(gè)過(guò)程比較復(fù)雜,如下

首先查找是否有RLB,這個(gè)RLB中已經(jīng)有了待寫(xiě)入PAGE對(duì)應(yīng)的DATA塊的其他PAGE,如果有則可以將PAGE寫(xiě)入該RLB而不增加關(guān)聯(lián)度,如下圖的(b)。

如果這個(gè)PAGE在DATA塊中的偏移是0,可以將這個(gè)塊寫(xiě)入SLB的第一個(gè)PAGE,因?yàn)槲覀儾聹y(cè)后續(xù)可能是連續(xù)的序列操作,這樣可以都放入一個(gè)SLB可以使用部分或者switch merge。如果后面不是序列寫(xiě)也沒(méi)關(guān)系,可以再變?yōu)镽LB,如下圖的(c)。。

那么如果以上兩個(gè)條件都滿足呢? 這時(shí)我們先按照(b)Append的策略寫(xiě)入RLB而先不去搜索SLB。

然后再單獨(dú)分配一個(gè)SLB。

直到后續(xù)后面RLB中的PAGE又有需要更新時(shí),再將RLB中的PAGE序列寫(xiě)入SLB中,將RLB中的PAGE設(shè)置為無(wú)效,如下圖(d)

開(kāi)始時(shí)(a)->更新p0->p0放入RLB中->更新p1 p5->將p0 p1 p5按照page序號(hào)偏移寫(xiě)入SLB->從DATA塊中復(fù)制未更新的p2 p3 p4到SLB中補(bǔ)齊。

以上的思想是猜測(cè)更新塊的第一個(gè)PAGE時(shí)可能不是隨機(jī)寫(xiě),后面可能有連續(xù)次序更新所以使用SLB。

圖片

如果需要更新的PAGE所在的塊已經(jīng)和一個(gè)SLB關(guān)聯(lián),則需要將這個(gè)PAGE寫(xiě)入這個(gè)SLB。如果這個(gè)寫(xiě)不需要破壞SLB中原來(lái)PAGE的次序則可以直接寫(xiě)入。

如果寫(xiě)入這個(gè)PAGE和原來(lái)SLB中已有的PAGE中間有一個(gè)小間隙,則可以直接寫(xiě)入,如下圖(b),原來(lái)SLB中有p0 p1 p2更新p5則可以直接寫(xiě)入該SLB,中間p3 p4需要padding。

而如果上述間隙比較大,或者SLB中已經(jīng)有了相應(yīng)的PAGE,如下圖SLB中已經(jīng)有了p0 p1 p2 此時(shí)認(rèn)為后面間隙比較大,或者已經(jīng)有了p0 p1 p2 p5,此時(shí)要更新p5,p5已經(jīng)在SLB中了,這兩種情況都又有兩種策略

第一種是使用partial merge,先將SLB merge到DATA塊, merge同時(shí)更新p5到DATA塊.

間隙的p3 p4 p6 p7需要從DATA塊中拷貝出來(lái),一并merge到新的DATA塊中,如下圖(c)。

還有一種策略,如(d)將p5添加到SLB中,此時(shí)p5和前面的p0~p1不屬于同一個(gè)DATA塊則增加了關(guān)聯(lián)度。只有當(dāng)SLB中free page比較多時(shí)采用后者,因?yàn)檫@種情況我們猜測(cè)后續(xù)的序列更新的概率很小。此外,既然SLB中有很多空閑頁(yè)面,那么最好繼續(xù)使用,而不是執(zhí)行部分合并。

圖片

如果找不到上述LOG塊,即更新的PAGE所在的DATA塊已經(jīng)和LOG關(guān)聯(lián),那么就只能增加LOG塊的關(guān)聯(lián)度。

下一步進(jìn)行時(shí)先檢查是否有SLB已經(jīng)完成的(即已經(jīng)按序列寫(xiě)滿),如果有則擦除這個(gè)SLB對(duì)應(yīng)的DATA塊,將這個(gè)SLB變?yōu)镈ATA塊,即switch merge。

由于交換機(jī)合并沒(méi)有頁(yè)面復(fù)制開(kāi)銷(xiāo),因此利用它比增加任何其他日志塊的塊關(guān)聯(lián)性更好。

如果PAGE的偏移是0,則跳過(guò)上述處理,直接先merge一個(gè)LOG塊,作為新SLB使用。

上述處理實(shí)際是選擇要犧牲掉哪一個(gè)LOG塊RLB去進(jìn)行MERGE,RLB的關(guān)聯(lián)度比較低,且空閑PAGE較多的有線選擇。這是出于平衡LOG塊的關(guān)聯(lián)度和空閑PAGE數(shù)。只要LOG塊的關(guān)聯(lián)度小于我們?cè)O(shè)置的K則可以增加其關(guān)聯(lián)度。

即使有一個(gè)SLB,待更新PAGE的DATA塊和該SLB無(wú)關(guān)聯(lián),如果該SLB的空閑PAGE比較多,我們依然可以將該P(yáng)AGE寫(xiě)入該SLB,增加了關(guān)聯(lián)度,但是降低了MERGE頻率,因?yàn)榭赡芎荛L(zhǎng)時(shí)間都不需要MERGE。此時(shí)SLB變?yōu)榱薘LB。

如果沒(méi)有LOG塊的關(guān)聯(lián)度小于K且有空閑塊,則無(wú)法將PAGE寫(xiě)入LOG塊。

第三步則是MERGE LOG塊以或者空閑LOG塊。

首先考慮的是否有SLB可以partial merge的。如果SLB中有許多空閑PAGE,我們先不執(zhí)行partial merge,繼續(xù)保持SLB,延遲SLB的partial merge,我們可以將它用于未來(lái)的后續(xù)更新請(qǐng)求。

然后考慮的是MERGE RLB的MERGE消耗最小,空閑PAGE最小的,消耗的大小由關(guān)聯(lián)度來(lái)確定。MERGE一個(gè)LOG塊之后就有空閑的LOG塊繼續(xù)使用了。

總結(jié)

本文對(duì)uC-FS的NAND驅(qū)動(dòng)所基于的算法論文進(jìn)行了詳解,對(duì)算法有了一個(gè)整體的了解。算法到代碼的實(shí)現(xiàn)還有一個(gè)很復(fù)雜的過(guò)程,需要考慮各種細(xì)節(jié),所以以上只是一個(gè)整體概覽。后面我們會(huì)繼續(xù)分析其代碼的實(shí)現(xiàn)細(xì)節(jié)。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5082

    文章

    19104

    瀏覽量

    304797
  • NAND
    +關(guān)注

    關(guān)注

    16

    文章

    1681

    瀏覽量

    136118
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4607

    瀏覽量

    92828
  • Micrium
    +關(guān)注

    關(guān)注

    1

    文章

    7

    瀏覽量

    11745
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Micrium全家uC-FS: 0x01 NAND FTL

    這一篇我們來(lái)講講Micrium全家uC-FS。文件系統(tǒng)是一個(gè)比較龐大的組件,我們以從下往上的順序介紹,即先以一個(gè)具體的設(shè)備:NAND為例
    的頭像 發(fā)表于 06-08 10:58 ?1828次閱讀
    <b class='flag-5'>Micrium</b><b class='flag-5'>全家</b><b class='flag-5'>桶</b><b class='flag-5'>之</b><b class='flag-5'>uC-FS</b>: <b class='flag-5'>0x</b>01 <b class='flag-5'>NAND</b> <b class='flag-5'>FTL</b>

    Micrium全家uC-CRC: 0x02 CRC

    前一篇我們講了Micrium全家uC-CRC: 0x01 ECC:https://mp.we
    的頭像 發(fā)表于 06-08 11:00 ?1182次閱讀
    <b class='flag-5'>Micrium</b><b class='flag-5'>全家</b><b class='flag-5'>桶</b><b class='flag-5'>之</b><b class='flag-5'>uC</b>-CRC: <b class='flag-5'>0x02</b> CRC

    Micrium全家uC-CRC: 0x01 ECC

    我們這一篇來(lái)講講Micrium全家uC-CRC。該代碼庫(kù)提供了CRC算法進(jìn)行錯(cuò)誤檢測(cè)EDC,使用HAMMING
    的頭像 發(fā)表于 06-08 11:04 ?1192次閱讀
    <b class='flag-5'>Micrium</b><b class='flag-5'>全家</b><b class='flag-5'>桶</b><b class='flag-5'>之</b><b class='flag-5'>uC</b>-CRC: <b class='flag-5'>0x</b>01 ECC

    stm32f427 OTG_FS端點(diǎn)是否可以配置端點(diǎn)地址,比如0x0a等等?

    各位版友: stm32f427 OTG_FS模塊作為設(shè)備模式,支持4個(gè)端點(diǎn),其中端點(diǎn)0為控制端點(diǎn),剩余的端點(diǎn)1、2、3是否端點(diǎn)地址就是為0x01、0x02
    發(fā)表于 05-11 06:58

    調(diào)試TAS5729MD時(shí),讀Error Status Register (0x02) 返回值 02,寫(xiě)入02 00均不能清除怎么處理?

    在調(diào)試TAS5729MD時(shí),讀 Error Status Register (0x02) 返回值 02,寫(xiě)入02 00 均不能清除 輸入信號(hào) I2S FS=48k MCLK=2
    發(fā)表于 10-11 07:22

    TAS5717驅(qū)動(dòng)在調(diào)試tas5717的時(shí)候, 0X02寄存器報(bào)錯(cuò)02是什么原因?qū)е碌模?/a>

    TAS5717驅(qū)動(dòng)在調(diào)試tas5717的時(shí)候, 0X02寄存器報(bào)錯(cuò) 02,對(duì)比Datasheet,說(shuō)這個(gè)是過(guò)壓,過(guò)熱,過(guò)流,或者欠壓造成的,但測(cè)試電壓都正常。 并且芯片初始化的時(shí)候正常,等系統(tǒng)起來(lái)以后,讀0x02寄存器就會(huì)得到
    發(fā)表于 10-30 07:08

    請(qǐng)問(wèn)ad7124的ID讀出來(lái)是0X02對(duì)嗎?

    在復(fù)位后 AD7124-4 的ID 手冊(cè)上的值是0X04 ,我讀出來(lái)是0X02,其他的寄存器值都是正常的
    發(fā)表于 08-15 06:19

    fx2lp時(shí)鐘設(shè)置CPUCS=0x02對(duì)SimcDelt有影響嗎

    你好,F(xiàn)X2LP時(shí)鐘具有24MHz(不使用晶體振蕩器)的外部時(shí)鐘源,但如果設(shè)置CPUCS= 0x02,則為12MHz,如果我這樣做,是fx2LP時(shí)鐘減少到12MHz,甚至其提供24MHz?或它對(duì)
    發(fā)表于 09-14 15:23

    AD2S1210故障寄存器0x02問(wèn)題:相位誤差超過(guò)鎖相范圍

    AD2S1210故障寄存器0x02問(wèn)題,也就是相位誤差超過(guò)鎖相范圍,我已經(jīng)將所有閾值寄存器都調(diào)至最大限度,但硬件上LOT引腳仍為低電平,故障寄存器讀取仍為0x02,其他寄存器的讀寫(xiě)均正常,位置信息讀取也正常,請(qǐng)問(wèn)我應(yīng)該從什么地方著手找問(wèn)題
    發(fā)表于 02-12 14:01

    MPU6050中DMP中斷配置為什么會(huì)配置成0x02

    官方庫(kù)函數(shù)inv_mpu.c中set_int_enable()函數(shù)設(shè)置0x38寄存器的值 當(dāng)使能DMP時(shí) 設(shè)置值為BIT_DMP_INT_EN0x02可是0x38寄存器的第一位沒(méi)有意義啊 為什么會(huì)配置成
    發(fā)表于 05-10 06:36

    嵌入式文件系統(tǒng)μC/FS的日志使用

    、添加fs_fat_journal.c文件到工程中,該文件位于$:\Micrium\Software\uC-FS\FAT($:\表示Micrium軟件目錄)。2、在
    發(fā)表于 09-19 16:41

    相比React全家選擇Vue2有何優(yōu)劣?

    相比 React 全家,選擇 Vue2 有何優(yōu)劣?
    發(fā)表于 06-01 05:55

    在設(shè)計(jì)中使用FS2633 SBC和S32k144 uC,可以將哪些引腳連接到SBC FS2633 FS0B和FS1B?

    你好 我們?cè)谠O(shè)計(jì)中使用 FS2633 SBC 和 S32k144 uC。在 uC S32k144 中,我們可以將哪些引腳連接到 SBC FS2633
    發(fā)表于 05-06 09:05

    ad7124的ID讀出來(lái)是0X02對(duì)嗎?

    在復(fù)位后 AD7124-4 的ID 手冊(cè)上的值是0X04 ,我讀出來(lái)是0X02,其他的寄存器值都是正常的
    發(fā)表于 12-13 06:32

    講講Micrium全家uC-CRC算法

    我們這一篇來(lái)講講Micrium全家uC-CRC。該代碼庫(kù)提供了CRC算法進(jìn)行錯(cuò)誤檢測(cè)EDC,使用HAMMING
    的頭像 發(fā)表于 05-04 10:47 ?843次閱讀
    講講<b class='flag-5'>Micrium</b><b class='flag-5'>全家</b><b class='flag-5'>桶</b>的<b class='flag-5'>uC</b>-CRC<b class='flag-5'>算法</b>
    主站蜘蛛池模板: 亚洲三级在线看| www亚洲欲色成人久久精品| 二级片免费看| 久久久久国产精品嫩草影院| 受坐在攻腿上H道具PLAY| 999精品国产人妻无码系列| 国精产品一区一区三区M| 亚洲VA天堂VA欧美VA在线| 东京热 百度影音| 欧美506070| 伊人综合在线22| 国产中文视频| 亚洲日韩精品AV中文字幕| 精品亚洲麻豆1区2区3区| 影音先锋 av天堂| 噜噜噜狠狠夜夜躁| 99久久伊人一区二区yy5o99| 久久婷婷国产五月综合色啪最新 | 国产这里有精品| 色欲av蜜臀av高清| www.99在线| 色中色成人论坛| 国产亚洲精品久久久久久鸭绿欲| 丝袜美女被啪啪不带套漫画| 国产精品亚洲AV色欲在线观看 | 国产亚洲精品久久77777| 亚洲免费在线播放| 久久在精品线影院精品国产| 一本道中文无码亚洲| 黄色毛片a| 亚洲天堂久久久| 老湿影院色情a| zooskoo1videos人与狗| 少妇连续高潮抽搐痉挛昏厥| 国产亚洲精品视频在线网| 又长又大又粗又硬3p免费视频 | 亚洲人成人毛片无遮挡| 久拍国产在线观看| jjzz大全| 香蕉在线播放| 国产在线精品视频二区 |