專(zhuān)利名稱(chēng):一種NandFlash緩沖管理方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種NandFlash緩沖管理方法,特別是一種利用散列鏈表數(shù)組 和多個(gè)緩存單元配合管理NandFlash緩沖的方法。
背景技術(shù):
NandFlash作為 一種常用的非易失性閃存已被廣泛地應(yīng)用在各種數(shù)碼產(chǎn)品 中。系統(tǒng)對(duì)NandFlash的訪問(wèn)速度是影響整個(gè)產(chǎn)品性能的重要因素,NandFlash 的結(jié)構(gòu)是以塊為單位的,每個(gè)塊包含固定大小的頁(yè),每個(gè)頁(yè)包括固定大小的比 特值。
系統(tǒng)對(duì)NandFlash訪問(wèn)的常用方法有兩種
直接訪問(wèn),即沒(méi)有系統(tǒng)緩存單元,直接的驅(qū)動(dòng)NandFlash進(jìn)行讀寫(xiě)。這種 做法雖然簡(jiǎn)單,易于實(shí)現(xiàn),但缺點(diǎn)明顯。由于NandFlash修改某個(gè)比特時(shí),只 能從1修改為0,即便是對(duì)一個(gè)比特的修改也需要將該比特所在整個(gè)塊擦除, 再重新寫(xiě)入。所以在這種方式中,往塊A中寫(xiě)入數(shù)據(jù)的流程如圖1所示,先申 請(qǐng)一個(gè)塊大小的連續(xù)內(nèi)存空間緩存,將要寫(xiě)入到塊A中的數(shù)據(jù)對(duì)應(yīng)的寫(xiě)入到緩 存中,對(duì)塊A執(zhí)行塊擦除操作,然后將緩存寫(xiě)回到塊A。不難看出這種方法效 率很低。
另 一個(gè)方法是系統(tǒng)申請(qǐng)一個(gè)塊大小的連續(xù)內(nèi)存空間緩存,并保留與緩存中 數(shù)據(jù)對(duì)應(yīng)的塊號(hào)A,執(zhí)行讀出寫(xiě)入塊B的某些數(shù)據(jù)的操作。具體來(lái)說(shuō),系統(tǒng)首 先判斷待讀出或?qū)懭氲膲KB的塊號(hào)與緩存中的塊號(hào)A是否相同,如果相同則直 接在緩存中讀出數(shù)據(jù),如果A與B不相同,則將塊緩存中的數(shù)據(jù)寫(xiě)回到塊號(hào)A 所對(duì)應(yīng)的物理塊上,并將塊B中的數(shù)據(jù)讀出寫(xiě)入到多爰存中,此過(guò)程分別如圖2、 圖3所示。在此種方法中,無(wú)論讀寫(xiě)操作,系統(tǒng)都先訪問(wèn)緩存,判斷緩存內(nèi)容 是否為需要的數(shù)據(jù),如果是則直接使用緩存中的數(shù)據(jù),如果不是則將緩存中的 數(shù)據(jù)寫(xiě)回其對(duì)應(yīng)的物理塊中再將塊B的內(nèi)容寫(xiě)入緩存。
這樣的操作雖然減少了反復(fù)擦除NandFlash塊的操作,但是如果遇到系統(tǒng) 頻繁訪問(wèn)NandFlash,并且訪問(wèn)區(qū)域分布于不同的塊上,這樣筒單的讀寫(xiě)方法不 能滿足需求。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明的目的在于提供一種NandFlash緩沖管理方法,能較好 的提高緩存的訪問(wèn)效率,力口快系統(tǒng)對(duì)NandFlash的訪問(wèn)速度,提高系統(tǒng)的整體 性能。
為了達(dá)到上述目的,本發(fā)明一種NandFlash緩沖管理方法,包括 在內(nèi)存中建立一個(gè)與NandFlash物理塊地址——對(duì)應(yīng)的《連表數(shù)組; 在內(nèi)存中開(kāi)辟多個(gè)緩存單元用于緩存NandFlash中的數(shù)據(jù);和 根據(jù)所述鏈表數(shù)組與多個(gè)緩存單元配合對(duì)NandFlash進(jìn)行讀寫(xiě)操作。 進(jìn)一步地,所述多個(gè)緩存單元由一個(gè)鏈表頭采用雙向鏈表的形式鏈接成數(shù)
據(jù)鏈表;所述鏈表數(shù)組包括鏈表索引數(shù)組,用于在鏈表數(shù)組中定位對(duì)應(yīng)的
NandFlash物理地址,鏈表數(shù)組中的數(shù)據(jù)所對(duì)應(yīng)的NandFlash物理地址與同 一個(gè)
NandFlash物理地址在鏈表數(shù)組中相應(yīng)的元素對(duì)應(yīng)。
進(jìn)一步地,在讀寫(xiě)操作中,將寫(xiě)入數(shù)據(jù)的緩存單元通過(guò)指針鏈入NandFlash
物理地址對(duì)應(yīng)的鏈表凄t組中,^"改該寫(xiě)入數(shù)據(jù)的緩存單元的單元修改標(biāo)記,所
述單元修改標(biāo)記用于標(biāo)識(shí)該緩存單元是否被修改過(guò)。
進(jìn)一步地,根據(jù)最近最少使用原則將寫(xiě)入數(shù)據(jù)的緩存單元移動(dòng)到鏈表頭后
面緊挨鏈表頭的位置。
進(jìn)一步地,在讀寫(xiě)過(guò)程中,將緩存單元內(nèi)的數(shù)據(jù)與該數(shù)據(jù)在NandFlansh上
對(duì)應(yīng)的物理塊關(guān)聯(lián),當(dāng)緩存單元內(nèi)數(shù)據(jù)被修改且有新的數(shù)據(jù)需要寫(xiě)入該緩存單
元中的時(shí)候,將該緩存單元中的舊有數(shù)據(jù)寫(xiě)回其對(duì)應(yīng)的物理塊中。 進(jìn)一步地,所述方法在讀NandFlash操作的過(guò)程包括 步驟101, 計(jì)算出待讀出NandFlash數(shù)據(jù)所在物理塊的物理地址在鏈表數(shù)
組中鏈表索引數(shù)組的位置;
步驟102,根據(jù)鏈表索引數(shù)組的位置查找判斷鏈表數(shù)組中是否包含所述待
讀出數(shù)據(jù),如果不包含則執(zhí)行步驟103;
步驟103,判斷數(shù)據(jù)鏈表是否包括空閑緩存單元,如果不包含則執(zhí)行步驟
104;
步驟104, 取鏈表頭前面一個(gè)緩存單元為目標(biāo)緩存單元,執(zhí)行步驟105;
步驟105,判斷所述目標(biāo)緩存單元的單元修改標(biāo)記是否為修改過(guò),如果修 改過(guò)將該緩存單元中的舊有數(shù)據(jù)寫(xiě)回其對(duì)應(yīng)的NandFlash物理塊中,執(zhí)行步驟 106,否則直接執(zhí)行步驟106;
步驟106, 從所述物理塊中將待讀出數(shù)據(jù)讀入到所述目標(biāo)緩存單元中,同 時(shí)修改目標(biāo)緩存單元的單元修改標(biāo)記為沒(méi)有修改過(guò)并執(zhí)行步驟107;
步驟107, 將所述目標(biāo)緩存單元鏈接到數(shù)據(jù)鏈表頭的后緊鄰鏈表頭的位 置,執(zhí)行步驟108;
步驟108, 計(jì)算出待讀出NandFlash數(shù)據(jù)所對(duì)應(yīng)的物理塊在鏈表數(shù)組中的 鏈表索引數(shù)組的位置,將目標(biāo)緩存單元鏈入到計(jì)算出的鏈表索引數(shù)組所對(duì)應(yīng)的 鏈表的末尾并執(zhí)行步驟110;
步驟110, 從目標(biāo)緩存單元中讀出數(shù)據(jù)到指定的位置。
進(jìn)一步地,在步驟102中,如果包含所述待讀出數(shù)據(jù),則執(zhí)行步驟109;
步驟109,將該緩沖區(qū)在雙向數(shù)據(jù)鏈表中的位置移動(dòng)到鏈表頭的后一個(gè)。
進(jìn)一步地,在步驟103中,如果包括空閑緩存單元,則將空閑緩存單元設(shè) 為目標(biāo)緩存單元并執(zhí)行步驟107。
進(jìn)一步地,所述方法在寫(xiě)NandFlash操:作的過(guò)程包括
步驟201, 計(jì)算出待寫(xiě)入NandFlash數(shù)據(jù)所在物理塊的物理地址在鏈表數(shù) 組中鏈表索引數(shù)組的位置;
步驟202,根據(jù)鏈表索引數(shù)組的位置查找判斷鏈表數(shù)組中是否包含所述待 讀出數(shù)據(jù),如果不包含則執(zhí)行步驟203;
步驟203,判斷數(shù)據(jù)鏈表是否包括空閑緩存單元,如果不包含則執(zhí)行步驟
204;
步驟204, 取鏈表頭前面一個(gè)緩存單元為目標(biāo)緩存單元,執(zhí)行步驟205;
步驟205,判斷所述目標(biāo)緩存單元的單元修改標(biāo)記是否為修改過(guò),如果修 改過(guò)將該緩存單元中的舊有數(shù)據(jù)寫(xiě)回其對(duì)應(yīng)的NandFlash物理塊中,執(zhí)行步驟 206,否則直接執(zhí)行步驟206;
步驟206, 從所述物理塊中將待寫(xiě)入數(shù)據(jù)讀入到所述目標(biāo)緩存單元中,同
時(shí)修改目標(biāo)緩存單元的單元修改標(biāo)記為沒(méi)有修改過(guò)并執(zhí)行步驟207;
步驟207, 將所述目標(biāo)緩存單元鏈接到數(shù)據(jù)鏈表頭的后緊鄰鏈表頭的位 置,執(zhí)行步驟208;
步驟208, 計(jì)算出待寫(xiě)入NandFlash數(shù)據(jù)所對(duì)應(yīng)的物理塊在鏈表數(shù)組中的 #索引數(shù)組的位置,將目標(biāo)緩存單元鏈入到計(jì)算出的鏈表索引數(shù)組所對(duì)應(yīng)的 鏈表的末尾并執(zhí)行步驟210;
步驟210, 將待寫(xiě)入數(shù)據(jù)寫(xiě)入目標(biāo)緩存單元中,修改目標(biāo)緩存單元的單元 修改標(biāo)記為修改過(guò)。
進(jìn)一步地,在步驟202中,如果包含所述待讀出數(shù)據(jù),則執(zhí)行步驟209;
步驟209,將該緩沖區(qū)在雙向數(shù)據(jù)鏈表中的位置移動(dòng)到鏈表頭的后一個(gè)。
進(jìn)一步地,在步驟203中,如果包括空閑緩存單元,則將空閑緩存單元設(shè) 為目標(biāo)緩存單元并執(zhí)行步驟207。
進(jìn)一步地,所述鏈表索引數(shù)組位置的計(jì)算采用哈希算法,所述鏈表數(shù)組為 散列鏈表數(shù)組。
進(jìn)一步地,所述方法在系統(tǒng)的初始化階段包括以下步驟
分配若干緩存單元;
對(duì)每個(gè)緩存單元分配管理結(jié)構(gòu)體并初始化另其指向各自的緩存單元;
分配鏈表索引數(shù)組并初始化,令其指向NULL;和
分配數(shù)據(jù)鏈表頭,將所有緩存單元鏈入到雙向數(shù)據(jù)鏈表中。
進(jìn)一步地,所述內(nèi)存中開(kāi)辟緩存單元的大小為NandFlash—個(gè)或多個(gè)塊的
大小,或者一個(gè)或多個(gè)頁(yè)的的大小,或者一個(gè)或多個(gè)字節(jié)的大小。 進(jìn)一步地,所述存儲(chǔ)單元的大小和數(shù)量根據(jù)需要隨時(shí)調(diào)整。 本發(fā)明通過(guò)采用多個(gè)緩存提高了讀寫(xiě)效率,同時(shí)引入鏈表數(shù)組并且采用雙
鏈表嵌套,提高了對(duì)緩存單元的訪問(wèn)效率。在數(shù)據(jù)鏈表中采用最近最少使用的
方法,提高了數(shù)據(jù)鏈表的訪問(wèn)效率。同時(shí)緩存單元采用更小的頁(yè)或者字節(jié)長(zhǎng)度
作為緩存單元的大小,使讀寫(xiě)更加靈活。
圖1是現(xiàn)有技術(shù)中簡(jiǎn)單的塊寫(xiě)入操作流程圖; 圖2是現(xiàn)有技術(shù)中基于系統(tǒng)緩存的讀操作示意圖3是現(xiàn)有技術(shù)中基于系統(tǒng)緩存的寫(xiě)"t喿作示意圖4為本發(fā)明一個(gè)具體的實(shí)施例中對(duì)系統(tǒng)初始化的流程圖5為本發(fā)明 一個(gè)具體實(shí)施例中對(duì)NandFlash緩沖管理方法框圖6為本發(fā)明一個(gè)具體實(shí)施例中對(duì)NandFlash進(jìn)行讀操作的流程圖;和
圖7為本發(fā)明一個(gè)具體實(shí)施例中對(duì)NandFlash進(jìn)行寫(xiě)操作的流程圖
具體實(shí)施例方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)表達(dá)得更加清楚明白,下面結(jié)合附圖 及具體實(shí)施例對(duì)本發(fā)明再作進(jìn)一步詳細(xì)的i兌明。
本發(fā)明目的在于采用多緩存與鏈表數(shù)組相互嵌套提高讀寫(xiě)效率,其步驟包
括
步驟1 ,在內(nèi)存中建立一個(gè)與NandFlash物理塊地址——對(duì)應(yīng)的鏈表數(shù)組; 所述鏈表數(shù)組是一個(gè)包括鏈表索引數(shù)組的散列鏈表數(shù)組,其通過(guò)哈希算法 將NandFlash地址與鏈表數(shù)組地址——對(duì)應(yīng),在查找鏈表數(shù)組的時(shí)候首先通過(guò) 哈希算法算出待操作NandFlash物理塊在鏈表索《1數(shù)組中的位置,根據(jù)鏈表索 引數(shù)組中的位置,具體算出鏈表^t組中詳細(xì)的位置。
所述哈希算法為本領(lǐng)域技術(shù)人員的常用技術(shù)手l殳,在此不作贅述。
步驟2,在內(nèi)存中開(kāi)辟多個(gè)緩存單元用于緩存NandFlash中的數(shù)據(jù);
步驟3,根據(jù)所述鏈表數(shù)組與多個(gè)緩存單元配合對(duì)NandFlash進(jìn)行讀寫(xiě)操作。
所述多個(gè)緩存單元由一個(gè)鏈表頭將全部緩存單元釆用雙向鏈表的方式串接
起來(lái)組成數(shù)據(jù)鏈表。下面詳細(xì)介紹如何利用本發(fā)明對(duì)NandFlash進(jìn)行讀寫(xiě)操作。
在進(jìn)行讀寫(xiě)操作前,系統(tǒng)首先對(duì)NandFlash進(jìn)行初始化,初始化的步驟如
圖4所示。
步驟a,分配若干緩存單元;
步驟b,對(duì)每個(gè)緩存單元分配管理結(jié)構(gòu)體并初始化另其指向各自的緩存單
元;
所述管理結(jié)構(gòu)體定義方法如下 typedef struct tag_DiskBufHead {
intmodifyFlag; /*緩存單元修改標(biāo)記,為0表示沒(méi)有被
修改過(guò),即緩存單元中內(nèi)容與物理塊上面的數(shù)據(jù)一致;為l表示緩存單元中數(shù) 據(jù)曾經(jīng)被修改過(guò),即緩存單元內(nèi)容與物理塊內(nèi)容不一致*/
int block; /*對(duì)應(yīng)的物理塊編號(hào),表明緩存單元存儲(chǔ)的
是那個(gè)物理塊中的數(shù)據(jù)*/
char*buf; /*緩存單元指針,緩存單元大小*/
struct tag_DiskBufHead *pFreePrev; /*數(shù)據(jù)鏈表前項(xiàng)517
struct tag_DiskBufHead *pFreeNext; /*數(shù)據(jù)鏈表后項(xiàng)*/
struct tag—DiskBufHead *pHashNext;/*鏈表數(shù)組后項(xiàng)*/ } TDiskBufHead, *PTDiskBufHead;
管理結(jié)構(gòu)體中包括了
緩存單元的修改標(biāo)記,為0表示沒(méi)有被修改過(guò),即緩存單元中內(nèi)容與物理 塊上面的數(shù)據(jù)一致;為1表示緩存單元中數(shù)據(jù)曾經(jīng)被修改過(guò),即緩存單元內(nèi)容 與物理塊內(nèi)容不一致;
對(duì)應(yīng)物理塊編號(hào),表明緩存單元存儲(chǔ)的是哪個(gè)物理塊中的數(shù)據(jù),當(dāng)緩存單 元中存儲(chǔ)的內(nèi)容發(fā)生變化時(shí),所述對(duì)應(yīng)物理塊編號(hào)要相應(yīng)修改;
緩存單元指針,指明緩存單元大小,緩存單元大小可以為一個(gè)或多個(gè)塊, 可以為一個(gè)或多個(gè)頁(yè),甚至一個(gè)或多個(gè)字節(jié)。
對(duì)于修改緩存單元大小和數(shù)量的方法,只需要修改上述緩存單元分配結(jié)構(gòu) 體中對(duì)應(yīng)參數(shù)值進(jìn)行修改即可。比如修改葉uf變量,可以改變緩存單元的大小。 緩存單元的大小和數(shù)量并不一定要在系統(tǒng)初始化的時(shí)候修改,在系統(tǒng)運(yùn)行中也 可以隨時(shí)改變。
步驟c,分配鏈表索引數(shù)組并初始化,令其指向NULL;
在初始化階段,鏈表索引數(shù)組為空。
步驟d,分配數(shù)據(jù)鏈表頭,將所有緩存單元鏈入到雙向數(shù)據(jù)鏈表中。 初始化后,系統(tǒng)中的鏈表索引數(shù)組為空,所有緩存單元中沒(méi)有數(shù)據(jù)。 為了使本發(fā)明更清楚,現(xiàn)在將NandFlash物理塊、鏈表數(shù)組、鏈表索引數(shù) 組、數(shù)據(jù)鏈表之間的關(guān)系詳細(xì)介紹一下。請(qǐng)參看圖5所示,圖5為NandFlash
緩沖管理方法框圖。圖中是系統(tǒng)運(yùn)行一段時(shí)間之后的狀態(tài)圖。
圖中所有的緩存單元都已經(jīng)被寫(xiě)滿了數(shù)據(jù),每一個(gè)緩存單元中都記錄著一
塊NandFlash物理塊中的內(nèi)容,所有的緩存單元由鏈表頭鏈接成雙向數(shù)據(jù)鏈表, 并且遵循最近最少使用的原則,將當(dāng)前使用的緩存單元鏈接到鏈表頭后面緊鄰 鏈表頭的位置。如果待讀寫(xiě)數(shù)據(jù)中的內(nèi)容沒(méi)有出現(xiàn)在數(shù)據(jù)鏈表中,則將鏈表頭 前面的緩存單元提取使用,并在使用后將其鏈入鏈表頭后緊鄰鏈表頭的位置。
當(dāng)前使用的緩存單元在鏈接到鏈表頭后面的同時(shí),鏈接到NandFlash物理 地址對(duì)應(yīng)的鏈表數(shù)組末尾。所述對(duì)應(yīng)鏈表數(shù)組為根據(jù)NandFlash物理地址計(jì)算 出的鏈表索引數(shù)組所對(duì)應(yīng)的鏈表數(shù)組。
當(dāng)對(duì)NandFlash的待處理物理塊進(jìn)行讀操作時(shí),請(qǐng)參看圖6所示,圖6為 本發(fā)明一個(gè)具體實(shí)施例中對(duì)NandFlash進(jìn)行讀操作的流程圖。
步驟101, 計(jì)算出待讀出NandFlash數(shù)據(jù)所在物理塊的物理地址在鏈表數(shù) 組中鏈表索引數(shù)組的位置;
步驟102,根據(jù)鏈表索引數(shù)組的位置查找判斷鏈表數(shù)組中是否包含所述待 讀出數(shù)據(jù),如果包含則執(zhí)行步驟109,否則執(zhí)行步驟103;
步驟103,判斷數(shù)據(jù)鏈表是否包括空閑緩存單元,如果包含則將空閑緩存 單元設(shè)為目標(biāo)緩存單元并執(zhí)行步驟107,否則執(zhí)行步驟104;
步驟104, 取鏈表頭前面一個(gè)緩存單元為目標(biāo)緩存單元,執(zhí)行步驟105;
步驟105,判斷所述目標(biāo)緩存單元的單元修改標(biāo)記是否為修改過(guò),如果修 改過(guò)將該緩存單元中的舊有數(shù)據(jù)寫(xiě)回其對(duì)應(yīng)的NandFlash物理塊中,執(zhí)行步驟 106,否則直接執(zhí)行步驟106;
步驟106, 從所述物理塊中將待讀出數(shù)據(jù)讀入到所述目標(biāo)緩存單元中,同 時(shí)修改目標(biāo)緩存單元的單元修改標(biāo)記為沒(méi)有修改過(guò)并執(zhí)行步驟107;
步驟107, 將所述目標(biāo)緩存單元鏈接到數(shù)據(jù)鏈表頭的后緊鄰鏈表頭的位 置,執(zhí)行步驟108;
步驟108, 計(jì)算出待讀出NandFlash數(shù)據(jù)所對(duì)應(yīng)的物理塊在鏈表數(shù)組中的 鏈表索引數(shù)組的位置,將目標(biāo)緩存單元鏈入到計(jì)算出的鏈表索引數(shù)組所對(duì)應(yīng)的 鏈表的末尾并執(zhí)行步驟110;
步驟109,將該緩沖區(qū)在雙向數(shù)據(jù)鏈表中的位置移動(dòng)到鏈表頭的后一個(gè);
步驟110, 從目標(biāo)緩存單元中讀出數(shù)據(jù)到指定的位置。
當(dāng)對(duì)NandFlash的待處理物理塊進(jìn)行寫(xiě)操作時(shí),請(qǐng)參看圖7所示,圖7為 本發(fā)明一個(gè)具體實(shí)施例中對(duì)NandFlash進(jìn)行寫(xiě)操作的流程圖。
步驟201 , 計(jì)算出待寫(xiě)入NandFlash數(shù)據(jù)所在物理塊的物理地址在鏈表數(shù) 組中鏈表索引數(shù)組的位置;
步驟202,根據(jù)鏈表索引數(shù)組的位置查找判斷鏈表數(shù)組中是否包含所述待 讀出數(shù)據(jù),如果包含則執(zhí)行步驟209,否則執(zhí)行步驟203;
步驟203,判斷數(shù)據(jù)鏈表是否包括空閑緩存單元,如果包含則將空閑緩存 單元設(shè)為目標(biāo)緩存單元并執(zhí)行步驟207,否則執(zhí)行步驟204;
步驟204, 取鏈表頭前面一個(gè)緩存單元為目標(biāo)緩存單元,執(zhí)行步驟205;
步驟205,判斷所述目標(biāo)緩存單元的單元修改標(biāo)記是否為修改過(guò),如果修 改過(guò)將該緩存單元中的舊有數(shù)據(jù)寫(xiě)回其對(duì)應(yīng)的NandFlash物理塊中,執(zhí)行步驟 206,否則直接執(zhí)行步驟206;
步驟206, 從所述物理塊中將待寫(xiě)入數(shù)據(jù)讀入到所述目標(biāo)緩存單元中,同 時(shí)修改目標(biāo)緩存單元的單元修改標(biāo)記為沒(méi)有修改過(guò)并執(zhí)行步驟207;
步驟207, 將所述目標(biāo)緩存單元鏈接到數(shù)據(jù)鏈表頭的后緊鄰鏈表頭的位 置,執(zhí)行步驟208;
步驟208, 計(jì)算出待寫(xiě)入NandFlash數(shù)據(jù)所對(duì)應(yīng)的物理塊在鏈表數(shù)組中的 鏈表索引數(shù)組的位置,將目標(biāo)緩存單元鏈入到計(jì)算出的鏈表索引數(shù)組所對(duì)應(yīng)的 鏈表的末尾并執(zhí)行步驟210;
步驟209,將該緩沖區(qū)在雙向數(shù)據(jù)鏈表中的位置移動(dòng)到鏈表頭的后一個(gè);
步驟210, 將待寫(xiě)入數(shù)據(jù)寫(xiě)入目標(biāo)緩存單元中,修改目標(biāo)緩存單元的單元 修改標(biāo)記為^務(wù)改過(guò)。
這樣便完成了一次讀或?qū)懖僮?。?duì)于緩沖單元的選取采用比塊更小的頁(yè)或 者字節(jié)為單位,方便了上層的使用。
本發(fā)明采用鏈表數(shù)組和數(shù)據(jù)鏈表配合的方法,大大提高了 NandFlash的讀 寫(xiě)效率,采用鏈表數(shù)組又省去了遍歷數(shù)據(jù)鏈表的操作,可以快速進(jìn)行定位,對(duì) 于頻繁讀寫(xiě)操作或者大緩存和大NandFlash物理空間來(lái)說(shuō)效率提高更加明顯。
以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)
明的精神和原則之內(nèi),所作的任何修改、等同替換等,均應(yīng)包含在本發(fā)明的保 護(hù)范圍之內(nèi)。
權(quán)利要求
1. 一種NandFlash緩沖管理方法,包括在內(nèi)存中建立一個(gè)與NandFlash物理塊地址一一對(duì)應(yīng)的鏈表數(shù)組;在內(nèi)存中開(kāi)辟多個(gè)緩存單元用于緩存NandFlash中的數(shù)據(jù);和根據(jù)所述鏈表數(shù)組與多個(gè)緩存單元配合對(duì)NandFlash進(jìn)行讀寫(xiě)操作。
2. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述多個(gè)緩存單元由一個(gè)4連 表頭采用雙向鏈表的形式鏈接成數(shù)據(jù)鏈表;所述鏈表數(shù)組包括鏈表索引數(shù)組, 用于在鏈表數(shù)組中定位對(duì)應(yīng)的NandFlash物理地址,鏈表數(shù)組中的數(shù)據(jù)所對(duì)應(yīng) 的NandFlash物理地址與同一個(gè)NandFlash物理地址在鏈表數(shù)組中相應(yīng)的元素 對(duì)應(yīng)。
3. 根據(jù)權(quán)利要求2所述的方法,其特征在于,在讀寫(xiě)操作中,將寫(xiě)入數(shù)據(jù) 的緩存單元通過(guò)指針鏈入NandFlash物理地址對(duì)應(yīng)的鏈表數(shù)組中,修改該寫(xiě)入 數(shù)據(jù)的緩存單元的單元修改標(biāo)記,所述單元修改標(biāo)記用于標(biāo)識(shí)該緩存單元是否 被修改過(guò)。
4. 根據(jù)權(quán)利要求3所述的方法,其特征在于,根據(jù)最近最少使用原則將寫(xiě) 入數(shù)據(jù)的緩存單元移動(dòng)到鏈表頭后面緊挨鏈表頭的位置。
5. 根據(jù)權(quán)利要求3所述的方法,其特征在于,在讀寫(xiě)過(guò)程中,將緩存單元 內(nèi)的數(shù)據(jù)與該數(shù)據(jù)在NandFlansh上對(duì)應(yīng)的物理塊關(guān)聯(lián),當(dāng)緩存單元內(nèi)數(shù)據(jù)被修改且有新的數(shù)據(jù)需要寫(xiě)入該緩存單元中的時(shí)候,將該緩存單元中的舊有數(shù)據(jù)寫(xiě) 回其對(duì)應(yīng)的物理塊中。
6. 根據(jù)權(quán)利要求3所述的方法,其特征在于,所述方法在讀NandFlash操 作的過(guò)程包括步驟101, 計(jì)算出待讀出NandFlash數(shù)據(jù)所在物理塊的物理地址在鏈表數(shù) 組中鏈表索引數(shù)組的位置;步驟102,根據(jù)鏈表索引數(shù)組的位置查找判斷鏈表數(shù)組中是否包含所述待 讀出數(shù)據(jù),如果不包含則執(zhí)行步驟103;步驟103,判斷數(shù)據(jù)鏈表是否包括空閑緩存單元,如果不包含則執(zhí)行步驟104;步驟104, 取鏈表頭前面一個(gè)緩存單元為目標(biāo)緩存單元,執(zhí)行步驟105; 步驟105,判斷所述目標(biāo)緩存單元的單元修改標(biāo)記是否為修改過(guò),如果修 改過(guò)將該緩存單元中的舊有數(shù)據(jù)寫(xiě)回其對(duì)應(yīng)的NandFlash物理塊中,執(zhí)行步驟 106,否則直接執(zhí)行步驟106;步驟106, 從所述物理塊中將待讀出數(shù)據(jù)讀入到所述目標(biāo)緩存單元中,同 時(shí)修改目標(biāo)緩存單元的單元修改標(biāo)記為沒(méi)有修改過(guò)并執(zhí)行步驟107;步驟107, 將所述目標(biāo)緩存單元鏈接到數(shù)據(jù)鏈表頭的后緊鄰鏈表頭的位 置,執(zhí)行步驟108;步驟108, 計(jì)算出待讀出NandFlash數(shù)據(jù)所對(duì)應(yīng)的物理塊在鏈表數(shù)組中的 鏈表索引數(shù)組的位置,將目標(biāo)緩存單元鏈入到計(jì)算出的鏈表索引數(shù)組所對(duì)應(yīng)的 鏈表的末尾并執(zhí)行步驟110;步驟110, 從目標(biāo)緩存單元中讀出數(shù)據(jù)到指定的位置。
7. 根據(jù)權(quán)利要求6所述的方法,其特征在于,在步驟102中,如果包含所 述待讀出數(shù)據(jù),則執(zhí)行步驟109;步驟109,將該緩沖區(qū)在雙向數(shù)據(jù)鏈表中的位置移動(dòng)到鏈表頭的后一個(gè)。
8. 根據(jù)權(quán)利要求6所述的方法,其特征在于,在步驟103中,如果包括空 閑緩存單元,則將空閑緩存單元設(shè)為目標(biāo)緩存單元并執(zhí)行步驟107。
9. 據(jù)權(quán)利要求3所述的方法,其特征在于,所述方法在寫(xiě)NandFlash操作 的過(guò)程包括步驟201, 計(jì)算出待寫(xiě)入NandFlash數(shù)據(jù)所在物理塊的物理地址在鏈表數(shù) 組中鏈表索引數(shù)組的位置;步驟202,根據(jù)鏈表索引數(shù)組的位置查找判斷鏈表數(shù)組中是否包含所述待 讀出數(shù)據(jù),如果不包含則執(zhí)行步驟203;步驟203,判斷數(shù)據(jù)鏈表是否包括空閑緩存單元,如果不包含則執(zhí)行步驟204;步驟204, 取鏈表頭前面一個(gè)緩存單元為目標(biāo)緩存單元,執(zhí)行步驟205;步驟205,判斷所述目標(biāo)緩存單元的單元修改標(biāo)記是否為修改過(guò),如果修 改過(guò)將該緩存單元中的舊有數(shù)據(jù)寫(xiě)回其對(duì)應(yīng)的NandFlash物理塊中,執(zhí)行步驟 206,否則直接執(zhí)行步驟206;步驟206, 從所述物理塊中將待寫(xiě)入數(shù)據(jù)讀入到所述目標(biāo)緩存單元中,同 時(shí)修改目標(biāo)緩存單元的單元修改標(biāo)記為沒(méi)有修改過(guò)并執(zhí)行步驟207;步驟207, 將所述目標(biāo)緩存單元鏈接到數(shù)據(jù)鏈表頭的后緊鄰鏈表頭的位 置,執(zhí)行步驟208;步驟208, 計(jì)算出待寫(xiě)入NandFlash數(shù)據(jù)所對(duì)應(yīng)的物理塊在鏈表數(shù)組中的 鏈表索引數(shù)組的位置,將目標(biāo)緩存單元鏈入到計(jì)算出的鏈表索引數(shù)組所對(duì)應(yīng)的 鏈表的末尾并執(zhí)行步驟210;步驟210, 將待寫(xiě)入數(shù)據(jù)寫(xiě)入目標(biāo)緩存單元中,修改目標(biāo)緩存單元的單元 修改標(biāo)記為+務(wù)改過(guò)。
10. 根據(jù)權(quán)利要求9所述的方法,其特征在于,在步驟202中,如果包含 所述待讀出數(shù)據(jù),則執(zhí)行步驟209;步驟209,將該緩沖區(qū)在雙向數(shù)據(jù)鏈表中的位置移動(dòng)到鏈表頭的后一個(gè)。
11. 根據(jù)權(quán)利要求9所述的方法,其特征在于,在步驟203中,如果包括 空閑緩存單元,則將空閑緩存單元設(shè)為目標(biāo)緩存單元并執(zhí)行步驟207。
12. 據(jù)權(quán)利要求6-11之一所述的方法,其特征在于,所述鏈表索引數(shù)組位 置的計(jì)算采用哈希算法,所述鏈表數(shù)組為散列鏈表數(shù)組。
13. 據(jù)權(quán)利要求2所述的方法,其特征在于,所述方法在系統(tǒng)的初始化階 段包括以下步驟分配若干緩存單元;對(duì)每個(gè)緩存單元分配管理結(jié)構(gòu)體并初始化另其指向各自的緩存單元; 分配鏈表索引數(shù)組并初始化,令其指向NULL;和 分配數(shù)據(jù)鏈表頭,將所有緩存單元鏈入到雙向數(shù)據(jù)鏈表中。
14. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述內(nèi)存中開(kāi)辟緩存單元 的大小為NandFlash—個(gè)或多個(gè)塊的大小,或者一個(gè)或多個(gè)頁(yè)的的大小,或者 一個(gè)或多個(gè)字節(jié)的大小。
15. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述存儲(chǔ)單元的大小和數(shù) 量根據(jù)需要隨時(shí)調(diào)整。
全文摘要
本發(fā)明涉及一種NandFlash緩沖管理方法通過(guò)采用多個(gè)緩存提高了讀寫(xiě)效率,引入鏈表數(shù)組并且采用雙鏈表嵌套,提高了對(duì)緩存單元的訪問(wèn)效率,在數(shù)據(jù)鏈表中采用最近最少使用的方法,提高了數(shù)據(jù)鏈表的訪問(wèn)效率。
文檔編號(hào)G06F12/08GK101393537SQ20081022250
公開(kāi)日2009年3月25日 申請(qǐng)日期2008年9月18日 優(yōu)先權(quán)日2008年9月18日
發(fā)明者李棟梁, 游明琦, 國(guó) 艾 申請(qǐng)人:北京中星微電子有限公司