專利名稱:一種固態(tài)硬盤掉電和寫異常處理方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及固態(tài)硬盤領(lǐng)域,尤其涉及一種固態(tài)硬盤掉電和寫異常處理方法及系統(tǒng)。
背景技術(shù):
隨著MLC(multi level cell)型NAND FLASH大量應(yīng)用,固態(tài)硬盤所用 NAND FLASH 也主要選擇了 MLC型NAND FLASH.而對(duì)于大多數(shù)MLC型NAND FLASH而言,具有顯著的特點(diǎn) 即如附圖1,同單元里面的兩個(gè)位被分配在不同的兩個(gè)頁(yè)中,即高位頁(yè)(Upper page)和低位頁(yè)(Lower page),從而這兩個(gè)頁(yè)之間具有強(qiáng)耦合性。其中的寫入操作會(huì)有兩個(gè)階段低位頁(yè)寫入(1st round)和高位頁(yè)寫入Ond round),如果高位頁(yè)寫入操作異常,那么低位頁(yè)的數(shù)據(jù)也將被損毀。而反之,低位頁(yè)寫入操作異常,則對(duì)高位頁(yè)無影響。目前固態(tài)硬盤都通過多個(gè)NAND FLASH控制器作為多個(gè)通道并行使用,從而達(dá)到采用高數(shù)據(jù)吞吐量,那么同一時(shí)刻存在大量的NAND FLASH讀寫操作。在系統(tǒng)意外掉電時(shí),由于同一時(shí)刻存在大量的NAND FLASH寫操作,當(dāng)電源不能保證NAND FLASH寫操作的完成時(shí), 不僅會(huì)破壞當(dāng)前寫入頁(yè)的數(shù)據(jù)完整性,必然會(huì)破壞跟當(dāng)前頁(yè)耦合的低位頁(yè)中的數(shù)據(jù)。為了解決該問題,出現(xiàn)了通過備份相關(guān)低位頁(yè)的數(shù)據(jù),從而達(dá)到抗掉電保護(hù)。圖2為一種抗掉電和寫異常處理技術(shù)結(jié)構(gòu)示意圖。當(dāng)固態(tài)硬盤系統(tǒng)中的備份檢測(cè)模塊101發(fā)現(xiàn)需要備份時(shí), 通過存儲(chǔ)管理模塊102,將數(shù)據(jù)先寫入備份存儲(chǔ)器104,然后將數(shù)據(jù)寫入主數(shù)據(jù)存儲(chǔ)器103 中。一般而言,備份存儲(chǔ)器104—般是SLC(single level cell)型NAND FLASH或者NOR FLASH,這類存儲(chǔ)器沒有耦合頁(yè)問題,所以不會(huì)發(fā)生耦合頁(yè)數(shù)據(jù)被破壞問題。當(dāng)主數(shù)據(jù)存儲(chǔ)器103中,發(fā)生因?qū)懭敫呶豁?yè)操作異常,而導(dǎo)致低位頁(yè)數(shù)據(jù)被破壞時(shí),該數(shù)據(jù)可以從備份存儲(chǔ)器中恢復(fù)出來。另一發(fā)明為快閃存存儲(chǔ)器數(shù)據(jù)寫入方法及其快閃存存儲(chǔ)器控制器 (200810003152. 1)中需要額外的備份存儲(chǔ)器,這無疑增加了硬件成本和軟件設(shè)計(jì)復(fù)雜度, 所以又出現(xiàn)了將主數(shù)據(jù)區(qū)劃分出一部分區(qū)域作為備份區(qū)的技術(shù)方案。該技術(shù)方案在不增加硬件成本情況下解決了耦合頁(yè)中低位頁(yè)數(shù)據(jù)被破壞的問題。如圖3所示,該技術(shù)方案將205閃存存儲(chǔ)器分為多個(gè)區(qū)域,包括程序存放區(qū),主數(shù)據(jù)區(qū),數(shù)據(jù)備份區(qū)。其中主數(shù)據(jù)區(qū)作為用戶數(shù)據(jù)存儲(chǔ)區(qū)域,其占用205閃存存儲(chǔ)器的90%以上的區(qū)域,程序存放區(qū)是用于存放系統(tǒng)程序代碼,對(duì)用戶不可見,而數(shù)據(jù)備份區(qū)是用于備份低位頁(yè)數(shù)據(jù)所有。201用于控制系統(tǒng)整體運(yùn)行,202用數(shù)據(jù)暫存,203是用于管理MLC NAND Flash的指令解析,判斷是否需要備份數(shù)據(jù),數(shù)據(jù)備份恢復(fù)等作用。圖4A描述了該技術(shù)方案使用的數(shù)據(jù)寫入時(shí)的流程圖。當(dāng)步驟302收到寫入指令后,步驟303會(huì)根據(jù)寫入數(shù)據(jù)所對(duì)應(yīng)的地址是否為耦合頁(yè)中的低位頁(yè),如果是,則首先對(duì)數(shù)據(jù)進(jìn)行備份,并且記錄所備份數(shù)據(jù)的所在圖2的205中的物理地址和邏輯地址的關(guān)系。然后將該數(shù)據(jù)寫入到圖2的205中主數(shù)據(jù)區(qū)。圖4B描述了該技術(shù)方案使用的上電恢復(fù)數(shù)據(jù)的流程圖。當(dāng)系統(tǒng)啟動(dòng)后,圖2的201和203會(huì)掃描所有205的所有主數(shù)據(jù)區(qū)域和備份區(qū)域。通過記錄在頁(yè)內(nèi)的結(jié)構(gòu)信息和 ECC保護(hù)機(jī)制,可以如步驟402恢復(fù)出所有映射關(guān)系表,以及如步驟403可以獲得上次掉電時(shí)寫入的最后一個(gè)頁(yè)的數(shù)據(jù)。步驟404會(huì)判斷是否數(shù)據(jù)被損壞,如果無損壞,則無需做數(shù)據(jù)恢復(fù)。如果步驟404發(fā)現(xiàn)最后頁(yè)數(shù)據(jù)被損壞,則在步驟405判斷是否高位頁(yè)數(shù)據(jù)被破壞,如果是高位頁(yè)在通過203得到相應(yīng)的備份區(qū)地址,步驟406讀取備份數(shù)據(jù)后,步驟407寫入主數(shù)據(jù)區(qū)。如果405判斷,則無備份數(shù)據(jù)即無需恢復(fù)數(shù)據(jù),結(jié)束恢復(fù)數(shù)據(jù)。由于該技術(shù)方案引入了“備份數(shù)據(jù)區(qū)”和“數(shù)據(jù)備份策略”,雖然解決了耦合頁(yè)數(shù)據(jù)被破壞的問題,也無需額外存儲(chǔ)器和設(shè)計(jì)復(fù)雜度。但是由于備份數(shù)據(jù)區(qū)的存在,必然引出用戶數(shù)據(jù)區(qū)大小被減少的問題,和數(shù)據(jù)的備份操作,如304,406,407的操作,也必然引出寫放大(Write Amplification)增加的問題,該問題會(huì)降低固態(tài)硬盤性能,同時(shí)由于備份區(qū)的讀寫次數(shù)遠(yuǎn)大于主數(shù)據(jù)區(qū)的讀寫次數(shù),導(dǎo)致備份區(qū)數(shù)據(jù)塊容易老化,降低了整體的磨損均衡 (Wear-Leveling),影響了固態(tài)硬盤的壽命。另外有更多的方案是通過外加超級(jí)電容或者備用電池來防止掉電情況的發(fā)生,從而阻止在寫高位頁(yè)操作異常。這類技術(shù)方案都集中解決系統(tǒng)中緩存的數(shù)據(jù)如何寫入閃存的問題,且只能降低電源失效而導(dǎo)致數(shù)據(jù)破壞的幾率,沒有真正解決耦合頁(yè)的數(shù)據(jù)被破壞的問題。事實(shí)上,主機(jī)系統(tǒng)允許緩存或者最后一次意外掉電導(dǎo)致丟失當(dāng)前的數(shù)據(jù),但是絕對(duì)不允許丟失以往寫入的數(shù)據(jù)。所以如何保護(hù)以往數(shù)據(jù)不被破壞,才是固態(tài)硬盤掉電保護(hù)的關(guān)鍵。
發(fā)明內(nèi)容
為解決上述問題,本發(fā)明公開一種固態(tài)硬盤掉電和寫異常處理方法及系統(tǒng)。發(fā)明目的在于本發(fā)明通過動(dòng)態(tài)的管理低位頁(yè),將低位頁(yè)作為獨(dú)立的地址映射區(qū),主機(jī)輸入的數(shù)據(jù)只會(huì)寫入該區(qū)域,而且無需另外把數(shù)據(jù)寫入備份區(qū)。當(dāng)該區(qū)域耗盡時(shí),啟用普通存儲(chǔ)區(qū), 同時(shí)進(jìn)行垃圾頁(yè)回收(Gartage Collection),這樣不僅保持低位頁(yè)的區(qū)域的大小,保證數(shù)據(jù)在沒有被正確寫入高位頁(yè)時(shí),不會(huì)刪除低位頁(yè)的數(shù)據(jù)。這樣在不增加硬件設(shè)計(jì)成本和復(fù)雜度的基礎(chǔ)上,不僅解決因電源失效導(dǎo)致寫異常產(chǎn)生的低位頁(yè)的數(shù)據(jù)被破壞的問題,而且解決了如何無需備份數(shù)據(jù)即可達(dá)到保護(hù)低位頁(yè)數(shù)據(jù),減低寫放大,提高固態(tài)硬盤的性能。本發(fā)明公開一種固態(tài)硬盤掉電和寫異常處理方法,包括如下步驟步驟100,對(duì)閃存陣列進(jìn)行掃描,獲取存儲(chǔ)的管理信息,提取管理信息后進(jìn)行初始化,生成多個(gè)映射區(qū),動(dòng)態(tài)調(diào)整映射區(qū),管理MLC到SLC的轉(zhuǎn)換;步驟200,進(jìn)行數(shù)據(jù)讀寫,讀取時(shí),通過兩個(gè)映射區(qū),找到相應(yīng)物理地址,讀取閃存上的數(shù)據(jù);當(dāng)數(shù)據(jù)寫入時(shí),通過第一映射區(qū)獲取一個(gè)新的空閑低位頁(yè),將數(shù)據(jù)寫入該低位頁(yè),并且把映射關(guān)系同時(shí)帶入低位頁(yè)內(nèi),同時(shí)更新映射表用于后續(xù)讀??;步驟300,當(dāng)寫入數(shù)據(jù)時(shí),如果發(fā)生第一映射區(qū)已經(jīng)無空閑低位頁(yè),那么啟動(dòng)垃圾頁(yè)回收管理和磨損均衡管理;步驟400,當(dāng)發(fā)生掉電或者寫異常的情況,多個(gè)映射區(qū)進(jìn)行相應(yīng)操作恢復(fù)數(shù)據(jù)。所述步驟100,還包括步驟110,通過動(dòng)態(tài)地將一部分MLC轉(zhuǎn)換為SLC使用,系統(tǒng)會(huì)將這部分區(qū)域作為第一映射區(qū),將剩余部分的存儲(chǔ)區(qū)作為第二映射區(qū),其中第一映射區(qū)大小是根據(jù)額外提供區(qū)和第二映射區(qū)的大小進(jìn)行動(dòng)態(tài)調(diào)整,還用于對(duì)回收的垃圾頁(yè),進(jìn)行統(tǒng)一管理再分配,根據(jù)磨損程度不同,分配給不同的映射區(qū)。所述步驟200,還包括步驟210,系統(tǒng)開始初始化,執(zhí)行步驟220 ;步驟220,接收寫入指令之后,執(zhí)行步驟230 ;步驟230,判斷第一映射區(qū)是否有空閑頁(yè),如果有空閑頁(yè),執(zhí)行步驟,240 ;步驟M0,獲取一個(gè)低位頁(yè)后,直接寫入數(shù)據(jù),即將數(shù)據(jù)寫入第一映射區(qū),然后完成寫操作;當(dāng)步驟230發(fā)現(xiàn)第一映射區(qū)沒有空閑頁(yè)時(shí),執(zhí)行步驟250 ;步驟250,查看是否第一映射區(qū)是否有無效頁(yè),如果有無效頁(yè)回收第一映射區(qū)的無效頁(yè),獲得低位頁(yè),將數(shù)據(jù)寫入后完成操作;如果發(fā)現(xiàn)第一映射區(qū)無無效頁(yè),執(zhí)行步驟260 ;步驟沈0,啟動(dòng)第二映射區(qū),將第一映射區(qū)的部分?jǐn)?shù)據(jù)搬移至第二映射區(qū),進(jìn)行第二映射區(qū)目標(biāo)頁(yè)判斷,直到寫入高位頁(yè)時(shí),回收第一映射區(qū)的無效頁(yè),執(zhí)行步驟270 ;步驟270,完成回收后,從第一映射區(qū)獲得一個(gè)空閑的低位頁(yè),完成數(shù)據(jù)寫入操作。所述步驟300,還包括步驟310,磨損均衡管理根據(jù)第一映射區(qū)映射表中的信息,優(yōu)先回收垃圾頁(yè)后,再進(jìn)行空閑頁(yè)分配后,將數(shù)據(jù)寫入第一映射區(qū);如果回收后,仍然無法獲得足夠的空閑頁(yè),那么將一定數(shù)量的有效數(shù)據(jù)搬移至第二映射區(qū),從而第一映射區(qū)可獲取空閑頁(yè)后,將數(shù)據(jù)寫入第一映射區(qū);步驟320,當(dāng)搬移過程發(fā)生寫時(shí),當(dāng)寫入目標(biāo)頁(yè)為低位頁(yè)時(shí),不立即釋放第一映射區(qū)的有效頁(yè),一直到跟該低位頁(yè)相耦合的高位頁(yè)也被安全的寫入完成后,回收掉該低位頁(yè)對(duì)應(yīng)的第一映射區(qū)的無效頁(yè)。所述的固態(tài)硬盤掉電和寫異常處理方法,在發(fā)生掉電和寫異常情況下所述步驟 400,還包括步驟410,上電完成初始化后,首先通過掃描閃存內(nèi)的管理信息,執(zhí)行步驟420 ;步驟420,恢復(fù)映射表,執(zhí)行步驟430 ;步驟430,通過判斷第二映射區(qū)內(nèi)是否有損毀的數(shù)據(jù)頁(yè),如果有損毀的數(shù)據(jù)頁(yè),執(zhí)行步驟440,如果沒有損毀的數(shù)據(jù)頁(yè),執(zhí)行步驟470 ;步驟440,通過第一映射區(qū)映射表查找到相應(yīng)的數(shù)據(jù)頁(yè)后,執(zhí)行步驟450 ;步驟450,獲取第二映射區(qū)的空閑頁(yè),然后執(zhí)行步驟460 ;步驟460,將數(shù)據(jù)從第一映射區(qū)搬移到第二映射區(qū),并設(shè)置第一映射區(qū)的對(duì)應(yīng)頁(yè)為無效頁(yè)后結(jié)束;步驟470,判斷是否存在第一映射區(qū)與第二映射區(qū)映射重疊,如果存在,執(zhí)行步驟 480 ;步驟480,設(shè)置第一映射區(qū)內(nèi)的對(duì)應(yīng)頁(yè)為無效頁(yè),然后結(jié)束恢復(fù)操作。所述步驟100中動(dòng)態(tài)調(diào)整映射區(qū),還包括如下步驟步驟120,查看第二映射表的對(duì)應(yīng)空閑頁(yè)狀態(tài),執(zhí)行步驟130 ;步驟130,查看第二映射區(qū)的空閑頁(yè)是否達(dá)到閾值,執(zhí)行步驟140,如果未達(dá)閾值, 執(zhí)行步驟150 ;步驟140,如果大于最大閾值,則增加第一映射區(qū)大小,如果小于最小閾值,則減小第一映射區(qū)大小;
步驟150,額外提供區(qū)是否大于閾值,如果大于閾值,則增加第一映射區(qū),如果小于閾值,執(zhí)行步驟160;步驟160,進(jìn)行回收垃圾頁(yè),根據(jù)磨損均衡算法,對(duì)回收的垃圾頁(yè)再分配,從而完成調(diào)整映射區(qū)的大小。本發(fā)明還公開一種固態(tài)硬盤掉電和寫異常處理系統(tǒng),包括緩存管理模塊,用于存儲(chǔ)對(duì)閃存陣列進(jìn)行掃描后獲取的管理信息,并提取管理信息后進(jìn)行初始化,生成多個(gè)映射區(qū),動(dòng)態(tài)調(diào)整映射區(qū),管理MLC到SLC的轉(zhuǎn)換;數(shù)據(jù)讀寫模塊,當(dāng)數(shù)據(jù)讀取時(shí),通過兩個(gè)映射區(qū)進(jìn)行數(shù)據(jù)讀取。當(dāng)數(shù)據(jù)寫入時(shí),通過第一映射區(qū)獲取一個(gè)新的空閑低位頁(yè),將數(shù)據(jù)寫入該低位頁(yè),并且把映射關(guān)系同時(shí)帶入低位頁(yè)內(nèi),同時(shí)更新映射表用于后續(xù)讀??;垃圾回收管理模塊,用于當(dāng)寫入數(shù)據(jù)時(shí),如果發(fā)生第一映射區(qū)已經(jīng)無空閑低位頁(yè), 那么啟動(dòng)垃圾頁(yè)回收管理和磨損均衡管理;數(shù)據(jù)恢復(fù)模塊,用于當(dāng)發(fā)生掉電或者寫異常的情況,多個(gè)映射區(qū)進(jìn)行相應(yīng)操作恢復(fù)數(shù)據(jù)。所述的固態(tài)硬盤掉電和寫異常處理系統(tǒng),還包括磨損均衡管理模塊,用于通過動(dòng)態(tài)地將一部分MLC轉(zhuǎn)換為SLC使用,系統(tǒng)會(huì)將這部分區(qū)域作為第一映射區(qū),將剩余部分的存儲(chǔ)區(qū)作為第二映射區(qū),其中第一映射區(qū)大小是根據(jù)額外提供區(qū)和第二映射區(qū)的大小進(jìn)行動(dòng)態(tài)調(diào)整,還用于對(duì)回收的垃圾頁(yè),進(jìn)行統(tǒng)一管理再分配,根據(jù)磨損程度不同,分配給不同的映射區(qū)。所述數(shù)據(jù)讀寫模塊還包括初始化模塊,用于系統(tǒng)開始初始化;寫入指令模塊,用于接收寫入指令;判斷空閑頁(yè)模塊,用于判斷第一映射區(qū)是否有空閑頁(yè);寫入數(shù)據(jù)模塊,用于獲取一個(gè)低位頁(yè)后,直接寫入數(shù)據(jù),即將數(shù)據(jù)寫入第一映射區(qū),然后完成寫操作;無效頁(yè)判斷模塊,用于查看第一映射區(qū)是否有無效頁(yè),如果有無效頁(yè)回收第一映射區(qū)的無效頁(yè),獲得低位頁(yè),將數(shù)據(jù)寫入后完成操作;數(shù)據(jù)搬移模塊,用于啟動(dòng)第二映射區(qū),將第一映射區(qū)的部分?jǐn)?shù)據(jù)搬移至第二映射區(qū),進(jìn)行第二映射區(qū)目標(biāo)頁(yè)判斷,直到寫入高位頁(yè)時(shí),回收第一映射區(qū)的無效頁(yè);完成寫入模塊,用于完成回收后,從第一映射區(qū)獲得一個(gè)空閑的低位頁(yè),完成數(shù)據(jù)寫入操作。所述垃圾回收管理模塊還包括映射區(qū)釋放模塊,用于磨損均衡管理根據(jù)第一映射區(qū)映射表中的信息,優(yōu)先回收垃圾頁(yè),再進(jìn)行空閑頁(yè)分配后,將數(shù)據(jù)寫入第一映射區(qū);如果回收后,仍然無法獲得足夠的空閑頁(yè),那么將一定數(shù)量的有效數(shù)據(jù)搬移至第二映射區(qū),從而第一映射區(qū)可獲取空閑頁(yè)后, 將數(shù)據(jù)寫入第一映射區(qū);回收釋放模塊,用于當(dāng)搬移過程發(fā)生寫時(shí),當(dāng)寫入目標(biāo)頁(yè)為低位頁(yè)時(shí),不立即釋放第一映射區(qū)的有效頁(yè),一直到跟該低位頁(yè)相耦合的高位頁(yè)也被安全的寫入完成后,回收掉該低位頁(yè)對(duì)應(yīng)的第一映射區(qū)的無效頁(yè)。
所述的固態(tài)硬盤掉電和寫異常處理系統(tǒng),在發(fā)生掉電和寫異常情況下所述數(shù)據(jù)恢復(fù)模塊,還包括管理信息模塊,用于上電完成初始化后,首先通過掃描閃存內(nèi)的管理信息;恢復(fù)映射表模塊,用于恢復(fù)映射表;損毀判斷模塊,用于通過判斷第二映射區(qū)內(nèi)是否有損毀的數(shù)據(jù)頁(yè);映射表查找模塊,用于通過第一映射區(qū)映射表查找到相應(yīng)的數(shù)據(jù)頁(yè)后;獲取空閑頁(yè)模塊,用于獲取第二映射區(qū)的空閑頁(yè);數(shù)據(jù)映射設(shè)置模塊,用于將數(shù)據(jù)寫入第二映射區(qū),并設(shè)置第一映射區(qū)的對(duì)應(yīng)頁(yè)為無效頁(yè)后結(jié)束;映射重疊判斷模塊,用于判斷是否存在第一映射區(qū)與第二映射區(qū)映射重疊;無效頁(yè)設(shè)置模塊,用于設(shè)置第一映射區(qū)內(nèi)的對(duì)應(yīng)頁(yè)為無效頁(yè),然后結(jié)束恢復(fù)操作。所述緩存管理模塊中動(dòng)態(tài)調(diào)整映射區(qū),還包括查看空閑頁(yè)模塊,用于查看第二映射表的對(duì)應(yīng)空閑頁(yè)狀態(tài);閾值判斷模塊,用于查看第二映射區(qū)的空閑頁(yè)是否大于閾值極限閾值判斷模塊,用于如果大于最大閾值,則增加第一映射區(qū)大小,如果小于最小閾值,則減小第一映射區(qū)大?。活~外提供區(qū)閾值判斷模塊,用于額外提供區(qū)是否大于閾值,如果大于閾值,則增加第一映射區(qū),如果小于閾值,進(jìn)行回收垃圾頁(yè),從而完成調(diào)整映射區(qū)的大小。本發(fā)明的有益效果在于,由于本發(fā)明引入了 “多映射區(qū)技術(shù)”,“映射區(qū)切換技術(shù)” 和“動(dòng)態(tài)調(diào)整映射區(qū)技術(shù)”,從另一種思路解決了寫異?;蛘叩綦姸鸬牡臀豁?yè)數(shù)據(jù)被破壞的問題,同時(shí)利用“映射區(qū)切換技術(shù)”避免了數(shù)據(jù)備份區(qū)的出現(xiàn),而利用“動(dòng)態(tài)調(diào)整映射區(qū)技術(shù)”有效控制寫放大的發(fā)生,從而減少固態(tài)硬盤性能損失。
圖1為現(xiàn)有技術(shù)中MLC型NAND FLASH存儲(chǔ)數(shù)據(jù)示意圖;圖2為一現(xiàn)有技術(shù)中固態(tài)硬盤抗掉電和寫異常處理技術(shù)結(jié)構(gòu)示意圖;圖3為另一現(xiàn)有技術(shù)中固態(tài)硬盤抗掉電和寫異常處理技術(shù)結(jié)構(gòu)示意圖;圖4A為另一現(xiàn)有技術(shù)中固態(tài)硬盤抗掉電和寫異常處理流程圖;圖4B為另一現(xiàn)有技術(shù)中固態(tài)硬盤抗掉電和寫異常處理流程圖;圖5為本發(fā)明結(jié)構(gòu)示意圖;圖6為本發(fā)明數(shù)據(jù)寫入方式的實(shí)施流程圖;圖7為本發(fā)明當(dāng)?shù)诙成鋮^(qū)低位頁(yè)數(shù)據(jù)被破壞時(shí)恢復(fù)數(shù)據(jù)的流程圖;圖8為本發(fā)明動(dòng)態(tài)調(diào)整第一映射區(qū)的示意9為本發(fā)明方法流程圖。
具體實(shí)施例方式下面給出本發(fā)明的具體實(shí)施方式
,結(jié)合附圖對(duì)本發(fā)明做出進(jìn)一步的描述。如圖9所示本發(fā)明公開一種固態(tài)硬盤掉電和寫異常處理方法,包括如下步驟步驟100,對(duì)閃存陣列進(jìn)行掃描,獲取存儲(chǔ)的管理信息,提取管理信息后進(jìn)行初始化,生成多個(gè)映射區(qū),動(dòng)態(tài)調(diào)整映射區(qū),管理MLC到SLC的轉(zhuǎn)換。所述步驟100,還包括步驟110,通過動(dòng)態(tài)地將一部分MLC轉(zhuǎn)換為SLC使用,系統(tǒng)會(huì)將這部分區(qū)域作為第一映射區(qū),將剩余部分的存儲(chǔ)區(qū)作為第二映射區(qū),其中第一映射區(qū)大小是根據(jù)額外提供區(qū)和第二映射區(qū)的大小進(jìn)行動(dòng)態(tài)調(diào)整,還用于對(duì)回收的垃圾頁(yè),進(jìn)行統(tǒng)一管理再分配,根據(jù)磨損程度不同,分配給不同的映射區(qū)。所述步驟100中動(dòng)態(tài)調(diào)整映射區(qū),還包括如下步驟步驟120,查看第二映射表的對(duì)應(yīng)空閑頁(yè)狀態(tài),執(zhí)行步驟130 ;步驟130,查看第二映射區(qū)的空閑頁(yè)是否達(dá)到閾值,執(zhí)行步驟140,如果未達(dá)閾值, 執(zhí)行步驟150 ;步驟140,如果大于最大閾值,則增加第一映射區(qū)大小,如果小于最小閾值,則減小第一映射區(qū)大??;步驟150,額外提供區(qū)是否大于閾值,如果大于閾值,則增加第一映射區(qū),如果小于閾值,執(zhí)行步驟160;步驟160,進(jìn)行回收垃圾頁(yè),根據(jù)磨損均衡算法,對(duì)回收的垃圾頁(yè)再分配,從而完成調(diào)整映射區(qū)的大小。本發(fā)明公開了無需專門備份數(shù)據(jù)實(shí)現(xiàn)固態(tài)硬盤防掉電和寫異常處理的方法和系統(tǒng)。該方案首先通過MLC轉(zhuǎn)為SLC技術(shù),動(dòng)態(tài)地將一部分MLC轉(zhuǎn)換為類似SLC使用,其中這部分存儲(chǔ)區(qū)大小是根據(jù)額外提供區(qū)(Over Provision)動(dòng)態(tài)調(diào)整,系統(tǒng)會(huì)將MLC轉(zhuǎn)換為類似 SLC的區(qū)域作為第一映射區(qū)(Mapping)。將剩余部分的存儲(chǔ)區(qū)作為第二映射區(qū)。當(dāng)?shù)谝挥成鋮^(qū)耗盡時(shí),通過高效的垃圾頁(yè)回收(Gartage Collection)技術(shù),將釋放出第一映射區(qū)的無效區(qū)域和搬移部分有效區(qū)至第二映射區(qū)。即通過兩映射區(qū)的方式,可以實(shí)現(xiàn)無需備份區(qū), 實(shí)現(xiàn)MLC閃存的寫異常導(dǎo)致數(shù)據(jù)被破壞的問題,同時(shí)在映射區(qū)切換時(shí),在垃圾回收時(shí),實(shí)現(xiàn)數(shù)據(jù)的搬移,減少寫放大。通過動(dòng)態(tài)調(diào)整映射區(qū),實(shí)現(xiàn)磨損均衡。如圖5所示,507為所用的MLC NAND FLASH,被分為多個(gè)區(qū)域,其中區(qū)域0被當(dāng)作 SLC使用,所用映射區(qū)為低位頁(yè),如508所示。區(qū)域1是作為普通MLC使用,即如509所示,所有映射區(qū)為包括高位頁(yè)和低位頁(yè)。區(qū)域2為額外提供區(qū)(Over Provision),區(qū)域3為其他使用區(qū)。區(qū)域0,區(qū)域1和區(qū)域2都是指邏輯區(qū)域,即不是固定的對(duì)應(yīng)的物理地址,是動(dòng)態(tài)映射分配的,對(duì)于區(qū)域0和區(qū)域1其大小是根據(jù)區(qū)域2,以及垃圾頁(yè)回收(Gartage Collection) 和磨損均衡管理(Wear-Leveling)(垃圾回收和磨損均衡管理是統(tǒng)一管理的,即對(duì)區(qū)域1和區(qū)域2統(tǒng)一實(shí)現(xiàn)管理)而確定其大小。當(dāng)固態(tài)硬盤上電之后,微處理器501對(duì)整個(gè)系統(tǒng)進(jìn)行初始化和上電數(shù)據(jù)恢復(fù)流程,即通過緩存管理模塊502存儲(chǔ)對(duì)整個(gè)閃存陣列進(jìn)行掃描后獲取的管理信息,提取管理的相關(guān)信息后進(jìn)行初始化第一映射區(qū)503和第二映射區(qū)504管理表。步驟200,進(jìn)行數(shù)據(jù)讀寫,讀取時(shí),通過兩個(gè)映射區(qū),找到相應(yīng)物理地址,讀取閃存上的數(shù)據(jù);當(dāng)數(shù)據(jù)寫入時(shí),通過第一映射區(qū)獲取一個(gè)新的空閑低位頁(yè),將數(shù)據(jù)寫入該低位頁(yè),并且把映射關(guān)系同時(shí)帶入低位頁(yè)內(nèi),同時(shí)更新映射表用于后續(xù)讀取。所述步驟200,還包括步驟210,系統(tǒng)開始初始化,執(zhí)行步驟220 ;
10
步驟220,接收寫入指令之后,執(zhí)行步驟230 ;步驟230,判斷第一映射區(qū)是否有空閑頁(yè),如果有空閑頁(yè),執(zhí)行步驟,240 ;步驟M0,獲取一個(gè)低位頁(yè)后,直接寫入數(shù)據(jù),即將數(shù)據(jù)寫入第一映射區(qū),然后完成寫操作;當(dāng)步驟230發(fā)現(xiàn)第一映射區(qū)沒有空閑頁(yè)時(shí),執(zhí)行步驟250 ;步驟250,查看是否第一映射區(qū)是否有無效頁(yè),如果有無效頁(yè)回收第一映射區(qū)的無效頁(yè),獲得低位頁(yè),將數(shù)據(jù)寫入后完成操作;如果發(fā)現(xiàn)第一映射區(qū)無無效頁(yè),執(zhí)行步驟260 ;步驟沈0,啟動(dòng)第二映射區(qū),將第一映射區(qū)的部分?jǐn)?shù)據(jù)搬移至第二映射區(qū),進(jìn)行第二映射區(qū)目標(biāo)頁(yè)判斷,直到寫入高位頁(yè)時(shí),回收第一映射區(qū)的無效頁(yè),執(zhí)行步驟270 ;步驟270,完成回收后,從第一映射區(qū)獲得一個(gè)空閑的低位頁(yè),完成數(shù)據(jù)寫入操作。當(dāng)固態(tài)硬盤開始工作時(shí),當(dāng)數(shù)據(jù)讀取時(shí),根據(jù)第一映射區(qū)503,第二映射區(qū)504的映射表,獲得所對(duì)應(yīng)的數(shù)據(jù)區(qū),然后從507中將數(shù)據(jù)讀取。當(dāng)數(shù)據(jù)寫入時(shí),通過第一映射區(qū) 503獲取一個(gè)新的空閑低位頁(yè),將數(shù)據(jù)寫入該低位頁(yè),并且把映射關(guān)系同時(shí)帶入低位頁(yè)內(nèi), 同時(shí)更新映射表用于后續(xù)讀取。由于第一映射區(qū)內(nèi)的存儲(chǔ)器是類似SLC的性質(zhì)(是指把MLC當(dāng)成SLC使用,即通過NAND FLASH提供的命令和轉(zhuǎn)變流程,或者通過軟件技術(shù)在MLC中分離出低位頁(yè)單獨(dú)使用,從而在MLC中實(shí)現(xiàn)SLC的性質(zhì)),所以不會(huì)發(fā)生在寫操作異常時(shí),破壞以往的數(shù)據(jù)。當(dāng)寫入數(shù)據(jù)時(shí),如果發(fā)生第一映射區(qū)已經(jīng)無空閑低位頁(yè),那么啟動(dòng)垃圾頁(yè)回收管理505 (Garbage Collection)管理磨損均衡管理模塊506,磨損均衡管理模塊506根據(jù)第一映射區(qū)503映射表中的信息,優(yōu)先回收垃圾頁(yè),由506進(jìn)行垃圾頁(yè)再分配。如果回收后,仍然無法獲得足夠的空閑頁(yè),那么進(jìn)行將一定數(shù)量的有效數(shù)據(jù)搬移至第二映射區(qū)。(所述一定數(shù)量根據(jù)設(shè)定的閾值來確定,并不固定。要根據(jù)性能和寫放大需求而定。)當(dāng)搬移過程發(fā)生寫時(shí),當(dāng)寫入目標(biāo)頁(yè)為低位頁(yè)時(shí),不立即釋放第一映射區(qū)的有效頁(yè),一直到跟該低位頁(yè)相耦合的高位頁(yè)也被安全的寫入完成后,回收掉該低位頁(yè)對(duì)應(yīng)的第一映射區(qū)的有效頁(yè)。這樣可以保證搬移過程,出現(xiàn)寫高位頁(yè)操作異常時(shí),與之對(duì)應(yīng)的低位頁(yè)數(shù)據(jù)被破壞,但是對(duì)應(yīng)的數(shù)據(jù)仍保留在第一映射區(qū),從而恢復(fù)該頁(yè)數(shù)據(jù)。所以在本發(fā)明中,對(duì)于系統(tǒng)異常掉電時(shí),如果系統(tǒng)處于寫入第一映射區(qū)操作,那么無需考慮以往低位頁(yè)數(shù)據(jù)被破壞的問題。如果系統(tǒng)處于寫入第二映射區(qū)操作,那么由于第一映射區(qū)的數(shù)據(jù)并未被擦除,那么當(dāng)系統(tǒng)重新上電時(shí),必然可以恢復(fù)出被破壞的低位頁(yè)內(nèi)的數(shù)據(jù)。附圖6為本發(fā)明一個(gè)數(shù)據(jù)寫入方式的實(shí)施流程圖,含有映射區(qū)切換過程。系統(tǒng)開始初始化完成步驟601,執(zhí)行步驟602接受寫入指令之后,通過步驟603判斷第一映射區(qū)是否有空閑頁(yè),如果有空閑頁(yè),執(zhí)行步驟604則獲取一個(gè)低位頁(yè)后,執(zhí)行步驟605直接寫入數(shù)據(jù),即將數(shù)據(jù)寫入第一映射區(qū),然后執(zhí)行步驟611完成寫操作。當(dāng)步驟603發(fā)現(xiàn)第一映射區(qū)沒有空閑頁(yè)時(shí),通過步驟606查看是否第一映射區(qū)是否有無效頁(yè),如果有無效頁(yè)執(zhí)行步驟 607回收第一映射區(qū)的無效頁(yè),獲得低位頁(yè),將數(shù)據(jù)寫入后完成操作。如果步驟606發(fā)現(xiàn)第一映射區(qū)無無效頁(yè),則通過步驟608啟動(dòng)第二映射區(qū),將第一映射區(qū)的部分?jǐn)?shù)據(jù)搬移至第二映射區(qū),當(dāng)步驟609操作時(shí),通過步驟610進(jìn)行第二映射區(qū)目標(biāo)頁(yè)判斷,直到寫入高位頁(yè)時(shí),才回收第一映射區(qū)的對(duì)應(yīng)無效頁(yè)數(shù)據(jù)。完成回收后,從第一映射區(qū)獲得一個(gè)空閑的低位頁(yè),完成數(shù)據(jù)寫入操作。
步驟300,當(dāng)寫入數(shù)據(jù)時(shí),如果發(fā)生第一映射區(qū)已經(jīng)無空閑低位頁(yè),那么啟動(dòng)垃圾頁(yè)回收管理和磨損均衡管理;所述步驟300,還包括步驟310,磨損均衡管理根據(jù)第一映射區(qū)映射表中的信息,優(yōu)先回收垃圾頁(yè)后,再進(jìn)行空閑頁(yè)分配后,將數(shù)據(jù)寫入第一映射區(qū);如果回收后,仍然無法獲得足夠的空閑頁(yè),那么將一定數(shù)量的有效數(shù)據(jù)搬移至第二映射區(qū),從而第一映射區(qū)可獲取空閑頁(yè)后,將數(shù)據(jù)寫入第一映射區(qū);步驟320,當(dāng)搬移過程發(fā)生寫時(shí),當(dāng)寫入目標(biāo)頁(yè)為低位頁(yè)時(shí),不立即釋放第一映射區(qū)的有效頁(yè),一直到跟該低位頁(yè)相耦合的高位頁(yè)也被安全的寫入完成后,回收掉該低位頁(yè)對(duì)應(yīng)的第一映射區(qū)的無效頁(yè)。步驟400,當(dāng)發(fā)生掉電或者寫異常的情況,多個(gè)映射區(qū)進(jìn)行相應(yīng)操作恢復(fù)數(shù)據(jù)。在發(fā)生掉電和寫異常情況下所述步驟400,還包括步驟410,上電完成初始化后,首先通過掃描閃存內(nèi)的管理信息,執(zhí)行步驟420 ;步驟420,恢復(fù)映射表,執(zhí)行步驟430 ;步驟430,通過判斷第二映射區(qū)內(nèi)是否有損毀的數(shù)據(jù)頁(yè),如果有損毀的數(shù)據(jù)頁(yè),執(zhí)行步驟440,如果沒有損毀的數(shù)據(jù)頁(yè),執(zhí)行步驟470 ;步驟440,通過第一映射區(qū)映射表查找到相應(yīng)的數(shù)據(jù)頁(yè)后,執(zhí)行步驟450 ;步驟450,獲取第二映射區(qū)的空閑頁(yè),然后執(zhí)行步驟460 ;步驟460,將數(shù)據(jù)從第一映射區(qū)搬移到第二映射區(qū),并設(shè)置第一映射區(qū)的對(duì)應(yīng)頁(yè)為無效頁(yè)后結(jié)束;步驟470,判斷是否存在第一映射區(qū)與第二映射區(qū)映射重疊,如果存在,執(zhí)行步驟 480 ;步驟480,設(shè)置第一映射區(qū)內(nèi)的對(duì)應(yīng)頁(yè)為無效頁(yè),然后結(jié)束恢復(fù)操作。附圖7是本發(fā)明一個(gè)當(dāng)?shù)诙成鋮^(qū)低位頁(yè)數(shù)據(jù)發(fā)生被破壞時(shí),恢復(fù)數(shù)據(jù)的流程圖。當(dāng)步驟701上電完成初始化后,首先通過掃描閃存內(nèi)的管理信息完成步驟702恢復(fù)映射表,通過步驟703判斷第二映射區(qū)內(nèi)是否有損毀的數(shù)據(jù)頁(yè),如果有,執(zhí)行步驟704,通過第一映射表查找到相應(yīng)的數(shù)據(jù)頁(yè)后,執(zhí)行步驟705,獲取第二映射區(qū)的空閑頁(yè),然后執(zhí)行步驟 706,將數(shù)據(jù)寫入第二映射區(qū),根據(jù)圖6寫入流程把該數(shù)據(jù)寫入第二映射區(qū),并設(shè)置第一映射區(qū)的對(duì)應(yīng)頁(yè)為無效頁(yè)后結(jié)束。如果步驟703沒有損毀的數(shù)據(jù)頁(yè),需要步驟707判斷是否存在映射重疊,如果存在,執(zhí)行步驟708設(shè)置第一映射區(qū)內(nèi)的對(duì)應(yīng)頁(yè)為無效頁(yè),然后結(jié)束恢復(fù)操作。圖8是本發(fā)明一個(gè)動(dòng)態(tài)調(diào)整第一映射區(qū)的示意圖。開始工作后,步驟802檢查第二映射區(qū)的映射表的對(duì)應(yīng)空閑頁(yè)狀態(tài),步驟803查看第二映射區(qū)的空閑頁(yè)是否大于閾值,如果大于最大閾值,則增加第一映射區(qū)大小,如果小于最小閾值,則減小第一映射區(qū)大小。如果未達(dá)閾值,額外提供區(qū)(Over Provision)是否大于閾值,如果大于閾值,則增加第一映射區(qū)。如果小于閾值,則進(jìn)行回收垃圾頁(yè),從而完成調(diào)整映射區(qū)的大小?;厥諘r(shí),并不區(qū)分是來自第一映射區(qū)還是第二映射區(qū),在垃圾頁(yè)回收處理之后,這些成為額外提供區(qū) (OverProvision),統(tǒng)一作為空閑頁(yè)對(duì)兩個(gè)映射區(qū)進(jìn)行分配。本發(fā)明所公開的固態(tài)硬盤掉電和寫異常處理系統(tǒng),包括緩存管理模塊,用于存儲(chǔ)對(duì)閃存陣列進(jìn)行掃描后獲取的管理信息,并提取管理信息后進(jìn)行初始化,生成多個(gè)映射區(qū), 動(dòng)態(tài)調(diào)整映射區(qū),管理MLC到SLC的轉(zhuǎn)換;數(shù)據(jù)讀寫模塊,當(dāng)數(shù)據(jù)讀取時(shí),通過兩個(gè)映射區(qū)進(jìn)行數(shù)據(jù)讀取。當(dāng)數(shù)據(jù)寫入時(shí),通過第一映射區(qū)獲取一個(gè)新的空閑低位頁(yè),將數(shù)據(jù)寫入該低位頁(yè),并且把映射關(guān)系同時(shí)帶入低位頁(yè)內(nèi),同時(shí)更新映射表用于后續(xù)讀??;垃圾回收管理模塊,用于當(dāng)寫入數(shù)據(jù)時(shí),如果發(fā)生第一映射區(qū)已經(jīng)無空閑低位頁(yè),那么啟動(dòng)垃圾頁(yè)回收管理和磨損均衡管理;數(shù)據(jù)恢復(fù)模塊,用于當(dāng)發(fā)生掉電或者寫異常的情況,多個(gè)映射區(qū)進(jìn)行相應(yīng)操作恢復(fù)數(shù)據(jù)。所述的固態(tài)硬盤掉電和寫異常處理系統(tǒng),還包括磨損均衡管理模塊,用于通過動(dòng)態(tài)地將一部分MLC轉(zhuǎn)換為SLC使用,系統(tǒng)會(huì)將這部分區(qū)域作為第一映射區(qū),將剩余部分的存儲(chǔ)區(qū)作為第二映射區(qū),其中第一映射區(qū)大小是根據(jù)額外提供區(qū)和第二映射區(qū)的大小進(jìn)行動(dòng)態(tài)調(diào)整,還用于對(duì)回收的垃圾頁(yè),進(jìn)行統(tǒng)一管理再分配,根據(jù)磨損程度不同,分配給不同的映射區(qū)。所述的固態(tài)硬盤掉電和寫異常處理系統(tǒng),所述數(shù)據(jù)讀寫模塊還包括初始化模塊,用于系統(tǒng)開始初始化;寫入指令模塊,用于接收寫入指令;判斷空閑頁(yè)模塊,用于判斷第一映射區(qū)是否有空閑頁(yè);寫入數(shù)據(jù)模塊,用于獲取一個(gè)低位頁(yè)后,直接寫入數(shù)據(jù),即將數(shù)據(jù)寫入第一映射區(qū),然后完成寫操作;無效頁(yè)判斷模塊,用于查看第一映射區(qū)是否有無效頁(yè),如果有無效頁(yè)回收第一映射區(qū)的無效頁(yè),獲得低位頁(yè),將數(shù)據(jù)寫入后完成操作;數(shù)據(jù)搬移模塊,用于啟動(dòng)第二映射區(qū),將第一映射區(qū)的部分?jǐn)?shù)據(jù)搬移至第二映射區(qū),進(jìn)行第二映射區(qū)目標(biāo)頁(yè)判斷,直到寫入高位頁(yè)時(shí),回收第一映射區(qū)的無效頁(yè);完成寫入模塊,用于完成回收后,從第一映射區(qū)獲得一個(gè)空閑的低位頁(yè),完成數(shù)據(jù)寫入操作。所述的固態(tài)硬盤掉電和寫異常處理系統(tǒng),所述垃圾回收管理模塊還包括映射區(qū)釋放模塊,用于磨損均衡管理根據(jù)第一映射區(qū)映射表中的信息,優(yōu)先回收垃圾頁(yè),再進(jìn)行空閑頁(yè)分配后,將數(shù)據(jù)寫入第一映射區(qū);如果回收后,仍然無法獲得足夠的空閑頁(yè),那么將一定數(shù)量的有效數(shù)據(jù)搬移至第二映射區(qū),從而第一映射區(qū)可獲取空閑頁(yè)后, 將數(shù)據(jù)寫入第一映射區(qū);回收釋放模塊,用于當(dāng)搬移過程發(fā)生寫時(shí),當(dāng)寫入目標(biāo)頁(yè)為低位頁(yè)時(shí),不立即釋放第一映射區(qū)的有效頁(yè),一直到跟該低位頁(yè)相耦合的高位頁(yè)也被安全的寫入完成后,回收掉該低位頁(yè)對(duì)應(yīng)的第一映射區(qū)的無效頁(yè)。所述的固態(tài)硬盤掉電和寫異常處理系統(tǒng),在發(fā)生掉電和寫異常情況下所述數(shù)據(jù)恢復(fù)模塊,還包括管理信息模塊,用于上電完成初始化后,首先通過掃描閃存內(nèi)的管理信息;恢復(fù)映射表模塊,用于恢復(fù)映射表;損毀判斷模塊,用于通過判斷第二映射區(qū)內(nèi)是否有損毀的數(shù)據(jù)頁(yè);映射表查找模塊,用于通過第一映射區(qū)映射表查找到相應(yīng)的數(shù)據(jù)頁(yè)后;獲取空閑頁(yè)模塊,用于獲取第二映射區(qū)的空閑頁(yè);
數(shù)據(jù)映射設(shè)置模塊,用于將數(shù)據(jù)寫入第二映射區(qū),并設(shè)置第一映射區(qū)的對(duì)應(yīng)頁(yè)為無效頁(yè)后結(jié)束;映射重疊判斷模塊,用于判斷是否存在第一映射區(qū)與第二映射區(qū)映射重疊;無效頁(yè)設(shè)置模塊,用于設(shè)置第一映射區(qū)內(nèi)的對(duì)應(yīng)頁(yè)為無效頁(yè),然后結(jié)束恢復(fù)操作。所述的固態(tài)硬盤掉電和寫異常處理系統(tǒng),所述緩存管理模塊中動(dòng)態(tài)調(diào)整映射區(qū), 還包括查看空閑頁(yè)模塊,用于查看第二映射表的對(duì)應(yīng)空閑頁(yè)狀態(tài);閾值判斷模塊,用于查看第二映射區(qū)的空閑頁(yè)是否大于閾值極限閾值判斷模塊,用于如果大于最大閾值,則增加第一映射區(qū)大小,如果小于最小閾值,則減小第一映射區(qū)大??;額外提供區(qū)閾值判斷模塊,用于額外提供區(qū)是否大于閾值,如果大于閾值,則增加第一映射區(qū),如果小于閾值,進(jìn)行回收垃圾頁(yè),從而完成調(diào)整映射區(qū)的大小。本發(fā)明的有益效果為1、本發(fā)明可應(yīng)用于固態(tài)硬盤的“多映射區(qū)技術(shù)”,依據(jù)MLC型NAND FLASH可以轉(zhuǎn)化SLC型NAND FLASH使用的特點(diǎn)。把該部分的存儲(chǔ)塊作為第一映射區(qū),該區(qū)沒有耦合頁(yè)相互影響的缺點(diǎn),即可以解決低位頁(yè)數(shù)據(jù)在高位頁(yè)寫操作異常時(shí)被破壞的問題,同時(shí)由于這部分區(qū)域是作為邏輯映射區(qū)的,那么無需額外的區(qū)域作為備份區(qū)。把其余普通MLC型NAND FLASH作為第二映射區(qū),解決如果只有第一映射區(qū),那么閃存類型轉(zhuǎn)換會(huì)導(dǎo)致容量減少的問題。2、本發(fā)明可應(yīng)用于固態(tài)硬盤的“映射區(qū)切換技術(shù)”,根據(jù)寫入數(shù)據(jù)對(duì)應(yīng)的第一映射區(qū)耗盡時(shí),通過垃圾頁(yè)回收的方式,將第一映射區(qū)的無效頁(yè)回收或者部分有效數(shù)據(jù)移至第二映射區(qū)。把數(shù)據(jù)的搬移和垃圾回收結(jié)合在一起,從而避免了專用的數(shù)據(jù)備份過程,減少寫放大。在映射區(qū)轉(zhuǎn)換時(shí),同時(shí)解決了第二映射區(qū)低位頁(yè)數(shù)據(jù)被破壞的問題。3、本發(fā)明可應(yīng)用于固態(tài)硬盤的“動(dòng)態(tài)調(diào)整映射區(qū)技術(shù)”,為了避免第一映射區(qū)的老化快于第二映射區(qū),采用動(dòng)態(tài)調(diào)整映射區(qū)的方式和統(tǒng)一回收垃圾頁(yè)和分配空閑頁(yè),從而達(dá)到整體磨損均衡(Wear-Leveling)。通過動(dòng)態(tài)調(diào)整映射區(qū)大小,以適應(yīng)固態(tài)硬盤在其不同生命期的性能。本領(lǐng)域的技術(shù)人員在不脫離權(quán)利要求書確定的本發(fā)明的精神和范圍的條件下,還可以對(duì)以上內(nèi)容進(jìn)行各種各樣的修改。因此本發(fā)明的范圍并不僅限于以上的說明,而是由權(quán)利要求書的范圍來確定的。
權(quán)利要求
1.一種固態(tài)硬盤掉電和寫異常處理方法,其特征在于,包括如下步驟步驟100,對(duì)閃存陣列進(jìn)行掃描,獲取存儲(chǔ)的管理信息,提取管理信息后進(jìn)行初始化,生成多個(gè)映射區(qū),動(dòng)態(tài)調(diào)整映射區(qū),管理MLC到SLC的轉(zhuǎn)換;步驟200,進(jìn)行數(shù)據(jù)讀寫,讀取時(shí),通過兩個(gè)映射區(qū),找到相應(yīng)物理地址,讀取閃存上的數(shù)據(jù);當(dāng)數(shù)據(jù)寫入時(shí),通過第一映射區(qū)獲取一個(gè)新的空閑低位頁(yè),將數(shù)據(jù)寫入該低位頁(yè),并且把映射關(guān)系同時(shí)帶入低位頁(yè)內(nèi),同時(shí)更新映射表用于后續(xù)讀?。徊襟E300,當(dāng)寫入數(shù)據(jù)時(shí),如果發(fā)生第一映射區(qū)已經(jīng)無空閑低位頁(yè),那么啟動(dòng)垃圾頁(yè)回收管理和磨損均衡管理;步驟400,當(dāng)發(fā)生掉電或者寫異常的情況,多個(gè)映射區(qū)進(jìn)行相應(yīng)操作恢復(fù)數(shù)據(jù)。
2.如權(quán)利要求1所述的固態(tài)硬盤掉電和寫異常處理方法,其特征在于,所述步驟100, 還包括步驟110,通過動(dòng)態(tài)地將一部分MLC轉(zhuǎn)換為SLC使用,系統(tǒng)會(huì)將這部分區(qū)域作為第一映射區(qū),將剩余部分的存儲(chǔ)區(qū)作為第二映射區(qū),其中第一映射區(qū)大小是根據(jù)額外提供區(qū)和第二映射區(qū)的大小進(jìn)行動(dòng)態(tài)調(diào)整,還用于對(duì)回收的垃圾頁(yè),進(jìn)行統(tǒng)一管理再分配,根據(jù)磨損程度不同,分配給不同的映射區(qū)。
3.如權(quán)利要求1所述的固態(tài)硬盤掉電和寫異常處理方法,其特征在于,所述步驟200, 還包括步驟210,系統(tǒng)開始初始化,執(zhí)行步驟220 ; 步驟220,接收寫入指令之后,執(zhí)行步驟230 ;步驟230,判斷第一映射區(qū)是否有空閑頁(yè),如果有空閑頁(yè),執(zhí)行步驟,240 ; 步驟M0,獲取一個(gè)低位頁(yè)后,直接寫入數(shù)據(jù),即將數(shù)據(jù)寫入第一映射區(qū),然后完成寫操作;當(dāng)步驟230發(fā)現(xiàn)第一映射區(qū)沒有空閑頁(yè)時(shí),執(zhí)行步驟250 ;步驟250,查看是否第一映射區(qū)是否有無效頁(yè),如果有無效頁(yè)回收第一映射區(qū)的無效頁(yè),獲得低位頁(yè),將數(shù)據(jù)寫入后完成操作;如果發(fā)現(xiàn)第一映射區(qū)無無效頁(yè),執(zhí)行步驟260 ;步驟沈0,啟動(dòng)第二映射區(qū),將第一映射區(qū)的部分?jǐn)?shù)據(jù)搬移至第二映射區(qū),進(jìn)行第二映射區(qū)目標(biāo)頁(yè)判斷,直到寫入高位頁(yè)時(shí),回收第一映射區(qū)的無效頁(yè),執(zhí)行步驟270;步驟270,完成回收后,從第一映射區(qū)獲得一個(gè)空閑的低位頁(yè),完成數(shù)據(jù)寫入操作。
4.如權(quán)利要求1所述的固態(tài)硬盤掉電和寫異常處理方法,其特征在于,所述步驟300, 還包括步驟310,磨損均衡管理根據(jù)第一映射區(qū)映射表中的信息,優(yōu)先回收垃圾頁(yè)后,再進(jìn)行空閑頁(yè)分配后,將數(shù)據(jù)寫入第一映射區(qū);如果回收后,仍然無法獲得足夠的空閑頁(yè),那么將一定數(shù)量的有效數(shù)據(jù)搬移至第二映射區(qū),從而第一映射區(qū)可獲取空閑頁(yè)后,將數(shù)據(jù)寫入第一映射區(qū);步驟320,當(dāng)搬移過程發(fā)生寫時(shí),當(dāng)寫入目標(biāo)頁(yè)為低位頁(yè)時(shí),不立即釋放第一映射區(qū)的有效頁(yè),一直到跟該低位頁(yè)相耦合的高位頁(yè)也被安全的寫入完成后,回收掉該低位頁(yè)對(duì)應(yīng)的第一映射區(qū)的無效頁(yè)。
5.如權(quán)利要求1所述的固態(tài)硬盤掉電和寫異常處理方法,其特征在于,在發(fā)生掉電和寫異常情況下所述步驟400,還包括步驟410,上電完成初始化后,首先通過掃描閃存內(nèi)的管理信息,執(zhí)行步驟420;步驟420,恢復(fù)映射表,執(zhí)行步驟430 ;步驟430,通過判斷第二映射區(qū)內(nèi)是否有損毀的數(shù)據(jù)頁(yè),如果有損毀的數(shù)據(jù)頁(yè),執(zhí)行步驟440,如果沒有損毀的數(shù)據(jù)頁(yè),執(zhí)行步驟470 ;步驟440,通過第一映射區(qū)映射表查找到相應(yīng)的數(shù)據(jù)頁(yè)后,執(zhí)行步驟450 ; 步驟450,獲取第二映射區(qū)的空閑頁(yè),然后執(zhí)行步驟460 ;步驟460,將數(shù)據(jù)從第一映射區(qū)搬移到第二映射區(qū),并設(shè)置第一映射區(qū)的對(duì)應(yīng)頁(yè)為無效頁(yè)后結(jié)束;步驟470,判斷是否存在第一映射區(qū)與第二映射區(qū)映射重疊,如果存在,執(zhí)行步驟480 ; 步驟480,設(shè)置第一映射區(qū)內(nèi)的對(duì)應(yīng)頁(yè)為無效頁(yè),然后結(jié)束恢復(fù)操作。
6.如權(quán)利要求1所述的固態(tài)硬盤掉電和寫異常處理方法,其特征在于,所述步驟100中動(dòng)態(tài)調(diào)整映射區(qū),還包括如下步驟步驟120,查看第二映射表的對(duì)應(yīng)空閑頁(yè)狀態(tài),執(zhí)行步驟130 ;步驟130,查看第二映射區(qū)的空閑頁(yè)是否達(dá)到閾值,執(zhí)行步驟140,如果未達(dá)閾值,執(zhí)行步驟150 ;步驟140,如果大于最大閾值,則增加第一映射區(qū)大小,如果小于最小閾值,則減小第一映射區(qū)大小;步驟150,額外提供區(qū)是否大于閾值,如果大于閾值,則增加第一映射區(qū),如果小于閾值,執(zhí)行步驟160;步驟160,進(jìn)行回收垃圾頁(yè),根據(jù)磨損均衡算法,對(duì)回收的垃圾頁(yè)再分配,從而完成調(diào)整映射區(qū)的大小。
7.一種固態(tài)硬盤掉電和寫異常處理系統(tǒng),其特征在于,包括緩存管理模塊,用于存儲(chǔ)對(duì)閃存陣列進(jìn)行掃描后獲取的管理信息,并提取管理信息后進(jìn)行初始化,生成多個(gè)映射區(qū),動(dòng)態(tài)調(diào)整映射區(qū),管理MLC到SLC的轉(zhuǎn)換;數(shù)據(jù)讀寫模塊,當(dāng)數(shù)據(jù)讀取時(shí),通過兩個(gè)映射區(qū)進(jìn)行數(shù)據(jù)讀取。當(dāng)數(shù)據(jù)寫入時(shí),通過第一映射區(qū)獲取一個(gè)新的空閑低位頁(yè),將數(shù)據(jù)寫入該低位頁(yè),并且把映射關(guān)系同時(shí)帶入低位頁(yè)內(nèi),同時(shí)更新映射表用于后續(xù)讀??;垃圾回收管理模塊,用于當(dāng)寫入數(shù)據(jù)時(shí),如果發(fā)生第一映射區(qū)已經(jīng)無空閑低位頁(yè),那么啟動(dòng)垃圾頁(yè)回收管理和磨損均衡管理;數(shù)據(jù)恢復(fù)模塊,用于當(dāng)發(fā)生掉電或者寫異常的情況,多個(gè)映射區(qū)進(jìn)行相應(yīng)操作恢復(fù)數(shù)據(jù)。
8.如權(quán)利要求7所述的固態(tài)硬盤掉電和寫異常處理系統(tǒng),其特征在于,還包括 磨損均衡管理模塊,用于通過動(dòng)態(tài)地將一部分MLC轉(zhuǎn)換為SLC使用,系統(tǒng)會(huì)將這部分區(qū)域作為第一映射區(qū),將剩余部分的存儲(chǔ)區(qū)作為第二映射區(qū),其中第一映射區(qū)大小是根據(jù)額外提供區(qū)和第二映射區(qū)的大小進(jìn)行動(dòng)態(tài)調(diào)整,還用于對(duì)回收的垃圾頁(yè),進(jìn)行統(tǒng)一管理再分配,根據(jù)磨損程度不同,分配給不同的映射區(qū)。
9.如權(quán)利要求7所述的固態(tài)硬盤掉電和寫異常處理系統(tǒng),其特征在于,所述數(shù)據(jù)讀寫模塊還包括初始化模塊,用于系統(tǒng)開始初始化; 寫入指令模塊,用于接收寫入指令;判斷空閑頁(yè)模塊,用于判斷第一映射區(qū)是否有空閑頁(yè);寫入數(shù)據(jù)模塊,用于獲取一個(gè)低位頁(yè)后,直接寫入數(shù)據(jù),即將數(shù)據(jù)寫入第一映射區(qū),然后完成寫操作;無效頁(yè)判斷模塊,用于查看第一映射區(qū)是否有無效頁(yè),如果有無效頁(yè)回收第一映射區(qū)的無效頁(yè),獲得低位頁(yè),將數(shù)據(jù)寫入后完成操作;數(shù)據(jù)搬移模塊,用于啟動(dòng)第二映射區(qū),將第一映射區(qū)的部分?jǐn)?shù)據(jù)搬移至第二映射區(qū),進(jìn)行第二映射區(qū)目標(biāo)頁(yè)判斷,直到寫入高位頁(yè)時(shí),回收第一映射區(qū)的無效頁(yè);完成寫入模塊,用于完成回收后,從第一映射區(qū)獲得一個(gè)空閑的低位頁(yè),完成數(shù)據(jù)寫入操作。
10.如權(quán)利要求8所述的固態(tài)硬盤掉電和寫異常處理系統(tǒng),其特征在于,所述垃圾回收管理模塊還包括映射區(qū)釋放模塊,用于磨損均衡管理根據(jù)第一映射區(qū)映射表中的信息,優(yōu)先回收垃圾頁(yè),再進(jìn)行空閑頁(yè)分配后,將數(shù)據(jù)寫入第一映射區(qū);如果回收后,仍然無法獲得足夠的空閑頁(yè),那么將一定數(shù)量的有效數(shù)據(jù)搬移至第二映射區(qū),從而第一映射區(qū)可獲取空閑頁(yè)后,將數(shù)據(jù)寫入第一映射區(qū);回收釋放模塊,用于當(dāng)搬移過程發(fā)生寫時(shí),當(dāng)寫入目標(biāo)頁(yè)為低位頁(yè)時(shí),不立即釋放第一映射區(qū)的有效頁(yè),一直到跟該低位頁(yè)相耦合的高位頁(yè)也被安全的寫入完成后,回收掉該低位頁(yè)對(duì)應(yīng)的第一映射區(qū)的無效頁(yè)。
11.如權(quán)利要求7所述的固態(tài)硬盤掉電和寫異常處理系統(tǒng),其特征在于,在發(fā)生掉電和寫異常情況下所述數(shù)據(jù)恢復(fù)模塊,還包括管理信息模塊,用于上電完成初始化后,首先通過掃描閃存內(nèi)的管理信息; 恢復(fù)映射表模塊,用于恢復(fù)映射表;損毀判斷模塊,用于通過判斷第二映射區(qū)內(nèi)是否有損毀的數(shù)據(jù)頁(yè); 映射表查找模塊,用于通過第一映射區(qū)映射表查找到相應(yīng)的數(shù)據(jù)頁(yè)后; 獲取空閑頁(yè)模塊,用于獲取第二映射區(qū)的空閑頁(yè);數(shù)據(jù)映射設(shè)置模塊,用于將數(shù)據(jù)寫入第二映射區(qū),并設(shè)置第一映射區(qū)的對(duì)應(yīng)頁(yè)為無效頁(yè)后結(jié)束;映射重疊判斷模塊,用于判斷是否存在第一映射區(qū)與第二映射區(qū)映射重疊; 無效頁(yè)設(shè)置模塊,用于設(shè)置第一映射區(qū)內(nèi)的對(duì)應(yīng)頁(yè)為無效頁(yè),然后結(jié)束恢復(fù)操作。
12.如權(quán)利要求7所述的固態(tài)硬盤掉電和寫異常處理系統(tǒng),其特征在于,所述緩存管理模塊中動(dòng)態(tài)調(diào)整映射區(qū),還包括查看空閑頁(yè)模塊,用于查看第二映射表的對(duì)應(yīng)空閑頁(yè)狀態(tài); 閾值判斷模塊,用于查看第二映射區(qū)的空閑頁(yè)是否大于閾值極限閾值判斷模塊,用于如果大于最大閾值,則增加第一映射區(qū)大小,如果小于最小閾值,則減小第一映射區(qū)大??;額外提供區(qū)閾值判斷模塊,用于額外提供區(qū)是否大于閾值,如果大于閾值,則增加第一映射區(qū),如果小于閾值,進(jìn)行回收垃圾頁(yè),從而完成調(diào)整映射區(qū)的大小。
全文摘要
一種固態(tài)硬盤掉電和寫異常處理方法,包括如下步驟步驟100,對(duì)閃存陣列進(jìn)行掃描,獲取存儲(chǔ)的管理信息,提取管理信息后進(jìn)行初始化,生成多個(gè)映射區(qū),動(dòng)態(tài)調(diào)整映射區(qū),管理MLC到SLC的轉(zhuǎn)換;步驟200,進(jìn)行數(shù)據(jù)讀寫,讀取時(shí),通過兩個(gè)映射區(qū),找到相應(yīng)物理地址,讀取閃存上的數(shù)據(jù);步驟300,當(dāng)寫入數(shù)據(jù)時(shí),如果發(fā)生第一映射區(qū)已經(jīng)無空閑低位頁(yè),那么啟動(dòng)垃圾頁(yè)回收管理和磨損均衡管理,磨損均衡管理根據(jù)第一映射區(qū)映射表中的信息,優(yōu)先回收垃圾頁(yè)后,再進(jìn)行空閑頁(yè)分配后,將數(shù)據(jù)寫入第一映射區(qū);步驟400,當(dāng)發(fā)生掉電或者寫異常的情況,多個(gè)映射區(qū)進(jìn)行相應(yīng)操作恢復(fù)數(shù)據(jù)。
文檔編號(hào)G06F12/16GK102591807SQ201110455620
公開日2012年7月18日 申請(qǐng)日期2011年12月30日 優(yōu)先權(quán)日2011年12月30日
發(fā)明者方浩俊 申請(qǐng)人:記憶科技(深圳)有限公司