專利名稱:非易失存儲介質(zhì)中的數(shù)據(jù)存儲的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及在易失和非易失存儲介質(zhì)的數(shù)據(jù)存儲。
背景技術(shù):
在計(jì)算系統(tǒng)非易失記憶體或非易失存儲器(NVS)對存儲需要保存一段長時(shí)間,以 及在斷電或其他系統(tǒng)故障事件后保持?jǐn)?shù)據(jù)的完整性的數(shù)據(jù)有益。非易失存儲器的例子可以 是磁盤,磁帶,光盤和快閃存儲器。這種存儲器也稱為持續(xù)性存儲器??扉W存儲器是一個(gè)將信息存儲在半導(dǎo)體存儲器存儲單元陣列的非易失存儲器的 例子。在單級單元(SLC)設(shè)備,每個(gè)單元只存儲一個(gè)比特的信息。一種最近開發(fā)的閃存類 型,被稱為多級單元(MLC)設(shè)備,通過在電荷的多級間選擇來應(yīng)用到在該單元可以每單元 存儲超過一個(gè)比特。其他類型的非易失存儲器正在開發(fā),預(yù)計(jì)可在未來投入使用。.兩種通用類型的快閃存儲電路在當(dāng)前廣泛使用NOR和NAND。目前,對于大容量 存儲系統(tǒng),NAND快閃存儲器更適合。而NOR快閃存儲器允許以單字節(jié)基礎(chǔ)執(zhí)行讀取和寫 (編程)操作,以及稱作“塊”的區(qū)域擦除,NAND快閃存儲其以塊為基礎(chǔ)組組建,類似于磁盤 驅(qū)動(dòng)器。如上述的用語扇區(qū),頁和塊可以基于層級基礎(chǔ)的類推使用。每個(gè)數(shù)據(jù)存儲區(qū)域的 大小相異,取決于論述的實(shí)際產(chǎn)品。但是,用語塊,當(dāng)用于與物理存儲有關(guān)時(shí)是指物理存儲 單元最小的可擦除的連續(xù)范圍。擦除一個(gè)塊就是把所有的位設(shè)置為“1”。寫,有時(shí)稱為編 程,是把塊中的頁或扇區(qū)已選擇的位設(shè)置成“0”從而使信息(數(shù)據(jù))寫到存儲器中。塊內(nèi) 的扇區(qū)或頁的編程操作是按順序地執(zhí)行。對于每個(gè)NAND存儲器的扇區(qū)該編程操作只能執(zhí) 行一次,再次寫入扇區(qū)之前必須擦除該存儲器的包含該扇區(qū)的整個(gè)塊。因?yàn)?,對于一個(gè)邏輯存儲地址修改存儲在非易失存儲器的數(shù)據(jù)將需要另外寫入物 理存儲位置,該步驟在快閃存儲器系統(tǒng)不能立即執(zhí)行,通常采用的方法是將邏輯存儲位置 遷移到物理存儲器以便將修改的數(shù)據(jù)寫入預(yù)先擦除的不用的扇區(qū)。該遷移出出數(shù)據(jù)的扇區(qū) 當(dāng)前包含過時(shí)的數(shù)據(jù),對用戶而言已經(jīng)不再有用。因此該扇區(qū)可視為“死區(qū)或無效”扇區(qū), 而當(dāng)前的數(shù)據(jù)視為存儲在“有效或可用”扇區(qū)??捎糜跀?shù)據(jù)寫的扇區(qū)可以稱為“空閑”扇區(qū)。 上述同樣的用語可以可用于描述頁、塊等等。元數(shù)據(jù)可以包括關(guān)于存儲在系統(tǒng)中的數(shù)據(jù)的數(shù)據(jù)。元數(shù)據(jù)可以是,例如,一個(gè)邏輯 數(shù)據(jù)元素到一個(gè)物理存儲位置的結(jié)合。該元數(shù)據(jù)還可以進(jìn)一步包括關(guān)于數(shù)據(jù)類型、數(shù)據(jù)寫入時(shí)間、糾錯(cuò)碼以及其他的信息,取決于文件管理系統(tǒng)、瘦供給系統(tǒng)、分布式RAID管理、磁 盤仿真程序或其他用戶需要的要求。當(dāng)系統(tǒng)操作中的終端,例如,由于電源故障、硬件故障或相關(guān)軟件的錯(cuò)誤,存儲在 易失存性儲器的元數(shù)據(jù)可能被損壞或丟失,在非易失存儲器(NVS)的用戶數(shù)據(jù)的位置和其 他信息,包括內(nèi)務(wù)操作或狀態(tài)信息,從中斷的時(shí)間起不再被識別。
發(fā)明內(nèi)容
披露一個(gè)在系統(tǒng)的非易失存儲器中儲存數(shù)據(jù)的記憶系統(tǒng)和方法。一方面,該方法包括在非易失存儲器中維護(hù)一個(gè)動(dòng)態(tài)表的被設(shè)置檢查點(diǎn)的副本, 并在維護(hù)關(guān)于該動(dòng)態(tài)表的事務(wù)日志。當(dāng)該動(dòng)態(tài)表不是當(dāng)前的或需要修復(fù)時(shí),該方法包括發(fā) 現(xiàn)未包含在事務(wù)日志中的到動(dòng)態(tài)表的變更,并應(yīng)用事務(wù)日志中的事務(wù)和被發(fā)現(xiàn)的變更來更 新該動(dòng)態(tài)表。也可包括發(fā)現(xiàn)事務(wù)日志中實(shí)際上并未發(fā)生的項(xiàng),如事務(wù)日志在一項(xiàng)或更多的 被寫進(jìn)日志的事務(wù)已經(jīng)開始和/或已經(jīng)完成寫入NVS之前被寫進(jìn)NVS的情況。另一方面,數(shù)據(jù)儲存系統(tǒng)可包括一個(gè)處理器,一個(gè)易失存性儲器設(shè)備(VS)和一個(gè) 非易失存儲器設(shè)備(NVS)。該處理器可配置為維護(hù)元數(shù)據(jù)的易失存儲器中的動(dòng)態(tài)表,該元數(shù) 據(jù)表示存儲在非易失存儲器的數(shù)據(jù);一個(gè)NVS中的動(dòng)態(tài)表的被遞增設(shè)置檢查點(diǎn)的版本;以 及一個(gè)表示影響元數(shù)據(jù)的事務(wù)的VS中的日志,該日志被遞增設(shè)置檢查點(diǎn)到NVS。該元數(shù)據(jù) 可以通過發(fā)現(xiàn)NVS中日志的最后一個(gè)增量檢查點(diǎn)和恢復(fù)或修復(fù)時(shí)間之間寫入該NVS的數(shù)據(jù) 進(jìn)行修復(fù)。再一方面,一個(gè)計(jì)算機(jī)程序產(chǎn)品披露,該產(chǎn)品可存儲于計(jì)算機(jī)可讀介質(zhì)以及有操 作指南用于配置一個(gè)處理器和存儲系統(tǒng)以維護(hù)元數(shù)據(jù),該元數(shù)據(jù)表示存儲于一個(gè)非易失存 儲設(shè)備(NVS)的數(shù)據(jù)。在NVS上的元數(shù)據(jù)設(shè)置檢查點(diǎn)版本和事務(wù)日志可以NVS中維護(hù),該 元數(shù)據(jù)可以通過以下方法修復(fù)配置一個(gè)處理器和存儲系統(tǒng)來維護(hù)在易失存儲器設(shè)備中的 表示存儲在非易失存儲器設(shè)備(NVS)中的元數(shù)據(jù)。維護(hù)一個(gè)NVS中一個(gè)元數(shù)據(jù)的被設(shè)置檢 點(diǎn)的版本和一個(gè)事務(wù)日志;以及修復(fù)該元數(shù)據(jù)通過應(yīng)用到元數(shù)據(jù)的事務(wù)日志的事務(wù)來更 新該元數(shù)據(jù);發(fā)現(xiàn)一個(gè)被寫到NVS的事務(wù)NVS,其中,NVS日志還未被更新到包括該事務(wù);以 及應(yīng)以該被發(fā)現(xiàn)的事務(wù)來更新元數(shù)據(jù)。
圖1所示為具有易失和非易失存儲電路的數(shù)據(jù)存儲系統(tǒng);圖2(A)所示為在非易失存儲存儲器(匪S)保持被設(shè)置檢查點(diǎn)的元數(shù)據(jù)的流程 圖;圖2(B)所示為確定何時(shí)元數(shù)據(jù)的段需要被設(shè)置檢查點(diǎn)的方法的細(xì)節(jié);圖2(C)為⑶圖所示方法的延續(xù)部分;圖3(A)所示為恢復(fù)元數(shù)據(jù)的方法的流程圖(第一部分);圖3 (B)所示為恢復(fù)元數(shù)據(jù)的方法的流程圖(第二部分);圖4是存儲在多個(gè)存儲模塊的陣列A的數(shù)據(jù)結(jié)構(gòu)的例子,該陣列A可以是存儲模 塊的邏輯或者物理排列;圖5所示為給存儲系統(tǒng)的物理模塊分配邏輯數(shù)據(jù)元素的例子,其中存儲系統(tǒng)中模塊的物理排列在具有多根的二進(jìn)制樹形網(wǎng)絡(luò)中;圖6㈧為元數(shù)據(jù)索引字的數(shù)據(jù)結(jié)構(gòu)的例子;(B)為另一模塊排列的索引字的一部 分;圖7所示為索引字用于定位存儲器陣列中的特定基本數(shù)據(jù)單位;圖8所示為存儲器的四倍數(shù)據(jù)單位(QDU)的數(shù)據(jù)結(jié)構(gòu);圖9所示為空閑區(qū)的空閑區(qū)字段;圖10所示為兩片存儲器電路的數(shù)據(jù)結(jié)構(gòu)層次;圖11所示為根塊記錄的數(shù)據(jù)結(jié)構(gòu);圖12所示為根塊記錄空閑區(qū)的數(shù)據(jù)結(jié)構(gòu);圖13所示為索引塊空閑區(qū)(IB)的數(shù)據(jù)結(jié)構(gòu);圖14所示為映射表空閑區(qū)(MTE)的數(shù)據(jù)結(jié)構(gòu);圖15所示為映射表項(xiàng)的數(shù)據(jù)結(jié)構(gòu);圖16所示為圖15的映射表項(xiàng)的位置字段的數(shù)據(jù)結(jié)構(gòu);圖17所示為空閑區(qū)映射表項(xiàng)位置字段的數(shù)據(jù)結(jié)構(gòu);圖18所示為圖15的序號字段的數(shù)據(jù)結(jié)構(gòu);圖19所示為檢查點(diǎn)塊(CPB)備用區(qū)的數(shù)據(jù)結(jié)構(gòu);圖20為映射表項(xiàng)的日志項(xiàng)的數(shù)據(jù)結(jié)構(gòu);圖21所示為檢查點(diǎn)塊寫入操作日志項(xiàng)的數(shù)據(jù)結(jié)構(gòu);圖22所示為塊擦除操作日志項(xiàng)的數(shù)據(jù)結(jié)構(gòu);圖23所示為塊賦值操作日志項(xiàng)的數(shù)據(jù)結(jié)構(gòu);圖24所示為壞損塊日志項(xiàng)的數(shù)據(jù)結(jié)構(gòu);圖25所示為擴(kuò)充日志的日志項(xiàng)的數(shù)據(jù)結(jié)構(gòu);
圖26所示為日志塊備用區(qū)的數(shù)據(jù)結(jié)構(gòu)。
具體實(shí)施例方式參照附圖可以更好的理解典型的實(shí)施例,但這些實(shí)施例并不用于作為限制性質(zhì)。 例如在附圖中相同或不同編號的元素執(zhí)行相同的功能。元素可以進(jìn)行數(shù)字編號或者通過首 字母縮寫指定,或者二者結(jié)合,表示方法的選擇僅僅是為了清楚,因此一個(gè)元素通過數(shù)字指 定,和該同一元素通過首字母縮寫或同時(shí)包括數(shù)字和文字的指示,在此基礎(chǔ)上不應(yīng)該有所 區(qū)別。可參照本申請系統(tǒng),裝置,部件,或已知的技術(shù),使一個(gè)本領(lǐng)域普通技術(shù)人員能夠 理解說明書中所舉出的例子。上述例子目的在于使本領(lǐng)域普通技術(shù)人員能夠?qū)嵺`上述于此 聲明發(fā)明構(gòu)思,該實(shí)踐通過利用系統(tǒng),裝置,部件,或者可能已知、在此披露的、或以后開發(fā) 的,或者其組合的技術(shù)。在所披露的實(shí)例和任何已知的系統(tǒng),裝置,部件或技術(shù)之間做性能 比較,上述比較僅是為了允許本領(lǐng)域普通技術(shù)人員更方便地了解現(xiàn)在的新穎的系統(tǒng),裝置, 部件或技術(shù),需要理解的是,在復(fù)雜的系統(tǒng)中,各種不同的配置和條件可能存在所作的比較 可能更好,更差,或大致相同,但并不意味著始終不變的獲得這種結(jié)果,或者該結(jié)果對可獲 得的性能構(gòu)成的限制。.需認(rèn)識到上述方法和附圖所示的裝置可在機(jī)器可執(zhí)行指令中設(shè)置或體現(xiàn),例如,軟件,或硬件,或兩者兼的組合。該指令可用于促使通過指令編程過的通用計(jì)算機(jī),微信息 處理機(jī),特殊用途處理器,如存儲控制器,DSP,或者陣列處理機(jī)執(zhí)行所描述的操作。另外,該 操作可能由特定硬件部件來執(zhí)行,該部件包括用來執(zhí)行所描述的操作硬接線邏輯或固件指 令,或者以編程的計(jì)算機(jī)組件和自定義硬件組件的任何組合,該組合可能包含模擬電路。上 述硬件組件可以包括現(xiàn)場可編程門陣列(FPGA),應(yīng)用專用集成電路(ASIC)集成電路,混合 邏輯和模擬電路,等等。該方法可以被提供,至少部分被提供,因?yàn)橐粋€(gè)計(jì)算機(jī)程序產(chǎn)品可包括可存儲或 分布到機(jī)器可讀介質(zhì)上的指令且該指令可以用于引發(fā)計(jì)算機(jī)(或其他電子設(shè)備)執(zhí)行該功 能或方法。根據(jù)本書明書的目的,用語“機(jī)器可讀介質(zhì)”應(yīng)視為任何能夠存儲通過計(jì)算機(jī)運(yùn) 作的機(jī)器或特殊用途硬件讀取或執(zhí)行的指令序列或數(shù)據(jù),并且該指令序列或數(shù)據(jù)能夠引發(fā) 該機(jī)器或特殊用途硬件來執(zhí)行任何一個(gè)在此描述的方法或功能。該術(shù)語“機(jī)器可讀介質(zhì)”應(yīng) 采取相應(yīng)的包括但不限于固態(tài)存儲器,光盤或磁盤,磁存儲器和光存儲器。例如,但不作為限制,一個(gè)機(jī)器可讀介質(zhì)包括只讀存儲器(ROM);所有類型的動(dòng)態(tài) 隨機(jī)存取存儲器(RAM)(例如,S-RAM, D-RAM, P-RAM, M-RAM);可編程只讀存儲器(PROM); 電可改寫只讀存儲器(EPROM);磁隨機(jī)存取存儲器;磁盤存儲介質(zhì);以及,所有類型的閃存 (例如,SLC,MLC,相變更存儲),其他非易失存儲器已知或后來開發(fā)類型非易失存儲器,等寸。此外,當(dāng)采取行動(dòng)和產(chǎn)生結(jié)果時(shí),涉及到各種形式(如程序,過程,運(yùn)行,應(yīng)用,單 元,運(yùn)算法則或邏輯)的軟件,在本技術(shù)領(lǐng)域是常見的。上述表達(dá)僅是一種便捷的方式來說 明通過計(jì)算機(jī)或類似裝置來運(yùn)行軟件引起計(jì)算機(jī)或類似裝置的處理器來執(zhí)行動(dòng)作或產(chǎn)生 結(jié)果,而執(zhí)行的動(dòng)作或產(chǎn)生的結(jié)果的代表式可存儲,如存于內(nèi)存位置,或用于操作外部設(shè)備 或者本地或網(wǎng)絡(luò)系統(tǒng)。當(dāng)描述一個(gè)具體的例子,這個(gè)例子可能包括特定功能,結(jié)構(gòu)或特征,但并非每個(gè)例 子都必須包括特定的功能,結(jié)構(gòu)或特征。兩個(gè)或更多的例子的功能,結(jié)構(gòu)或特性應(yīng)該或能夠 合并,除非當(dāng)此合并被明確排除,此點(diǎn)不應(yīng)被視為建議或暗示。當(dāng)一個(gè)特定的功能,結(jié)構(gòu)或 特征同例子聯(lián)系起來時(shí),本領(lǐng)域的技術(shù)人員可能會(huì)將這種功能,結(jié)構(gòu)或特征應(yīng)用到其他關(guān) 聯(lián)的例子中,無論該例子在此詳細(xì)解釋與否。元數(shù)據(jù)可能包括關(guān)于系統(tǒng)中存儲的數(shù)據(jù)的數(shù)據(jù)。元數(shù)據(jù)可能,例如,一個(gè)邏輯數(shù)據(jù) 元素到一個(gè)物理存儲位置的結(jié)合,和一個(gè)一個(gè)物理存儲位置與一個(gè)邏輯元素的結(jié)合。包括 物理存儲位置的狀態(tài)信息,該元數(shù)據(jù)還可進(jìn)一步包括關(guān)于數(shù)據(jù)類型、數(shù)據(jù)寫入時(shí)間、糾錯(cuò)碼 和其他信息等的信息,這取決于特定的系統(tǒng)要求。對元數(shù)據(jù)的更改的可直接作用到元數(shù)據(jù) 本身,也可到日志,以保持元數(shù)據(jù)與打算用該元數(shù)據(jù)來表示的被存儲的數(shù)據(jù)的一致性。元數(shù)據(jù)可與存儲在晶片,芯片,模塊,盤卷或系統(tǒng)中的數(shù)據(jù)相關(guān),并可關(guān)聯(lián)到其他 元數(shù)據(jù),或被其他元數(shù)據(jù)關(guān)聯(lián)。簡單地說,討論與晶片上數(shù)據(jù)的存儲關(guān)聯(lián)的元數(shù)據(jù),然后存 儲在一個(gè)芯片、模塊或系統(tǒng)的元數(shù)據(jù)的這些方面被介紹到需要的程度。元數(shù)據(jù)可以組織為 以“邏輯塊地址”(LBA)為索引的表,但也可存儲與物理內(nèi)存位置相關(guān)(如PBA)。通常地址 索引與磁盤上的單獨(dú)扇區(qū)或頁關(guān)聯(lián),或與快閃芯片上塊的扇區(qū)或頁關(guān)聯(lián),可以是512字節(jié)。 在其他方面,該地址索引可能與擁有多個(gè)扇區(qū)(典型的為4)的頁相關(guān)聯(lián)。在此背景下,用 語LBA可以指數(shù)據(jù)地址的最小增量,該數(shù)據(jù)地址由元數(shù)據(jù)表示,如512字節(jié),或2K字節(jié)。當(dāng)存儲數(shù)據(jù)具備的存儲在快閃存儲器中的屬性,比如存在一個(gè)快閃芯片備用區(qū)域,這些數(shù)據(jù) 的存在可作為LBA的屬性之一被包括,并可視為本地元數(shù)據(jù)。包括于元數(shù)據(jù)中的構(gòu)成“邏輯塊地址”可以是某位置的物理地址,該LBA涉及的數(shù) 據(jù)以及一個(gè)LBA序列號存儲于該位置。LBA序列號可能是特別針對各個(gè)LBA,且可在相關(guān) 存儲設(shè)備重置時(shí)被初始化,或者序列號可通過指令設(shè)定為一個(gè)值。每次更改LBA數(shù)據(jù)時(shí),該 LBA序列號(SeqLba)的值可被統(tǒng)一遞增。如果序列號與一個(gè)以上的LBA相關(guān)聯(lián),該序列號 可被設(shè)置到計(jì)數(shù)器的當(dāng)前值而非遞增值。另外,序列號可以是一個(gè)時(shí)間戳或時(shí)鐘值的一部 分,一個(gè)隨機(jī)號碼,或其他任意分配的值。當(dāng)用語LBA等,用于指從啟動(dòng)主機(jī)或用戶計(jì)算機(jī)的進(jìn)程中接收到的數(shù)據(jù),用戶可 能認(rèn)為LBA的可指存儲器中的邏輯或物理地址。存儲系統(tǒng)可以接受這個(gè)指定,考慮到任何 用戶數(shù)據(jù)位置是一個(gè)存儲器中的邏輯位置,存儲系統(tǒng)可在數(shù)據(jù)位置的用戶表示與內(nèi)存中真 實(shí)的數(shù)據(jù)位置之間形成映射。因此,用戶文件管理系統(tǒng)基本上可從存儲系統(tǒng)操作中被分離 開,且多個(gè)文件管理系統(tǒng)類型,可能是遺產(chǎn)軟件,可在主機(jī)上成功運(yùn)行。簡單地描述,從用戶的立場,此處內(nèi)存系統(tǒng)的內(nèi)存位置可被描述為存儲地址的一 個(gè)相鄰跨度,和用于管理基于MM的存儲器的相類似,且存儲地址空間可劃分為用戶存儲 空間的子區(qū)域,或者可由存儲系統(tǒng)配置將這些區(qū)域分配給不同的用戶進(jìn)程。用戶程序可以 將LBA地址范圍視作可隨機(jī)訪問的,當(dāng)在一個(gè)RAM存儲器系統(tǒng)中,可視作面向塊的裝置,或 用于任何其他的尋址方案。在使用相當(dāng)于RAID (獨(dú)立冗余磁盤陣列)的構(gòu)思,可以為在每個(gè)存儲了 RAID組數(shù) 據(jù)的條帶存儲電路中相應(yīng)的數(shù)據(jù)元素分配一個(gè)相同的序列號。為RAID條帶的每部分分配 相同的序列號允許從條帶每部分的讀取的數(shù)據(jù)是最新寫入該條帶部分的數(shù)據(jù)的驗(yàn)證,以及 驗(yàn)證一些條帶部分沒有按照正確的地址返回?cái)?shù)據(jù)而只是表示較早版本的數(shù)據(jù)。序列號不需 要是連續(xù)的,但是需要具有能夠用來驗(yàn)證該RAID條帶的所有部分屬于彼此的特性。上述無 序的“序列”號可以是共用的隨機(jī)數(shù),數(shù)據(jù)完整性字段(DIF)TI,或其他條帶部分的校驗(yàn)和
例如,組塊B的序列號是組塊A的循環(huán)冗余碼校驗(yàn)(CRC),組塊C的是組塊B的CRC......組
塊E是組塊D的,組塊A是組塊E的。條帶部分的SeqNum的序列號可以是計(jì)算所有或部分 條帶的CRC或ECC(糾錯(cuò)碼)段,等等。元數(shù)據(jù)的變更可以記錄在日志中并順序?qū)懭朐撊罩镜念^部,是與元數(shù)據(jù)維護(hù)相關(guān) 的事務(wù)的按時(shí)間順序推進(jìn)的記錄。分配給日志的存儲空間是有限的,因此當(dāng)該日志文件在 循環(huán)緩沖器維護(hù)時(shí)空閑空間可能被回收,例如,日志頭文部繞時(shí)從日志的尾部回收以避免 日志文件系統(tǒng)變滿。但是,該日志數(shù)據(jù)可以維護(hù)一個(gè)鏈表或其他數(shù)據(jù)結(jié)構(gòu)。該日志文件本 身也可以看作是元數(shù)據(jù)。一個(gè)芯片或模塊元的數(shù)據(jù)可以寫入模塊的一個(gè)或多個(gè)芯片,以使像自主實(shí)體一樣 維護(hù)該模塊。一個(gè)芯片的故障可能導(dǎo)致數(shù)據(jù)丟失,除非其具有恢復(fù)機(jī)制。用戶數(shù)據(jù)可以存 儲在一個(gè)經(jīng)過穿過一個(gè)RAID排列中的多個(gè)模塊進(jìn)行數(shù)據(jù)條帶化的系統(tǒng),并且處在在損壞 模塊的數(shù)據(jù)可以使用RAID重建到一個(gè)備用模塊。元數(shù)據(jù)存儲在一個(gè)包含該存儲的元數(shù)據(jù)的模塊和該模塊的芯片或存儲區(qū)域,發(fā)生 故障時(shí),除非提供錯(cuò)誤恢復(fù)機(jī)制,否則該存儲的元數(shù)據(jù)可能丟失。一個(gè)模塊的多個(gè)芯片的元 數(shù)據(jù)可以通過將該元數(shù)據(jù)分布在該模塊的多個(gè)芯片存儲在RAID條帶中防止丟失。由于冗余奇偶校驗(yàn)數(shù)據(jù)只在存儲在模塊的元數(shù)據(jù)塊(包括日志)發(fā)生不可恢復(fù)的錯(cuò)誤時(shí)才使用, 該RAID可以是高位。也就是說,在一個(gè)具有18個(gè)芯片的模塊中,元數(shù)據(jù)本身被存儲在17 個(gè)芯片中,奇偶校驗(yàn)數(shù)據(jù)存儲在第18個(gè)芯片中。通常不讀取奇偶校驗(yàn)數(shù)據(jù),除非有需要糾 錯(cuò)的數(shù)據(jù)。因此,需要的存儲區(qū)域和本地處理器負(fù)載只略有增加。為了將寫入存儲介質(zhì)的數(shù)據(jù)與一個(gè)日志項(xiàng)相關(guān)聯(lián),可將一個(gè)不同的序列號 (PgmSeqNum,PSN)與每個(gè)影響數(shù)據(jù)或元數(shù)據(jù)或NVS的塊狀態(tài)的事務(wù)相關(guān)聯(lián)。序列號的值可 以在介質(zhì)被初始化或重置的時(shí)候被初始化,并且可以通過統(tǒng)一每個(gè)寫入NVS的邏輯塊地址 (LBA)數(shù)據(jù)或其他數(shù)據(jù)來增加,一個(gè)塊被擦除,或其他關(guān)于NVS的記錄動(dòng)作發(fā)生。序列號的 值可以與其他描述邏輯塊地址數(shù)據(jù)的數(shù)據(jù)一起存儲,例如,在于每個(gè)扇區(qū)或頁相關(guān)聯(lián)的空 閑區(qū)域的邏輯塊地址數(shù)據(jù)??臻e區(qū)域可以是任何地址范圍,該地址范圍指定用于元數(shù)據(jù)或 其他不是在被存儲的該數(shù)據(jù)本身的其他信息的存儲。日志文件可包括每個(gè)在存儲介質(zhì)的操作,該存儲介質(zhì)變更存儲在其中的數(shù)據(jù) 或存儲數(shù)據(jù)的位置,還可包括LBA,在先的物理存儲位置,新的物理存儲位置,SeqLba, PgmSeqNum,和需要來更新LBA的元數(shù)據(jù)的其他信息。元數(shù)據(jù)和日志也可包含表示包括其頁 和扇區(qū)的塊狀態(tài)的信息。上述信息可以是,例如,塊、頁或扇區(qū)是空閑、有效、無效或壞的其 中之一。日志文件可以存在于NVS;但是,在“崩潰”發(fā)生時(shí)表示最新事務(wù)的日志文件段可 存儲在易失存性儲器(例如DRAM)。該易失存性儲器的日志文件段可能在元數(shù)據(jù)在崩潰中 丟失或毀壞前尚未被寫入NVS。如果事務(wù)數(shù)據(jù)表明已經(jīng)列入日志文件,已經(jīng)存儲在NVS事務(wù) 數(shù)據(jù)段是有意義的,除非特別提出的與此相反的情形。該討論假定沒有足夠的剩余電量,余 下一電源故障,或者其他環(huán)境,此時(shí)當(dāng)前元數(shù)據(jù)和事務(wù)日志還沒能完全的從易失存儲器存 儲到NVS中。如果所有元數(shù)據(jù)和事務(wù)日志可以在中斷操作前存儲到NVS,就可以稱為“干凈” 關(guān)閉,并且元數(shù)據(jù),至少作為隨存儲的日志中的任何事務(wù)更新的元數(shù)據(jù),是一個(gè)存儲在快閃 存儲器中的數(shù)據(jù)的當(dāng)前表示。至于與程序故障或類似事件的崩潰,可能沒有機(jī)會(huì)執(zhí)行數(shù)據(jù) 傳送,或者數(shù)據(jù)傳送可能是未完成的或毀壞的。.元數(shù)據(jù),日志文件,以及類似的信息可以存儲在NVS,例如,該NVS在循環(huán)緩存區(qū) 中。一方面,元數(shù)據(jù)和日志數(shù)據(jù)可以存儲在數(shù)據(jù)結(jié)構(gòu)中,該數(shù)據(jù)結(jié)構(gòu)是動(dòng)態(tài)分配的并在不需 要時(shí)釋放,形成一個(gè)鏈條而不是環(huán)形。表示邏輯地址塊的范圍(肯能是不完整的或不連續(xù) 的)的元數(shù)據(jù)段,可以通過在NVS元數(shù)據(jù)緩沖區(qū)的頭部進(jìn)行替換定期添加(設(shè)置檢查點(diǎn))到 在NVS存儲的數(shù)據(jù)中,盡管存儲的元數(shù)據(jù)可以代表每個(gè)在過去的某個(gè)時(shí)間的LBA地址范圍 的“快照”。分配給設(shè)置檢查點(diǎn)的NVS內(nèi)存足夠大,使整個(gè)元數(shù)據(jù)當(dāng)前集合和任何與相關(guān)的 存儲介質(zhì)的有關(guān)的事務(wù)日志可以存儲在其中。最后,緩沖區(qū)可以邏輯上環(huán)繞以及舊數(shù)據(jù)可 以重寫。一般的,只有最新的元數(shù)據(jù)集可用于從崩潰中恢復(fù);但是,舊元數(shù)據(jù)可以被維護(hù)用 于診斷目的,其中分配給元數(shù)據(jù)存儲的存儲區(qū)域元數(shù)據(jù)存儲超過分配給一個(gè)完全檢查點(diǎn)。NVS中的事務(wù)日志文件的大小至少需要足夠記錄繼存儲對每個(gè)LBA地址范圍的被 更新的元數(shù)據(jù)之后對該元數(shù)據(jù)的變更(最后的增量檢查點(diǎn)),這樣,被存儲數(shù)據(jù)的完整的元 數(shù)據(jù)集被存儲在NVS中,或可以從NVS重新獲取。元數(shù)據(jù)的更新周期和NVS中目錄文件的 長度是換位設(shè)計(jì),并可以根據(jù)讀寫操作的組合動(dòng)態(tài)地調(diào)整。為提供例子的上下文背景,用可用的快閃存儲設(shè)備表示NVS。特定的存儲設(shè)備的用處不是為了暗示其他包括正在開發(fā)的非易失存儲類型或已經(jīng)開發(fā)的具有相似功能特性的 NVS存儲設(shè)備不是同樣可用的,而是取決于對存儲系統(tǒng)特定設(shè)計(jì)的考慮。不同幾個(gè)NVS存儲 技術(shù)的結(jié)合可以用于NVS,不同幾個(gè)存儲器類型的結(jié)合也可以用于易失存儲。非易失存儲電 路和易失存儲電路為了方便可以包括其他一些存儲器類型。當(dāng)前產(chǎn)品的NVS例子是一個(gè)IG字節(jié)的快閃存儲電路為,在同一物理封裝具有兩個(gè) 512M字節(jié)晶片的三星零件編號為K9W8G08U1M的產(chǎn)品。該設(shè)備具有一個(gè)共用的8位總線(I/ 0),和大量共用的控制信號。兩個(gè)晶片具有各自功能和準(zhǔn)備/忙碌信號。為了簡單起見,當(dāng) 在例子中提到快閃存儲設(shè)備,除非討論塊或芯片中兩個(gè)晶片的操作,是指其中一個(gè)晶片。但 是,較大或較小容量的芯片和多芯片封裝的擴(kuò)展是本領(lǐng)域技術(shù)人員可以理解的。其可以理 解為用在例子里的快閃存儲芯片的特定設(shè)計(jì)是為了便于例子的理解,以及具有不同總線結(jié) 構(gòu)的不同規(guī)格的設(shè)備、數(shù)據(jù)容量等等同樣可用。存儲電路的選擇可以隨著NVS存儲工業(yè)的 發(fā)展而變更。每個(gè)晶片包括4096個(gè)塊;每個(gè)塊包括64個(gè)2K字節(jié)的頁。更確切的說,每個(gè)晶片 具有512M字節(jié)(MB)的容量,兩個(gè)晶片的封裝(可以是一個(gè)芯片)具有IG字節(jié)(GB)的容 量。每個(gè)頁也可以由4個(gè)512字節(jié)的扇區(qū)組成。每一頁還可以包含64字節(jié)的區(qū)域用于存 放本地元數(shù)據(jù),該本地?cái)?shù)據(jù)可以成為扇區(qū)的輔助數(shù)據(jù)。有包含在一個(gè)64字節(jié)區(qū)域或分配給 該頁的扇區(qū)的該整頁的元數(shù)據(jù)時(shí),頁的數(shù)據(jù)和本地元數(shù)據(jù)也可以進(jìn)行不同的排列。在一個(gè) 例子中,數(shù)據(jù)可以通過從閃存?zhèn)鬏斠徽摰挠诚竦揭粋€(gè)2KByte+64byte的易失數(shù)據(jù)寄存器 中來讀取數(shù)據(jù)。數(shù)據(jù)這樣的讀取可以作為字節(jié)數(shù)據(jù)從易失數(shù)據(jù)寄存器存取,或者整頁通過 數(shù)據(jù)總線移除。該頁的子集也可能被移除,因?yàn)樽x取指針可以從該頁中任何字節(jié)開始。當(dāng) 描述頁或扇區(qū)的讀取時(shí),本地元數(shù)據(jù)可以推測需要的元數(shù)據(jù)已經(jīng)被讀取。當(dāng)需要時(shí),在沒有 傳送扇區(qū)或頁的剩余數(shù)據(jù)時(shí)元數(shù)據(jù)就可以被存取。從非易失存儲電路讀取頁到數(shù)據(jù)寄存器耗費(fèi)大約25微秒,數(shù)據(jù)可以以20M字節(jié)/ 秒的傳輸率移除到芯片數(shù)據(jù)總線。移動(dòng)一整頁到該寄存器和總線或從該寄存器和總線移動(dòng) 一整頁需要大約100微秒。只有當(dāng)需要輔助數(shù)據(jù)時(shí),讀取時(shí)間可以降低至大約需要讀取一 頁數(shù)據(jù)到數(shù)據(jù)寄存器的25微秒。在塊可以用來存儲數(shù)據(jù)之前,必須被擦除,該擦除是一個(gè)可能耗費(fèi)大約2毫秒的 進(jìn)程。擦除是將該塊中所有位設(shè)置成“1”,隨后的寫(編程)操作時(shí)選擇性的將位清為“0”。 一旦某位是“0”,只用通過擦除整個(gè)塊才可以將其設(shè)置為“1”。確切的說,一旦一個(gè)或多個(gè) 塊的扇區(qū)被寫入,該相同的扇區(qū)不能再被寫入,直到整個(gè)塊被擦除。只有部分填滿的塊可以 繼續(xù)有數(shù)據(jù)寫入其中,按遞升次序再寫入空閑扇區(qū)或頁中。寫可以通過將數(shù)據(jù)移動(dòng)到芯片數(shù)據(jù)寄存器和然后執(zhí)行將數(shù)據(jù)寫入非易失存儲器 (NVS)的命令來進(jìn)行;不包括將數(shù)據(jù)從總線移動(dòng)到數(shù)據(jù)寄存器需要的時(shí)間,寫入過程耗費(fèi) 大約200微秒。在該頁被視為由4個(gè)扇區(qū)組成時(shí),一頁的每個(gè)數(shù)據(jù)和元數(shù)據(jù)區(qū)域在擦除的 間隔可以寫入多達(dá)4次。也就是說,該頁的每個(gè)扇區(qū)可以按照遞增順序分別寫入。這方面 可以允許該頁被看作4個(gè)512字節(jié)的扇區(qū),每個(gè)扇區(qū)可以有一個(gè)分配的ECC或其他本地元 數(shù)據(jù)??扉W塊的頁可以從低頁地址到高頁地址被順序的寫入。被存儲的數(shù)據(jù)的存儲地址可 視為由,例如,塊號、塊中連續(xù)的頁號以及扇區(qū)號表示,如果需要,被存儲的數(shù)據(jù)的存儲地址 可包括扇區(qū)內(nèi)一個(gè)字節(jié)的位置。一旦某頁被寫入,塊中較早的頁則不能再被寫入,直到在整個(gè)塊的下一次擦除之后。通常,這里的例子中,頁用來描述被讀取、寫入等的存儲位置的最小連續(xù)組。這是 為了討論的方便。如前所述,許多NVS電路在扇區(qū)等級是可寫入的,可以是多個(gè)(典型的4 個(gè))扇區(qū)在一個(gè)頁中。如前所述,一頁的扇區(qū)可以按順序?qū)懭耄喈?dāng)于一頁可以當(dāng)作四個(gè)扇 區(qū)按照遞增順序而不一定一起寫入。當(dāng)數(shù)據(jù)從頁讀取,該數(shù)據(jù)被傳送到一個(gè)易失數(shù)據(jù)寄存 器,僅有部分?jǐn)?shù)據(jù)被進(jìn)一步繼續(xù)傳輸或操作。例如,實(shí)際上一頁的僅一個(gè)扇區(qū),數(shù)據(jù)的僅一 個(gè)字節(jié),或扇區(qū)或頁的僅為空閑區(qū)域可以被放在芯片的總線上。以上討論的用語扇區(qū)、頁以及塊的使用反映了普遍被接受的快閃存儲電路的專業(yè) 術(shù)語,以及起源于采納來自旋轉(zhuǎn)盤存儲技術(shù)的幾個(gè)用語。但是,這里描述的數(shù)據(jù)結(jié)構(gòu),用語 “塊”可能具有不同的含義,在接下來的討論中會(huì)使其清楚。數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)塊具有由邏 輯數(shù)據(jù)結(jié)構(gòu)的定義所定義的大小和特性,而且可以不相當(dāng)于表示快閃存儲器中可在擦除操 作中被擦除的最小存儲數(shù)量。用語數(shù)據(jù)“段”是指固定或可變大小的數(shù)據(jù)塊,該數(shù)據(jù)塊在大 小方面不相當(dāng)于物理存儲的快閃存儲塊。用語頁和扇區(qū)也可以被其他當(dāng)指數(shù)據(jù)及其位置時(shí) 使用的專業(yè)術(shù)語代替。由例子的上下文背景這應(yīng)當(dāng)是清楚的。如圖1所示的系統(tǒng)1的例子,計(jì)算機(jī)或總線接口處理器10與易失存儲器設(shè)備20 及非易失存儲器(NVS)設(shè)備相連,該非易失存儲設(shè)備可以為閃存。該易失存儲器20可以是 例如動(dòng)態(tài)隨機(jī)存取存儲器(DRAM)、靜態(tài)隨機(jī)存取存儲器(SRAM)等設(shè)備。眾所周知,易失記 憶體,或易失存儲器本質(zhì)上需要持續(xù)的電力源應(yīng)用以維護(hù)存儲在上述存儲器中的數(shù)據(jù)的完 整性。通常該電源由可在任何系統(tǒng)結(jié)構(gòu)層級的電池支持系統(tǒng)供應(yīng);但是,該支持電源供給不 能無限期維護(hù),為了本例子的目的,系統(tǒng)主要電源丟失或其他電源中斷可視為導(dǎo)致易失存 儲器20中的數(shù)據(jù)丟失或可能的中斷。為了方便起見,該易失存儲器(VS)在此描述為RAM。 非易失存儲器(NVS)可以是具有即使在電源丟失之后也可維護(hù)數(shù)據(jù)完整性的存儲電路或 介質(zhì)的設(shè)備。上述介質(zhì)如磁盤或各種類型的閃存,是普遍使用的。為了這些例子的目的,一 種SLC NAND閃存電路被用為NVS構(gòu)建塊,但并不打算限制使用的NVS的類型。總線接口 10可以與其他如主處理器的其他計(jì)算機(jī)系統(tǒng)的組件交互,該組件可以 已與其他存儲介質(zhì)如RAM,磁盤,磁帶等相關(guān)聯(lián),而且也可以與外部通信網(wǎng)絡(luò)連接??偩€接口 10可以設(shè)置為與大的NVS存儲系統(tǒng)的總線連接,圖1中的組件可以視為該大的NVS存儲系 統(tǒng)的一個(gè)模塊。上述存儲系統(tǒng)在圖2示出。一方面,圖1中的組件可視為固態(tài)硬盤,也可以 單獨(dú)使用或作為大存儲系統(tǒng)的一部分。RAM20可以用來存儲在執(zhí)行前也存儲在RAM中的計(jì)算機(jī)程序正在運(yùn)行的數(shù)據(jù);該 RAM可以包括一個(gè)用于數(shù)據(jù)的易失存儲的區(qū)域和元數(shù)據(jù),該元數(shù)據(jù)用來表示存儲在該NVS 中的數(shù)據(jù)、程序、更多的元數(shù)據(jù),日志文件等的各方面。模塊作為大的存儲系統(tǒng)的一部分,其他易失存儲區(qū)域也可以提供用來作為另一計(jì) 算機(jī)、處理器等運(yùn)行的程序指令和數(shù)據(jù)的臨時(shí)性存儲。與存儲模塊關(guān)聯(lián)的RAM可用作NVS 設(shè)備和其他存儲介質(zhì)的中間存儲。重申,該用語模塊為了方便形象化與計(jì)算機(jī)系統(tǒng)有關(guān)的NVS存儲電路組。該模塊 可包括用于與系統(tǒng)其他部分交互的總線接口。一模塊不需要將所有組件物理上安裝在一個(gè) 單獨(dú)的電路板、基片或封裝上?;蛘撸鄠€(gè)模塊可安裝在一個(gè)單獨(dú)的電路板、基片或封裝上。正被控制的元數(shù)據(jù)可存儲在RAM也可以在NVS中,目前,在NVS中讀寫數(shù)據(jù)的存取時(shí)間比在RAM中的數(shù)據(jù)長,且NVS也可能有一些限制,如在損壞前寫入或清除的次數(shù)。可能 認(rèn)為在RAM(VS)中的元數(shù)據(jù)是易失元數(shù)據(jù),在NVS(如,快閃)中的元數(shù)據(jù)愿望地是易失元 數(shù)據(jù)的非易失的幾近通用或通用的映像。因此,當(dāng)元數(shù)據(jù)用來管理NVS上數(shù)據(jù)的存儲和檢 索時(shí),當(dāng)修復(fù)的元數(shù)據(jù)在RAM中時(shí)運(yùn)行速度可以更快。此處使用的用語數(shù)據(jù),是指任何的用 戶數(shù)據(jù),元數(shù)據(jù),文件數(shù)據(jù),程序指令,日志文件等均,除非特別予以排除。.易失存儲器(VS)中的元數(shù)據(jù)因系統(tǒng)電源丟失或其他意外事件而可能會(huì)丟失,損 壞,或其他呈現(xiàn)的不可用情況。通常此情況稱為“崩潰”。在此,用語“崩潰”用來表示導(dǎo)致 在VS中的元數(shù)據(jù)呈現(xiàn)不可用于預(yù)期目的任何事件。崩潰的原因可能是電源故障,硬件缺 陷,軟件編程錯(cuò)誤,或類似事件。該事件還可能是“異?!标P(guān)閉,以區(qū)別于以有序的方式關(guān)閉 系統(tǒng)的情況(“干凈”關(guān)閉),這種情況下,所有的數(shù)據(jù)和元數(shù)據(jù)均正確地存儲(被設(shè)置檢查 點(diǎn))到NVS中,而且存儲的元數(shù)據(jù),或存儲的元數(shù)據(jù)和存儲的事務(wù)日志的組合表示存儲的數(shù) 據(jù)的當(dāng)前狀態(tài)。本例中,易失元數(shù)據(jù)存儲在RAM中,該元數(shù)據(jù)描述存儲在NVS中的數(shù)據(jù)的各邏輯元 素的位置和屬性。邏輯數(shù)據(jù)元素存儲描述有諸如扇區(qū),頁,塊或盤卷的粒度。本例中,邏輯 元素是扇區(qū)。當(dāng)系統(tǒng)1開始運(yùn)作,系統(tǒng)1接收到的,或由該系統(tǒng)和它的相關(guān)軟件程序運(yùn)行產(chǎn) 生的數(shù)據(jù),可存儲或從NVS中檢索。當(dāng)數(shù)據(jù)寫入到NVS,該數(shù)據(jù)被組建為扇區(qū),每個(gè)扇區(qū)均 有一個(gè)邏輯塊地址(LBA)。元數(shù)據(jù)將邏輯塊地址(LBA)與NVS中扇區(qū)的物理內(nèi)存位置聯(lián)關(guān) 聯(lián),也可包括與數(shù)據(jù)相關(guān)的其他信息,如時(shí)間戳,序列號(例如,SeqLba,PgmSeqNum),數(shù)據(jù) 類型,校驗(yàn)和或其他糾錯(cuò)碼(ECC),等等。時(shí)間戳可能與系統(tǒng)計(jì)時(shí)器相關(guān)聯(lián),從而可以組織相 對的操作順序,該操作順序與預(yù)定粒度的時(shí)間箭頭相關(guān)。可拍下易失元數(shù)據(jù)快照(檢查點(diǎn)),存儲于NVS中,并用作第一基線。每次文件管 理系統(tǒng)引起數(shù)據(jù)寫入到NVS,邏輯元素和其物理位置的結(jié)合,和數(shù)據(jù)或存儲位置的任何更改 的屬性一起,得到更新并存儲于易失元數(shù)據(jù),且該事務(wù)也被存儲于易失存儲器的日志中。易失元數(shù)據(jù)周期性地,或預(yù)定次數(shù)的更新后,元數(shù)據(jù)段(如,頁)寫入NVS,從而使 在一段時(shí)間之后或幾次操作后,存儲于NVS中的元數(shù)據(jù)建立一個(gè)新的基線,因?yàn)樗性獢?shù) 據(jù)頁都已寫入NVS。元數(shù)據(jù)可被存儲于循環(huán)緩沖器,該循壞緩沖器的深度比元數(shù)據(jù)頁數(shù)更 大,從而可以有不同的有效期的一個(gè)完整的元數(shù)據(jù)集,存儲于NVS中。然而,一旦執(zhí)行操作, 修改易失存儲器中的元數(shù)據(jù)頁,以便使之區(qū)別于其在NVS中的設(shè)置檢查點(diǎn)形象時(shí),存儲數(shù) 據(jù)就過時(shí)了,并且不能代表整個(gè)內(nèi)存系統(tǒng)的當(dāng)前狀態(tài)。導(dǎo)致元數(shù)據(jù)變更的事務(wù)的日志保存 在易失存儲器中,并且,通常在元數(shù)據(jù)變更的預(yù)定運(yùn)行時(shí)間或數(shù)量之后,日志數(shù)據(jù)段逐漸從 易失存儲器中寫入NVS。這將使存儲日志可用來使存儲的元數(shù)據(jù)更新到日志最后一段存儲 進(jìn)NVS的時(shí)間。當(dāng)前易失元數(shù)據(jù)或易失日志數(shù)據(jù)可能沒被立即寫入(設(shè)置檢查點(diǎn))NVS,且崩潰的 發(fā)生可能會(huì)導(dǎo)致RAM中的元數(shù)據(jù)和日志數(shù)據(jù)受損而無法使用;NVS中的元數(shù)據(jù)形象和日志 可能不完全是通用的。數(shù)據(jù)可能隨后被寫入NVS,碎片帳集或者使用水準(zhǔn)測量內(nèi)務(wù)操作可 能導(dǎo)致數(shù)據(jù)等的重新布置,某些數(shù)據(jù)的位置記錄現(xiàn)在可能丟失。另外,數(shù)據(jù)可能因其他原因 已經(jīng)從NVS中的一個(gè)物理位置轉(zhuǎn)移到另一位置,并且該行為沒有得到持續(xù)的記錄。這些“丟 失”數(shù)據(jù)需要被找到,或“發(fā)現(xiàn)”,且元數(shù)據(jù)更新以便系統(tǒng)可以恢復(fù)元數(shù)據(jù)集的操作,該元數(shù) 據(jù)集與在崩潰時(shí)的事實(shí)上存在的數(shù)據(jù)集一致。
.元數(shù)據(jù)可能包括其他信息,如壞塊表,慣用數(shù)據(jù),如之前擦除操作的運(yùn)行次數(shù),對 于每個(gè)快閃區(qū)來說,每個(gè)快閃存儲區(qū)的占據(jù)物,等等。當(dāng)寫入存儲塊的扇區(qū)時(shí),將被寫入塊 的物理頁地址(索引)是遞增的,且每個(gè)塊“i”以占據(jù)物為特征,可以通過一個(gè)MaXNum[i] 的值來表示,MaXNum[i]的值是在塊中最高地址扇區(qū)的索引值,數(shù)據(jù)被寫于該塊中。擁有較 高頁號的扇區(qū)預(yù)計(jì)均為“1”,因?yàn)樗鼈冏鳛閴K擦除操作結(jié)果已被預(yù)先擦除,并且沒有再次被 寫入,或“編程”。MaxNum = 0可以被用來表明該塊已被預(yù)先擦除,而且數(shù)據(jù)尚未被再次寫 入該塊。MaxNum[i] = MAX_BL0CK,其中MAX_BL0CK值是塊中扇區(qū)的號,其將指示,例如,該 塊已被填滿。(本例中,該塊包含64頁,每頁有4個(gè)扇區(qū),因此,MAX_BL0CK = 255)修復(fù)崩潰的進(jìn)程可能包括掃描存儲于NVS中的被設(shè)置檢查點(diǎn)的元數(shù)據(jù),以便確定 每個(gè)元數(shù)據(jù)段的最新版本。發(fā)現(xiàn)元數(shù)據(jù)的一個(gè)元數(shù)據(jù)段(如,邏輯地址范圍)的多個(gè)映像 的地方,然后忽略兩個(gè)段中較舊的一個(gè)。為了基于NVS中檢索到的事務(wù)日志做出變更的考 慮,各個(gè)預(yù)留的最新元數(shù)據(jù)的最早的時(shí)間設(shè)定了時(shí)間界限。已存儲于NVS的事務(wù)日志中的 數(shù)據(jù),且比預(yù)留段最早時(shí)間還早,表示已經(jīng)被記錄在存儲元數(shù)據(jù)中的變更。因此,更新可能 會(huì)開始于事務(wù)日志時(shí)間與各類元數(shù)據(jù)的最早最新檢查點(diǎn)的時(shí)間相一致的地方。一方面,可能發(fā)生這樣的情況,塊已經(jīng)被擦除,而該事件還沒有被記錄在NVS的事 務(wù)日志中。如果該塊需要寫操作,在將該塊以元數(shù)據(jù)標(biāo)記為已經(jīng)在擦除和將新數(shù)據(jù)寫入該 塊前擦除操作可以已經(jīng)被寫入該VS中的事務(wù)日志。本例中,可認(rèn)為該元數(shù)據(jù)是關(guān)于芯片的。上述元數(shù)據(jù)數(shù)據(jù)的一種屬性是該元數(shù)據(jù) 可以描述寫入到快閃設(shè)備的數(shù)據(jù),以及該快閃設(shè)備本身的特征。特別地,由于快閃設(shè)備的塊 中的數(shù)據(jù)是順序地寫入,表示每個(gè)塊“i”的最高頁和扇區(qū)號為MAX的信息可以存儲為部分 元數(shù)據(jù),該塊具有有效的數(shù)據(jù)。由于閃存塊在先于第一次開始寫入該塊的時(shí)刻前的某一時(shí) 刻被擦除,可以預(yù)料的事是高于MaXNum[i] = MAX的值的扇區(qū)和頁將全部為1。作為一崩潰的部分恢復(fù),最后有效存儲的元數(shù)據(jù)集是被從NSV讀取到VS。存儲 在NVS中的事務(wù)日志數(shù)據(jù)也是被從NVS讀取到VS,至少從表示最早的最后存儲的檢查點(diǎn)的 元數(shù)據(jù)段序列號或時(shí)間,以及處理的日志,以便于將元數(shù)據(jù)更新到最后該日志被保存到NVS 的時(shí)間。如隨寫入數(shù)據(jù)的動(dòng)作,包括空數(shù)據(jù),以及隨在日志到NVS的最后保存后采用的其他 NVS管理系統(tǒng)的動(dòng)作,例如垃圾收集或損耗均衡,需要通過其他途徑發(fā)現(xiàn)??梢話呙桕P(guān)于每個(gè)塊"i"的MaXNum[i]的值的元數(shù)據(jù)。利用每個(gè)塊"i"的 MaxNum[i]的值,塊的相當(dāng)于MaXNum[i]+1的扇區(qū)被讀取,以及如果所有數(shù)據(jù)區(qū)域以及相應(yīng) 的元數(shù)據(jù)(例如校驗(yàn)和,SeqLba)的所有位是“ 1”,可以確定的是沒有額外數(shù)據(jù)寫入到該塊, 因?yàn)閴K的元數(shù)據(jù)被保存為部分滾動(dòng)檢查點(diǎn)或快照或易失事務(wù)日志到NVS中日志的保存。存儲在扇區(qū)的小于或等于MaXNum[i] = MAX的值的數(shù)據(jù)可能已被邏輯上地刪除, 或移動(dòng)到NVS的其他區(qū)域。如果該數(shù)據(jù)已經(jīng)被移動(dòng),,并且該事務(wù)還未被存儲在NVS中的日 志,該數(shù)據(jù)將通過檢查寫入在NVS中每個(gè)塊的MaXNum[i]值之上的扇區(qū)的數(shù)據(jù)的程序被發(fā) 現(xiàn)。在MaXNum[i]值之上的扇區(qū)中發(fā)現(xiàn)的數(shù)據(jù)可以具有最為部分相關(guān)聯(lián)的扇區(qū)或頁元數(shù)據(jù) 的序列號的值(PgmSeqNum),以及當(dāng)前LBA序列號(SeqLba),以及LBA的物理在先位置。為 了更新VS中的元數(shù)據(jù)的目的該數(shù)據(jù)可以寫入到易失存儲器中的恢復(fù)日志以便于恢復(fù)該元 數(shù)據(jù)?;蛘?,扇區(qū)的讀取可被限定在輔助數(shù)據(jù),或空閑數(shù)據(jù)上,如果這些數(shù)據(jù)全為“1”,那么 也可推測扇區(qū)的數(shù)據(jù)區(qū)域全為“1”。只讀取空閑數(shù)據(jù)是更快的操作。
MaxNum [i] = MAX+1扇區(qū)的檢查可以足夠確定沒有額外的數(shù)據(jù)被寫入已經(jīng)被擦除 的塊,因?yàn)閷憯?shù)據(jù)到塊的扇區(qū)逐漸的朝明確的方向進(jìn)行。一旦在存儲塊中發(fā)現(xiàn)新的數(shù)據(jù),讀 取額外的扇區(qū)直到發(fā)現(xiàn)還未被寫入的第一扇區(qū),該扇區(qū)具有增加較大的扇區(qū)號,以及相應(yīng) 的從空閑區(qū)域的描述數(shù)據(jù)(本地元數(shù)據(jù))讀取的信息,以使在恢復(fù)日志產(chǎn)生一個(gè)項(xiàng)。在該 關(guān)鍵時(shí)刻,所有已經(jīng)被寫入塊但還未被提交到在NVS中的日志的扇區(qū)被發(fā)現(xiàn),并添加到易 失存儲器的恢復(fù)日志。同樣檢查相當(dāng)于MaxNum[i] =MAX值的扇區(qū)。存在兩種典型的情形。在第一種情 形,值為MaXNum[i] = MAX的扇區(qū)的數(shù)據(jù)是在崩潰之前的時(shí)間寫入該扇區(qū)和已經(jīng)代表元數(shù) 據(jù)(至少最為隨已存儲在NVS中的日志更新的數(shù)據(jù))的數(shù)據(jù),該數(shù)還據(jù)未“丟失”并因此需 要被恢復(fù)。在第二種情形,該塊已經(jīng)被擦除,但事務(wù)未被寫入日志。也就是說,值小于或等 于MaXNum[i] = MAX的扇區(qū)中的信息已經(jīng)被移動(dòng)或刪除,并且該塊已經(jīng)被擦除。通過為該 塊寫入一個(gè)擦除事務(wù)到日志已經(jīng)證明該動(dòng)作。如果該數(shù)據(jù)被重寫到另一扇區(qū),該數(shù)據(jù)將通 過在此描述的進(jìn)程被發(fā)現(xiàn),而且該扇區(qū)位置可以與LBA相關(guān)兩。但是,新數(shù)據(jù)可在擦除操作和用新數(shù)據(jù)精確的寫入塊中的MaXNum[i] = MAX扇區(qū) 后已寫入塊。應(yīng)當(dāng)檢查MaXNum[i] = MAX扇區(qū)的靜態(tài)區(qū)域來確定如果存在有效數(shù)據(jù),那么 在先于將最后日志段提交到NVS前的時(shí)間寫入數(shù)據(jù)。如果發(fā)現(xiàn)后來寫入的數(shù)據(jù),那么在塊 的較低扇區(qū)號的所有數(shù)據(jù)也是被發(fā)現(xiàn)的新近寫入的數(shù)據(jù)。但是,如果MaXNum[i] = MAX扇 區(qū)中的數(shù)據(jù)早于日志段提交到NVS的時(shí)間,那么已經(jīng)在存儲的元數(shù)據(jù)或存儲的日志證明了 較低扇區(qū)號的所有數(shù)據(jù)。另一方面,塊可能已經(jīng)被擦除但目前為止還未寫入MaxNum[i] =MAX次,所以已在 被檢查的扇區(qū)已經(jīng)被擦除。在這種情況下,應(yīng)讀取塊的第一個(gè)扇區(qū)以查看是否所有數(shù)據(jù)都 寫入該塊。如果該日志段的事務(wù)策略是在數(shù)據(jù)本身被寫入NVS前間或的寫入NVS,那么相比 已寫入的元數(shù)據(jù)顯示已寫入更少的頁的情況不一定意味著該塊被擦除了。也可能用來根據(jù)用來寫日志的策略防止特殊情況的發(fā)生例如一塊可能不允許被 擦除直到將指示該塊被列入被擦除計(jì)劃的項(xiàng)寫入NVS,或者在新近擦除的塊不允許有寫操 作直到將指示該塊已被擦除的項(xiàng)寫入NVS。因此,塊擦除和寫入,但是元數(shù)據(jù)未反映擦除操 作的情況不會(huì)發(fā)生。通過抑制系統(tǒng)的其他性能來避免各種特殊情況。例如,新近擦除的塊可能不允許 被寫入的一段時(shí)間大于日志項(xiàng)被允許維護(hù)在VS而不被寫入NVS的時(shí)間,或該新近擦除的塊 可能不被寫入直到足夠的由于日志的擴(kuò)大包含塊擦除指示的日志項(xiàng)將被刷新到NVS寫入 發(fā)生。在相當(dāng)于日志項(xiàng)的數(shù)據(jù)被寫入NVS之前該數(shù)據(jù)可以被寫入NVS,可以用許多方法防止 不得不“撤銷”其操作實(shí)際上未開始和/或完成的日志項(xiàng)。一種方法將不再使用,例如在實(shí) 際寫入發(fā)生前,日志尾部的許多日志項(xiàng)可能已被寫入。塊“i”中的每個(gè)扇區(qū)“j”的本地元數(shù)據(jù)包括序列號(PgmSeqNumti,j] ;PSN),以使 每個(gè)扇區(qū)的寫入順序可通過多個(gè)塊確定。在芯片的每個(gè)塊的扇區(qū)中發(fā)現(xiàn)的數(shù)據(jù)表示在事務(wù) 段最后存儲的NVS和崩潰之間的某時(shí)間寫入該扇區(qū)的數(shù)據(jù)。可整理或處理在由元數(shù)據(jù)表示的多個(gè)塊中的找到的扇區(qū)中的恢復(fù)日志,利用 PgmSeqNumti, j],例如,從尾部最早的到頭部最近的。利用存儲在扇區(qū)或頁空閑數(shù)據(jù)區(qū)域 的元數(shù)據(jù)中的LBA,恢復(fù)日志提供關(guān)于當(dāng)前扇區(qū)或頁存儲為和LBA關(guān)聯(lián)的信息,和緊接的LBA的在先存儲位置。因此,當(dāng)從尾部到頭部處理該恢復(fù)日志時(shí)更新與每個(gè)扇區(qū)或頁的關(guān) 聯(lián)的LBA,該更新通過刪除LBA與在先丟失的扇區(qū)或頁的關(guān)聯(lián),以及通過使LBA與所述扇區(qū) 或頁關(guān)聯(lián),其中,該扇區(qū)或頁在恢復(fù)操作期間被發(fā)現(xiàn)。一旦所有頁是損壞或空閑,或依照一 些其他策略,該動(dòng)作也識別出“死”存儲位置,以使整個(gè)塊最后通過擦除塊來恢復(fù)。塊擦除 的恢復(fù)日志數(shù)據(jù)可以不包括序列號,但是該信息可以用來更新空閑塊表和將已擦除的塊的 MaxNum[i]設(shè)置為零。在更新完成之后,將每個(gè)LBA與有效數(shù)據(jù)物理上駐留其中的扇區(qū)、頁和塊關(guān)聯(lián)。每 個(gè)物理存儲塊中的頁的狀態(tài)也被更新以使諸如垃圾收集和損耗均衡的內(nèi)務(wù)操作能夠被執(zhí) 行。本例已經(jīng)被簡化,例如,通過忽略諸如垃圾收集、損耗均衡、壞區(qū)探測和處理等維 護(hù)或內(nèi)務(wù)操作來簡化。許多上述操作如數(shù)據(jù)到新扇區(qū)的移動(dòng),塊擦除,變更壞區(qū)表等一樣明 顯,并通過已描述的進(jìn)程設(shè)置的有效元數(shù)據(jù)的重建來證明。圖2和圖3所示為在關(guān)閉或崩潰之后為存儲在NVS的數(shù)據(jù)恢復(fù)元數(shù)據(jù)的方法的例 子。圖2A所示為維護(hù)描述閃存狀態(tài)的元數(shù)據(jù)以及存儲在該閃存中的數(shù)據(jù)的方法500。接收 到寫請求(步驟510)。該請求可是任何導(dǎo)致存儲在NVS中的信息或數(shù)據(jù)變更的操作。當(dāng)前 PgmSeqNum遞增1(步驟520)并將與該寫請求相關(guān)的事務(wù)信息輸入VS中的事務(wù)日志的頭 部(步驟530)。例如,可通過寫一頁數(shù)據(jù)到閃存的塊中的特定的頁位置執(zhí)行該事務(wù)(步驟 540)。更新VS中的元數(shù)據(jù)以反映該事務(wù)(步驟550)。該元數(shù)據(jù)在某種程度上可以包含多 個(gè)邏輯數(shù)據(jù)地址,以使每個(gè)邏輯地址映射到NVS的物理存儲地址。為了檢查指示的目的,該 元數(shù)據(jù)可以分配給多個(gè)段,為了管理在NVS中元數(shù)據(jù)的存儲,每段包含多個(gè)邏輯數(shù)據(jù)地址。 當(dāng)日志或該元數(shù)據(jù)已被更新時(shí),檢查狀態(tài)以確定已被更新的元數(shù)據(jù)段或該日志段是否應(yīng)被 寫入NVS (步驟560)。如果沒有信息需要被存入NVS,那么程序返回步驟510,并等待新的寫 請求。如果信息需要被存儲到NVS,那么將該元數(shù)據(jù)或日志寫入NVS (步驟580)并更新 到最近存儲的元數(shù)據(jù)和日志的指針。另一方面,收到如執(zhí)行命令,干凈關(guān)閉的事件(步驟 570)。這可以成為一個(gè)事件觸發(fā),并在步驟560被處理。圖2B所示為步驟560的詳情。讀取PgmSeqNum的當(dāng)前值(步驟561)再讀取當(dāng)前 的系統(tǒng)時(shí)間(步驟562)。系統(tǒng)時(shí)間可以從計(jì)算1秒計(jì)數(shù)器的循環(huán)的數(shù)字的計(jì)數(shù)器讀取,或 其他維護(hù)的關(guān)于閃存電路的時(shí)間參考。檢查事件位元(563),如果事件位被設(shè)置則該程序 退出到程序600。否則,與先前記錄的元數(shù)據(jù)或日志的值核對PgmSeqNum的值和系統(tǒng)時(shí)間 (步驟564)。這里,判斷當(dāng)前的(PgmSeqNum值或系統(tǒng)時(shí)間)與“上一”PgmSeqNum值或“上 一”系統(tǒng)時(shí)間的區(qū)別。如果該值大于限值,該限值可以是每個(gè)元數(shù)據(jù)段和日志的各自參數(shù), 那么該程序退出到主程序500同時(shí)返回是的結(jié)果,以使元數(shù)據(jù)段或日志適當(dāng)?shù)乇粚懭隢VS。 “上一” PgmSeqNum值和系統(tǒng)時(shí)間,代表最后一次特定的元數(shù)據(jù)段或日志已被寫入(被設(shè)置 檢查點(diǎn))到NVS。日志被從“上一” PgmSeqNum保存到現(xiàn)在。更新“上一” PgmSeqNum和“上 一”時(shí)間到當(dāng)前的值。如果步驟564的結(jié)果是否,那么程序退出到主程序并返回否的結(jié)果。在作為事件位元被設(shè)置的結(jié)果流程560退出到流程600的情況下,執(zhí)行流程600 的步驟,如果圖2C所示。VS中現(xiàn)有的元數(shù)據(jù)段均被作為該元數(shù)據(jù)當(dāng)前的檢查點(diǎn)寫入NVS (步 驟610),并且更新VS中的日志以反映上述事務(wù)。然后,該部分在VS中還被寫入到NVS的日志被設(shè)置檢查點(diǎn)(寫)到NVS (步驟620),并報(bào)告“干凈”關(guān)閉完成。當(dāng)使用這種方式執(zhí)行 關(guān)閉,在啟動(dòng)是處理存儲的日志以使將元數(shù)據(jù)更新到關(guān)閉的時(shí)間?;蛘?,存儲的數(shù)據(jù)和易失數(shù)據(jù)可以用來在關(guān)閉前更新元數(shù)據(jù),以將重啟時(shí)間減少 至最低。因此,可以意識到上述步驟可以用不同順序執(zhí)行,并且有些步驟可以省略或增加, 取決于設(shè)計(jì)的其他方面,提供此特定的例子視為便于全部內(nèi)容的理解。當(dāng)關(guān)閉是“異?!标P(guān)閉時(shí),存儲在NVS的元數(shù)據(jù)和日志可能不表示其他存儲在NVS 的信息的當(dāng)前狀態(tài),并且該元數(shù)據(jù)在使用前需要更新。接收恢復(fù)請求(步驟710)以開始恢復(fù)流程,如圖3A所示。從NVS讀取被設(shè)置 為檢查點(diǎn)的數(shù)據(jù)段到VS(步驟720)。在以與被設(shè)置檢查點(diǎn)的元數(shù)據(jù)關(guān)聯(lián)的最早的“最 近"PgmSeqNum開始到最晚的日志信息期間,日志數(shù)據(jù)被從NVS讀取到VS,并被移動(dòng)到VS (步 驟730)。被設(shè)置的檢查點(diǎn)這里是指該最后的已經(jīng)存儲到NVS的元數(shù)據(jù)的完整段集,雖然其 在一段時(shí)間可能被逐段地存取??梢詮淖钤绲捻?xiàng)到最晚的項(xiàng)處理現(xiàn)在VS中的日志(步驟 740)以便輸入所有事務(wù)到元數(shù)據(jù)中(步驟750)。在這個(gè)時(shí)候,更新VS中的元數(shù)據(jù)到日志 最后被設(shè)置檢查點(diǎn)到NVS的時(shí)刻。一方面,單獨(dú)的事務(wù)可能不按照嚴(yán)格的時(shí)間順序方式被寫入日志,提供與執(zhí)行上 述事務(wù)的實(shí)際時(shí)間關(guān)聯(lián)的PgmSeqNum是正確的。當(dāng)在發(fā)現(xiàn)丟失的數(shù)據(jù)前利用存儲在NVS 的日志來更新存儲的元數(shù)據(jù),存儲在NVS中的日志的最近PgmSeqNum可視為最近的有效的
PgmSeqNum,并且與.......在一定程度上,與更高PgmSeqNum關(guān)聯(lián)的數(shù)據(jù)被視為丟失,并被
探索程序發(fā)現(xiàn)。在用于更新存儲的元數(shù)據(jù)前通過PgmSeqNum整理存儲的數(shù)據(jù)。該方法的下面步驟是為了查找或“發(fā)現(xiàn)”任何在最近日志的檢查點(diǎn)和崩潰之間被 寫入或擦除的閃存的扇區(qū)、頁或塊。需同進(jìn)程將移動(dòng)所有“有效”頁并在塊擦除之前將其寫 入另一個(gè)塊的空閑頁。因此,在已擦除的塊的“有效”頁假定為已被移動(dòng),并將被恢復(fù),即使 該移動(dòng)還未被記錄在NVS的元數(shù)據(jù)和日志。在可以是流程800的恢復(fù)操作期間,已被存儲 在NVS中的元數(shù)據(jù),該元數(shù)據(jù)可能不是最新的,已經(jīng)通過流程700被更新,以及對于每個(gè)塊 都具有一個(gè)可變的“最大頁”,該最大頁的值指向其中有效頁被認(rèn)為是被存儲的閃存塊中的 最高的頁號。因?yàn)殚W存的物理塊中的頁按順序上升的順序被寫入,所有在一個(gè)塊中的最大 頁之上的塊都被推定仍然處于全為“1”的擦除狀態(tài)。該狀態(tài)包括頁的本地元數(shù)據(jù)。因此任 何在一個(gè)塊中的最大頁之上其具有寫入數(shù)據(jù)的頁,必須在上次元數(shù)據(jù)被設(shè)置檢點(diǎn)后被寫入 (如通過存儲的日志更新,如流程700所示),并且因此該頁被認(rèn)為是“發(fā)現(xiàn)”的數(shù)據(jù)。該發(fā)現(xiàn) 的頁的元數(shù)據(jù)被寫入恢復(fù)日志。除非對于角落案例,其中一些是本文所描述的,該MaxPage 頁預(yù)計(jì)包含與其相關(guān)的數(shù)據(jù)和元數(shù)據(jù),同樣對于所有小于MaxPage的頁也將是正確的,除 非所有低于MaxPage的頁通過將其內(nèi)容寫入其他塊預(yù)先被移動(dòng)以及該閃存塊被擦除。在流程800中驗(yàn)證快閃塊的實(shí)際內(nèi)容。為該設(shè)備中每個(gè)快閃塊讀取從流程700更 新后的元數(shù)據(jù)(步驟810)。特別是,為每個(gè)快閃塊讀取該MaxPage的值,MAX。至少讀取 MaxPage = MAX頁的其中一個(gè)數(shù)據(jù)或元數(shù)據(jù)(步驟820)。如果該數(shù)據(jù)全部為“ 1”,那么該頁 已經(jīng)被擦除。有種可能性,該可能是將要被發(fā)現(xiàn)的新數(shù)據(jù)已被寫入低于MAX值的頁中。如 上所述,步驟830的一個(gè)為是的判斷導(dǎo)致分叉到步驟840,該步驟中將頁號設(shè)置為0,因?yàn)槿?何寫入到快閃塊的新數(shù)據(jù)都將從最低塊號開始,并以向上的方向繼續(xù)頁的增量。因此,讀取 “0”頁,評估讀取的信息判斷來判斷新數(shù)據(jù)是否被寫入快閃塊。如果結(jié)果是所有的數(shù)據(jù)位為“1”,那么是已擦除狀態(tài),因此可以斷定在此快閃塊內(nèi)沒有發(fā)現(xiàn)新的頁,在步驟860中,隨著 是的結(jié)果,對于特定快閃塊,流程800結(jié)束。如果在“0”頁發(fā)現(xiàn)數(shù)據(jù),那么該頁的本地元數(shù)據(jù)將被報(bào)告為已經(jīng)被發(fā)現(xiàn),并且該頁 的本地元數(shù)據(jù)被存儲在恢復(fù)日志中(870)。頁號遞增1(880),并從下一個(gè)最高頁讀取的數(shù) 據(jù)。再次執(zhí)行步驟860,根據(jù)結(jié)果,當(dāng)在正發(fā)現(xiàn)新數(shù)據(jù)時(shí)繼續(xù)逐步掃描閃存塊中更高的頁,或 者直到還未被寫(編程)的頁被發(fā)現(xiàn),在這一點(diǎn),所有在快閃塊中將被發(fā)現(xiàn)的新數(shù)據(jù)已經(jīng)被 占用。但是,如果步驟830的結(jié)果是否,那么低于MAX的所有頁已經(jīng)在之前被寫入,并且 在元數(shù)據(jù)的事務(wù)已經(jīng)被占用,如通過流程700更新。增加頁號(步驟850)以評估下一個(gè)在 Max之上的最高頁(步驟860)。對于該閃存塊的流程800,退出。當(dāng)數(shù)據(jù)不是全為"1〃, 那么新數(shù)據(jù)已經(jīng)被寫入該存儲塊,因?yàn)橐呀?jīng)更新的元數(shù)據(jù)有效,因此發(fā)現(xiàn)新數(shù)據(jù)。報(bào)告該發(fā) 現(xiàn)并記錄在恢復(fù)日志(步驟870),并頁號再次遞增(步驟880)來確定是否任何另外的頁被 寫入閃存塊,直到已經(jīng)掃描所有的存儲塊的頁時(shí),或步驟860確定該塊還未被編程。屆時(shí)快 閃塊的掃描已經(jīng)完成。為每個(gè)快閃塊執(zhí)行流程800。塊中所有在具已發(fā)現(xiàn)數(shù)據(jù)的最高頁上 都是空閑頁,因?yàn)槠溥€未被編程。許多快閃塊只需要范圍掃描,只有范圍掃描指示有數(shù)據(jù)在塊中被發(fā)現(xiàn)快閃塊中的 單獨(dú)的頁才需要被掃描。也就是說,該方法執(zhí)行存儲塊的掃描以確定在已更新的被設(shè)置檢 查點(diǎn)的元數(shù)據(jù)有效后是否可能已執(zhí)行寫或擦除操作,并且只需要在已更新的元數(shù)據(jù)掃描有 效后,掃描需要將變更恢復(fù)到元數(shù)據(jù)的塊中的頁。在MaxPage = MAX_BL0CK的情況下,如果 塊還沒有變更,那么塊中最大頁號是唯一需要被評估的。參考某一特定順序執(zhí)行的步驟描述此方法,但是,正如本文所述的其他例子,可以 理解的是在等同的方法該步驟,功能,或行動(dòng)可以被合并,細(xì)分,或重新排序。因此,除非特 別說明外,這樣的順序和步驟,功能,或分組行動(dòng),并不打算最為限制的解釋。分離的芯片,可合并為一個(gè)模較大的存儲陣列或系統(tǒng),并可以安裝在電路板上以 形成一個(gè)模塊。同樣,多個(gè)模塊,可安裝在一個(gè)母板,基板等,從而形成一個(gè)更大規(guī)模的存儲 系統(tǒng)。可進(jìn)一步通過一個(gè)或多個(gè)冗余技術(shù)加強(qiáng)存儲系統(tǒng)中數(shù)據(jù)的完整性,如錯(cuò)誤或RAID。雖然已經(jīng)描述在多個(gè)塊被視為存儲系統(tǒng)的系統(tǒng)層級中元數(shù)據(jù)恢復(fù)到當(dāng)前狀態(tài),該 方法也可以用應(yīng)到更高等級的系統(tǒng),其中較低層級的元數(shù)據(jù)可以視為數(shù)據(jù),損壞模塊的問 題可視為等效于無效模塊。這個(gè)例子中的數(shù)據(jù)處理表明由計(jì)算機(jī)執(zhí)行,該計(jì)算機(jī)可為存儲控制器或位于電路 板的存儲管理電路,該電路板為包含存儲器的基板或模塊,或者該計(jì)算機(jī)通過總線連接所 述的模塊,使數(shù)據(jù)可以在另外一個(gè)更大的系統(tǒng)組件進(jìn)行處理。用于與該系統(tǒng)其他方面的交 互的總線可以是任何各種總線結(jié)構(gòu),行業(yè)規(guī)范,或任何目前已知的或在開發(fā)的專有格式,該 總線可以與存乎系統(tǒng)被設(shè)計(jì)為與之連接的產(chǎn)品兼容。這些總線可以,可以仿真旋轉(zhuǎn)磁盤存 儲系統(tǒng)的接口特性,也可以在其上擴(kuò)展或改進(jìn),如類似位于所述總線模塊的操作擴(kuò)展支持 RAID。這些總線可為榜樣,學(xué)習(xí)旋轉(zhuǎn)磁盤存儲系統(tǒng),或擴(kuò)展或改進(jìn),如就此擴(kuò)展,接口特性, 以支持像位于總線模塊操作的RAID說,這些擴(kuò)展可能包括額外的信息同步使用RAID組之 間的數(shù)據(jù),或例如,時(shí)間同步操作的模塊,上述擴(kuò)展可包括用來通過不RAID組的數(shù)據(jù)的額 外信息,或者例如同步模塊操作的時(shí)間。
—方面,如果可以整個(gè)或部分遵照寫入新數(shù)據(jù)的選擇策略,可以從系統(tǒng)的狀態(tài)搜 索到少量的塊,而不是找到所有塊來尋找還未寫入日志的到NVS的寫操作。例如,如果策略是寫入到有非常空閑空間的塊以及在處理日志之后有3個(gè)具有N 個(gè)空閑頁和5個(gè)具有N-I個(gè)空閑頁的塊,那么只需要檢查具有N個(gè)空閑頁的塊。如果有寫 入到所有這三個(gè)塊的頁,那么現(xiàn)在該三個(gè)塊將只有N-I個(gè)空閑頁,因此現(xiàn)在需要檢查8個(gè)具 有N-I個(gè)空閑頁的塊。如果只在7個(gè)塊中找到新的頁,將不需要檢查有N-2個(gè)空閑頁的塊, 因?yàn)樵谑O碌木哂蠳-I個(gè)空閑頁的塊前不會(huì)寫入到該N-2個(gè)空閑頁的塊。為了尋找任何可能被擦除但沒有被日志記錄的塊,在策略是當(dāng)塊仍然有有效數(shù)據(jù) 時(shí)該塊不為擦除操作標(biāo)記時(shí),只查找這些沒有有效數(shù)據(jù)的塊也是足夠的?!矫?,數(shù)據(jù)是條帶狀分布在多個(gè)存儲模塊,或分布在多個(gè)存儲電路或模塊的芯 片,以實(shí)現(xiàn)一個(gè)RAID的冗余配置,或者是不同版本RAID的配置的層次。上述配置與第一個(gè) 例子的接口兼容,正如在第二個(gè)字中的說明的。在另一個(gè)例子,存儲系統(tǒng)可以組建為由一個(gè)總線系統(tǒng)連接的模塊陣列。一個(gè)總線 連接的存儲模塊陣列已經(jīng)在專利號為US 11/405,083,名為互聯(lián)系統(tǒng),與2006年4月17日 申請的專利中描述,該專利是自身擁有和被引用合并與此以供參考??偩€連接陣列的模塊 可以包含本文第一個(gè)例子的易失存儲器20和非易失存儲器30,并可以包含一個(gè)總線接口 或邏輯存儲控制器10。如上所述,可以分別的為每個(gè)存儲模塊執(zhí)行從崩潰恢復(fù)。總線連接 存儲系統(tǒng)通過RAID技術(shù)的使用可以具有防止數(shù)據(jù)丟失額外的保護(hù),如US 12/079,737專利 中的描述,存儲管理系統(tǒng)和方法,申請與2008年3月26,該專利是自身擁有和被引用合并與 此以供參考。圖4所示為存儲在不同存儲模塊的數(shù)據(jù)的邏輯結(jié)構(gòu),以便于理解有4個(gè)數(shù)據(jù)模塊 和一個(gè)奇偶校驗(yàn)?zāi)K的RAID5結(jié)構(gòu)。每個(gè)LBA可以分成一個(gè)有四個(gè)較小的LBA范圍的組 (例如,扇區(qū))并可以存儲在不同的存儲模塊。每個(gè)LBA范圍組可以第五個(gè)存儲模塊上計(jì)算 和存儲。上述的數(shù)據(jù)存儲的結(jié)構(gòu)在存儲模塊為壞或其他執(zhí)行數(shù)據(jù)讀取時(shí)不可用的情況時(shí)允 許數(shù)據(jù)恢復(fù)。如序列號為US12/079,364的申請中的描述,可以運(yùn)行圖4中的存儲系統(tǒng)以只 使用5個(gè)模塊中4個(gè)返回有效數(shù)據(jù)。因此,在例如損壞模塊的更換后RAID數(shù)據(jù)結(jié)構(gòu)被重建 時(shí),系統(tǒng)可以繼續(xù)運(yùn)行。.一方面,數(shù)據(jù)A存儲為數(shù)據(jù)A1、A2、A3和A4四個(gè)順序區(qū)域到不同的存儲模塊,該 奇偶校驗(yàn)碼Ap存儲在第五個(gè)存儲模塊。在每個(gè)存儲模塊,與數(shù)據(jù)的順序區(qū)域關(guān)聯(lián)的LBA可 以是相同的,并且作為每個(gè)模塊中的LBA的SeqLba值,可以在重置或初始化時(shí)預(yù)先被初始 化為零,從該時(shí)刻在特定數(shù)據(jù)區(qū)域A的條帶中的所有模塊將接受到相同的數(shù)據(jù)分塊(可以 是扇區(qū))的數(shù)字。因此,從存儲模塊讀取關(guān)于A的數(shù)據(jù)并重組,因此每個(gè)數(shù)據(jù)子集Al、A2、 A3、A4和Ap可視為具有相同的SeqLba值。.在模塊或其一部分損壞時(shí),RAID可用來恢復(fù)。因?yàn)槿绻殉霈F(xiàn)如前所述的崩潰, 關(guān)于每個(gè)獨(dú)立模塊的本地元數(shù)據(jù)將會(huì)被回復(fù),所以已恢復(fù)的LBA本地元數(shù)據(jù)包含正確的序 列號SeqLba。該5個(gè)模塊剩余的4個(gè)的數(shù)據(jù)可以用來恢復(fù)損壞模塊的數(shù)據(jù),通過從4個(gè)有 效模塊讀取數(shù)據(jù)并計(jì)算概述的X0R。由此產(chǎn)生的數(shù)據(jù)是從剩余模塊丟失的數(shù)據(jù)。因此,在 替換損壞模塊之后,數(shù)據(jù)可以完全的恢復(fù)和重新存儲。一方面,數(shù)據(jù)可繼續(xù)在損壞模塊的數(shù) 據(jù)重建期間被讀取到空閑模塊,或在硬件修復(fù)期間被讀取到備用模塊,該修復(fù)可以是替換損壞模塊和在熱插拔基礎(chǔ)上執(zhí)行。關(guān)于數(shù)據(jù)的PgmSeqNum或其他索引出現(xiàn)在與存儲的Al、 A2、A3、A4和Ap (其中一個(gè)由于模塊故障丟失)相關(guān)的關(guān)于每個(gè)模塊的每個(gè)數(shù)據(jù)集中,因 此也可以獲知關(guān)于已修復(fù)的數(shù)據(jù)SeqLba。在其存儲到NVS時(shí),可初始化關(guān)于已修復(fù)的數(shù)據(jù) PgmSeqNum 集。當(dāng)使用RAID重建損壞存儲模塊的內(nèi)容時(shí),重建的數(shù)據(jù)可以存儲在更換或備用的 模塊,模塊上的與數(shù)據(jù)存儲關(guān)聯(lián)的元數(shù)據(jù)可以同時(shí)地創(chuàng)建。.存儲系統(tǒng)內(nèi)的存儲模塊的位置可在物理上與圖4所示的邏輯排列不同。但是圖 4的排列也表示物理存儲系統(tǒng),其中多個(gè)存儲模塊被組建在一個(gè)線狀總線并與一個(gè)或多個(gè) 存儲控制器相連。另一個(gè)例子中,圖5所示為樹形存儲系統(tǒng),其中顯示了與同圖4的邏輯排列一致的 一個(gè)RAID5排列的條帶關(guān)聯(lián)的存儲模塊。對應(yīng)的物理模塊是01,02,03,04和0 。數(shù)據(jù)子 陣列Al,A2,A3,A4和Ap到物理模塊Dl, D2,D3,D4和Dp的分配可通過計(jì)算算法,查找表, 或其他適當(dāng)?shù)募夹g(shù)。在另一個(gè)例子中,描述了與執(zhí)行數(shù)據(jù)恢復(fù)操作兼容的數(shù)據(jù)結(jié)構(gòu)的詳細(xì)設(shè)計(jì)。一方 面,該例子是針對用邏輯塊尋址格式的數(shù)據(jù)存儲。其他可以使用的數(shù)據(jù)存儲格式包括文件 系統(tǒng)存儲,對象數(shù)據(jù)存儲,NV計(jì)算機(jī)主存儲;一些類型的存儲格式可以分層放在基于存儲 系統(tǒng)的塊頂部,而其他還有一些應(yīng)當(dāng)結(jié)合在一個(gè)整體的數(shù)據(jù)管理結(jié)構(gòu)中當(dāng)前的應(yīng)用程序。該詳細(xì)設(shè)計(jì)屬于多種可能的設(shè)計(jì)之一,它包括被提供用來將數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)置入一 個(gè)存儲系統(tǒng)內(nèi)容中的細(xì)節(jié)。因此,并非所有在此描述的功能和操作可能在熱和特別設(shè)計(jì)中 被需要,并且根據(jù)開發(fā)者的需求功能可以增加或刪除。此外,雖然此描述在某種程度上來說 比其他例子更詳細(xì),本領(lǐng)域的技術(shù)人員將認(rèn)識到仍存在多種多樣的內(nèi)務(wù)管理及其他操作, 而這些操作沒有被詳細(xì)描述。再者,數(shù)據(jù)結(jié)構(gòu)的某些部分沒有被描述或被展示了但沒有被 詳細(xì)描述。這些部分可能提供為了進(jìn)一步發(fā)展或執(zhí)行功能的預(yù)留空間,它們不是此應(yīng)用的 主題或在此其他地方被描述。例子中的任何功能缺位是不被視為排除在特定的設(shè)計(jì)中,根 據(jù)其他因素,如經(jīng)濟(jì),具體表現(xiàn)特征的最優(yōu)化等,加入其他。雖然可以通過RAID、ECC(糾錯(cuò)碼)等技術(shù)避免因模塊層或系統(tǒng)中更高層硬件故障 引起的丟失,在本例中,卻未描述與其相關(guān)的操作,這些操作可視為歸入被命令執(zhí)行的讀取 和寫操作中。為本例的目的,一模塊的硬件可包括圖1所示的功能區(qū)域,其中該非易失存儲器 (NVS) 30是一個(gè)可以為多芯片設(shè)備的閃存,該易失存儲器(VS)20是DRAM,以及計(jì)算機(jī)10是 一位處理器、現(xiàn)場可編程門陣列(FPGA)、狀態(tài)機(jī)等,該處理器本身也可包含邏輯存儲器;包 括用于程序數(shù)據(jù)的邏輯存儲,該邏輯存儲器可包括易失(VS)和非易失存儲器(NVS)。可選 的,該程序數(shù)據(jù)可以從其他存儲器或計(jì)算機(jī)可讀存儲設(shè)備下載。計(jì)算機(jī)10也可包括用于與 外部總線連接的線路,或者具有連接到系統(tǒng)剩余的結(jié)構(gòu)。該硬件可以安置在一個(gè)單獨(dú)的電 路板或基板,或其他諸多相同的載體。本例中,且不通過任何方式限制,一模塊可包括8到16個(gè)閃存電路,每個(gè)閃存電路 (封裝)包括8個(gè)閃存芯片。一個(gè)閃存電路(NVS)可具有IGB的容量,因此,8個(gè)閃存電路將 具有8GB的容量,16個(gè)閃存電路將具有128GB的容量。閃存芯片可特征化為具有典型200 毫秒和最大700毫秒編程時(shí)間(寫入時(shí)間),大約100毫秒的頁讀取時(shí)間,和典型1. 5微妙最大2微妙的擦除時(shí)間。對于總模塊容量為160MB/S,該電路被組建為通過具有20MB/S的 容量本地總線與計(jì)算機(jī)10交互。易失存儲器(VS)可以為組建為寬為8位和有125MHz時(shí) 鐘頻率的RAM。該RAM存儲器的存儲容量可以約為該閃存的存儲容量的百分之二(0.5到 2GB),并具有糾錯(cuò)碼(ECC)的額外區(qū)域。本例中的設(shè)計(jì)與在US 12/079,737所披露的RAID架構(gòu)一致,以使閃存中的擦除操 作有很少或沒有讀取延遲的影響,并且在高達(dá)很大一部寫入帶寬傳輸率的寫操作有很少或 沒有讀取延遲的影響。這僅僅是一個(gè)強(qiáng)加約束的設(shè)計(jì)例子。該數(shù)據(jù)結(jié)構(gòu)和方法是為了在崩 潰事件中方便對關(guān)于非易失存儲器的元數(shù)據(jù)的恢復(fù)。為了本例的目的,下面用語用來方便描述存儲器地址基本數(shù)據(jù)單位(BDU),該基本數(shù)據(jù)單元可以是2*512字節(jié)的扇區(qū),加上一個(gè)備用數(shù) 據(jù)區(qū)域;該“備用區(qū)域”是指視為單獨(dú)整體的BDU的兩個(gè)扇區(qū)的空閑區(qū)域;四倍數(shù)據(jù)單位(QDU),該四倍數(shù)據(jù)單位可以是4*BDU或4K字節(jié);八倍數(shù)據(jù)單位(ODU),該八倍數(shù)據(jù)單位可以是相鄰存儲位置的2*QUU ;—個(gè)塊,是 多個(gè)ODU ;并且2block,該2block是由處理塊“ i,,和塊“ i+Ι,,作為一個(gè)單獨(dú)塊形成的處理 器中地址;2block可以編址為2Block[i/2],其中“i”是偶數(shù)。塊可描述為包含一種類型信息,而且通過允許以塊到塊為基礎(chǔ)而不是頁到頁來追 蹤一些結(jié)構(gòu),其常被用來簡化執(zhí)行或使特定的操作更有效,或者減少需要的記錄保管。但 是,這并不是為了限制。例如,映射表(MT)和塊表(BT)的檢查點(diǎn)可以分別存儲,也可以存 儲在包含兩種類型數(shù)據(jù)的檢查點(diǎn)塊(CPB)。日志塊(LB)和數(shù)據(jù)塊可以分別存儲,但是日志 應(yīng)當(dāng)存儲在數(shù)據(jù)塊,或者在檢查點(diǎn)塊。根塊(RB)和索引塊(IB)應(yīng)當(dāng)合并,根塊(RB)可以 存儲在任意位置,并且通過用特殊標(biāo)記搜索同索引塊相似。根塊和索引塊可以被整消除, 通過某些標(biāo)識符標(biāo)記搜索發(fā)現(xiàn)檢查點(diǎn)的位置和日志片段。所以當(dāng)形容一個(gè)字段或函數(shù)在一 個(gè)特定類型的“塊”時(shí),該形容可以被理解為一個(gè)特定類型的“頁”或甚至是特定類型的“扇 區(qū)”,取決于該間插的不同數(shù)據(jù)類型細(xì)微程度。這個(gè)例子的基本的可尋址存儲器單位的數(shù)據(jù)結(jié)構(gòu)是BDU,以及當(dāng)對應(yīng)的BUD被編 址時(shí)該BDU備用區(qū)域可被視為已被編址。BDU中的數(shù)據(jù)未必可以如此編址,但可以從被引用 的BDU處獲取。圖6所示為典型索引字中的位段,該為段具有28位的長度。為了本討論的目的,可認(rèn)為是三星零件編號為在K9KAAG08U0M和K9NCG0剛5M(三 星,首爾,韓國)之間的產(chǎn)品,每個(gè)部分具有每片選線2GB容量。在一個(gè)2Block中,一個(gè)扇 區(qū)的物理存儲地址指定位0-2為BDUJi 3-8為0DU,位9_20為2Block中的位置,以及位 21-23為總線選擇。位24-28可分配給基于是使用的存儲電路的具體設(shè)置的功能。使用8 個(gè)封裝時(shí),則位24或位24-25被用來提供片選。當(dāng)使用16封裝時(shí),則么位24可以選擇總 線的兩個(gè)封裝,位25-26提供片選則,如圖6B所示。圖7所示為利用索引字識別芯片上特定BDU的存儲位置。該索引字的位模式定位 該 BDU 為 2Block 2049 的 ODU 62 的 QDU 1 中的 BDU 2。有可能在一個(gè)系統(tǒng)或模塊的基礎(chǔ)上有幾個(gè)全局變量。該系統(tǒng)可以具有一個(gè)1微妙 粒度和1秒循環(huán)的計(jì)數(shù)器。其可以用于,例如,同步RAID列的擦除和寫操作。一個(gè)模塊程 序的序列號(PSN or PgmSeqNum)有40位長度頁可被使用,用來計(jì)算實(shí)際執(zhí)行的操作。該 PSN可能每幾周循環(huán)一次,缺角與時(shí)鐘周期。需要一個(gè)后臺刷新操作以維護(hù)存儲的PSN在PSN最新值的2~38內(nèi)。每頁(QDU)可以含有一個(gè)存儲輔助數(shù)據(jù)的備用區(qū)域,如圖8所示。QDU的數(shù)據(jù)區(qū)域 大小標(biāo)定在4096字節(jié),備用區(qū)域在16字節(jié)每扇區(qū)。因?yàn)锽DU是兩個(gè)扇區(qū)的串聯(lián),分配給一 個(gè)BDU的備用區(qū)域是32字節(jié)。這些備用數(shù)據(jù)區(qū)域中一個(gè),對應(yīng)扇區(qū)K和L,作為其他備用數(shù) 據(jù)區(qū)域的代表被詳細(xì)的呈現(xiàn)。一個(gè)16字節(jié)的區(qū)域提供給ECC來保護(hù)數(shù)據(jù)區(qū)域和備用區(qū)域 的完整性;例如,該ECC可以分為兩部分一個(gè)用于數(shù)據(jù)區(qū)域,一個(gè)用于備用區(qū)域,以使在不 需要讀取數(shù)據(jù)的情況下允許讀取和驗(yàn)證該備用區(qū)域。出ECC之外,或替代ECC,可用不同的 覆蓋范圍包括其他數(shù)據(jù)保護(hù)算法例如RCR ;例如,該16字節(jié)可以分成覆蓋數(shù)據(jù)區(qū)域和備用 區(qū)域的ECC的12字節(jié)和覆蓋備用區(qū)域的CRC的4字節(jié),以使如果該備用區(qū)域CRC驗(yàn)證備用 區(qū)域的數(shù)據(jù),在不需要為了備用區(qū)域的ECC檢查讀取整個(gè)數(shù)據(jù)和備用區(qū)域的情況下使用該 備用區(qū)域數(shù)據(jù)。塊類型字段存儲一個(gè)表示存儲塊上的信息類型的指示。是個(gè)16進(jìn)制的數(shù)字,分配 如下OxFF = Root Block(RB)OxFl = Index Block(IB)0xF2 = Block Table(BT) for Checkpointed Blocks(CB)0xF4 = Map Table(MT) for Checkpointed Blocks(CB)0xF8 = Log Block(LB)OxOF = Data BlockOxOO = Bad Block預(yù)留其他字節(jié)。備用區(qū)域字段SAFO和SAFl的內(nèi)容取決與塊類型,如圖9所示。圖10所示為與當(dāng)前例子有關(guān)的數(shù)據(jù)結(jié)構(gòu)。一般來說,閃存(NVS)中的數(shù)據(jù)結(jié)構(gòu)在 RAM中有個(gè)對應(yīng)的數(shù)據(jù)結(jié)構(gòu);但是,在RAM中發(fā)現(xiàn)幾個(gè)數(shù)據(jù)結(jié)構(gòu),而在閃存中可能不會(huì)發(fā)現(xiàn) 這些數(shù)據(jù)結(jié)構(gòu)。當(dāng)討論數(shù)據(jù)結(jié)構(gòu)是,用語“塊”是用來指邏輯數(shù)據(jù)構(gòu)造,每種類型的塊的都 可以有不同的大小和作用。當(dāng)用在數(shù)據(jù)結(jié)構(gòu)時(shí)該用語“塊”的用法需要與也被稱為塊的,指 可擦除的最小數(shù)量的閃存芯片的連續(xù)存儲器的用語相區(qū)分。一個(gè)根塊(RB)分配給每個(gè)閃存封裝,并且可以有例如8或16個(gè)包含存儲模塊的 閃存頁。本例中,兩個(gè)索引塊(IB)分配給只每個(gè)總線。檢查點(diǎn)塊(CPB)可以是塊表(BT),其 中每32GB有32個(gè)BT (32-512個(gè)塊單元,例如,32到512個(gè)塊用于大小范圍從32GB到512GB 的模塊,每模塊+16字節(jié),并且,映射表(MT),其中每32GB有IK個(gè)映射表(1K到16K)每模 塊+16字節(jié)。映射表可占全部存儲區(qū)域的0. 8%。+16提供給該情形,32BT CPB每32GB代 表需要的CPB的真實(shí)數(shù)字,但是在寫入新的檢查點(diǎn)塊前不重寫對于一系列地址的舊檢查點(diǎn) 塊,至少比需要用來存儲的元數(shù)據(jù)的塊多分配1個(gè)塊。有+16的位置將存儲模塊的所有16 個(gè)封裝留出給同期的事務(wù)。極限情況下,只有需要加1±夬,但是操作則可能被限制在并行寫 入的數(shù)量和傳輸率,因此,檢查點(diǎn)數(shù)據(jù)只能按該傳輸率寫入到NVS。對于BT,可能只需要一 個(gè)額外的CPB。該IK每32GB的映射表(MT)大小承擔(dān)100%的數(shù)據(jù),用戶可以可尋址;也就是存 儲器中所有可能的物理地址都被用戶數(shù)據(jù)填滿的情況。但是,在本例中,用戶不可能使用超 過99. 2%的地址,因?yàn)榇蠹s0. 8%的芯片存儲器被用來給CPB。日志也需要存儲空間,同時(shí)塊預(yù)留來出來修復(fù)其他部件壽命損壞的塊。典型產(chǎn)品的數(shù)據(jù)表表明損壞塊的限額大概是 3%。塊可以分配給內(nèi)務(wù)操作,如垃圾收集或損耗均衡。因此,在預(yù)留很少或沒有預(yù)留來提升 諸如延遲或?qū)懮a(chǎn)量的性能屬性時(shí),該全部用戶可尋址空間只有系統(tǒng)中物理地址的95%。 但是,在一些其他的情況,少于50 %的地址空間對用戶數(shù)據(jù)有效。雖然用戶數(shù)據(jù)空間通過這 些系統(tǒng)需求從物理數(shù)據(jù)空間減少,但物理存儲器中用戶數(shù)據(jù)和系統(tǒng)數(shù)據(jù)的位置可不被限制 到特定的存儲位置,除非為了避免無效塊。一個(gè)日志塊存儲事務(wù),并每32GB的存儲有大約600個(gè)日志塊。LBS數(shù)目取決于執(zhí) 行一個(gè)CPB中的完全檢查點(diǎn)的總時(shí)間,因?yàn)楸辉O(shè)置檢查點(diǎn)的LB需要最早的仍然有效的CPB 盡量向后延長的時(shí)間。如按一個(gè)固定的傳輸率將檢查點(diǎn)塊寫入NVS,那么日志的近似最大存 儲大小主要由BDU寫入的數(shù)量確定,可以在寫一個(gè)完整的MT和BT表的檢查點(diǎn)到期間執(zhí)行 所述寫操作。當(dāng)可以固定對日志有效的存儲空間,必須在該速度寫檢查點(diǎn)的速度可以通過 計(jì)算日志多快可以被裝滿來確定。在一方面,檢查指示的速度可以是可變的,以使當(dāng)系統(tǒng)幾乎空閑時(shí)以及很少項(xiàng)進(jìn) 入日志時(shí),則檢查指示可以進(jìn)行的更慢。在另一個(gè)方面,也可以基于多少數(shù)據(jù)被寫入日志來寫入檢查點(diǎn),而不是基于在檢 查點(diǎn)區(qū)域的大小和日志區(qū)域的大小比率基礎(chǔ)上日志被寫入的多快,以使用日志項(xiàng)寫入完全 日志區(qū)域前可執(zhí)行一個(gè)完全檢查點(diǎn)。數(shù)據(jù)塊(DB)是用于用戶可存取數(shù)據(jù)存儲的區(qū)域。壞塊(BB)是可以因任何理由宣 布為“壞”的塊。可通過保存上述塊列表以各種不同理由壞塊追蹤壞塊,在這樣的情況下, 在根塊中,上述追蹤不需要系統(tǒng)操作因?yàn)樵搲K的塊表項(xiàng)也將被標(biāo)記為壞,可以預(yù)防其用被 用來存儲數(shù)據(jù)。所述根塊可以方便的作為芯片的塊0,盡管可以使用其他位置。該塊在初始化后極 少被變成或擦除,并且主要用于與芯片相關(guān)的記錄保管,該塊位于該芯片。例如可以存儲如 制造信息(制造日期,生產(chǎn)批量等),系統(tǒng)中模塊的當(dāng)前位置和該模塊上的存儲封裝,以及 元數(shù)據(jù)信息。RB元數(shù)據(jù)可以由,例如,索引塊地址列表,日志和CPB號,以及一份初始壞塊列 表組成。根塊(RB)指向碎銀塊(IB)。對于每個(gè)封裝初始壞塊(BB)列表可以提供的初始壞 塊。初始壞塊列表可僅適用于作為根塊位于同一個(gè)封裝中的存儲塊,而隨后的壞塊列表可 以包含模塊位于任何地方的存儲塊地址。根塊記錄(RBR,如圖11所示,可以包括一個(gè)固定大小的76字的頭,第一 BDU的剩 余部分可以包含如制造信息,如序列號,信息/批號/生產(chǎn)日期,關(guān)于模塊上其他組件的信 息;相關(guān)靜態(tài)信息,如在系統(tǒng)模塊的位置,和識別特定系統(tǒng)一個(gè)系統(tǒng)ID號,在該系統(tǒng)中已安 裝好模塊以使如果該模塊是從其他設(shè)備移動(dòng)或安裝在不同的系統(tǒng),可以當(dāng)作屬于不同系統(tǒng) 模塊被刪除,以使模塊數(shù)據(jù)不會(huì)被無意的使用或覆蓋。QDU中其余的BDU可以包含關(guān)于壞塊號N的計(jì)數(shù)開始,隨后是第一個(gè)254個(gè)壞塊 的地址。如果N大于254,壞塊地址列表可以持續(xù)到下一個(gè)BDU,否則QDU中的其余BDU不 會(huì)被寫入也不會(huì)填滿零。為了更改的數(shù)據(jù)塊的索引,或增加新的壞塊,通常在以前已記錄的 RBR結(jié)尾寫入一個(gè)新的RBR。盡管不需要,該新RBR也可以啟動(dòng)一個(gè)QDU下邊界。根塊(RB)可以有一個(gè)類似于其他BDUs備用區(qū)域的備用區(qū)域,如圖12所示。該類 型字段值是OxFF,以及其他任何類型的值表示一個(gè)壞塊。其中兩個(gè)區(qū)域,如圖11所示預(yù)留的區(qū)域,被用在RB中。一個(gè)相同的24位RBR序列號SAFO被分配給在同一 RBR中所有的 BDU,和一個(gè)24位的擦除塊數(shù)(EBC)SAFl被分配以便于一個(gè)RB中所有已被編程的頁含有相 同的EBC。如果塊中沒有更多的空間來寫新版本的RBR,那么該根塊(RB)的RBR會(huì)被寫道 新的RB中。當(dāng)更新是由于在索引塊(IB)的變更引起的,所有根塊(RB)可能需要被刪除。 最后一個(gè)有效的RBR后沒有追加新RBR ;但如,果沒有足夠的空間來存儲一個(gè)新項(xiàng),那么該 RB將被擦除。如果所有RB已經(jīng)同時(shí)被擦除,并且電源故障,那么將沒有有效的RB用于從其 引導(dǎo)。可能會(huì)被擦除RB號就可能依賴的用來選擇可從中引導(dǎo)的有效RBR的策略。如果該 策略是挑選最近期一個(gè)有效(無差錯(cuò))的RBR,那么,只要一個(gè)RB仍然存在,沒有更恢復(fù)方 案也可以引導(dǎo)系統(tǒng)。如果策略是必須有N個(gè)統(tǒng)一的有效RBR,那么至少N個(gè)RB保持未擦除 當(dāng)寫入新的RBR到一個(gè)擦除的RB。索引塊(IB) 0-7指向塊表(BT)和檢查點(diǎn)塊(CPB),而IB8-15指向映射表(MT)。該 索引塊(IB)的備用區(qū)域如圖13所示。配置類似于RBR備用區(qū)域,其字段類型是標(biāo)志著一 個(gè)IB的OxFl,變量SAFO包括一個(gè)2位類型字段和一個(gè)22位IBR序列號。在同一 IBR中的 所有段具有相同的序列號。SAF 1是類似于RBR中的EBC。2位類型字段表示索引數(shù)據(jù)的數(shù) 據(jù)類型,索引塊指向=BT(OO) ; (01)LB記錄;以及MT記錄(MT)。每個(gè)存儲塊有256KB的大小,但是,如上所述,一對存儲塊,可合并形成一個(gè)單一 的512KB的塊,以允許雙平面操作。這種配置利用現(xiàn)有的大眾市場組件的建筑學(xué)上特性,而 不是對設(shè)計(jì)的要求。因此,在每隊(duì)芯片上該配置有512個(gè)1Kb的BDU。每個(gè)塊都有一個(gè)備用 區(qū)域和備用區(qū)域的定功能,如圖14所示,其中類型字段是OxOF。在這個(gè)例子中,SAFO值是 一個(gè)30位邏輯BDU索引和1位Seq#設(shè)置字段。當(dāng)序列號設(shè)置為賦予不同于值比上一序列號大1的值,該Seq#設(shè)置字段可用于邏 輯地址。這種情況可能發(fā)生在將RAID重建成為一個(gè)備用模塊的情況中,該情況中備用模塊 只有為序列號初始化的值,或在一個(gè)模塊已經(jīng)丟失與與一個(gè)RAID組中的其他模塊的同步。 該情況可能發(fā)生,例如,在一些,但不是所有的模塊已經(jīng)有寫入NVS的新數(shù)據(jù)后發(fā)生電源故 障。例如,如果只有一個(gè)RAID組中的一個(gè)模塊已經(jīng)寫入數(shù)據(jù)到NVS,那么RAID組的寫操作 不會(huì)已經(jīng)完成。以前的數(shù)據(jù)值將得到恢復(fù),無論是,例如,通過查找模塊上的本地恢復(fù)就數(shù) 據(jù),或使用的RAID組中的其他成員的數(shù)據(jù)正在重建數(shù)據(jù)。這些操作現(xiàn)在可存儲在NVS,至少 兩個(gè)對于給定的邏輯地址的實(shí)數(shù)據(jù)例一個(gè)有較小Seq#和較后的PSN的實(shí)例;以及,一個(gè) 有較大Seq#和較前的PSN的實(shí)例。如果在寫入相關(guān)元數(shù)據(jù)到NVS前電源故障,這可能會(huì)導(dǎo) 致隨后不正確地修復(fù)NVS狀態(tài)有較大Seq#的位置可能會(huì)錯(cuò)誤地假定為是最新版本。一個(gè) Seq#設(shè)置位指示通過比較數(shù)個(gè)(較小)Seq#的最新項(xiàng)的判斷可能是不正確的修復(fù)進(jìn)程;但 是,一定程度上,修復(fù)操作可以繼續(xù)進(jìn)行,例如,通過比較數(shù)個(gè)(較大)PSN。但是,因?yàn)閷τ?給定項(xiàng)的PSN沒有被存儲在RAM,所以通過讀取NVS中現(xiàn)在被視為最新的項(xiàng)可以做出該比 較,以便于將該項(xiàng)與在恢復(fù)部分引導(dǎo)期間發(fā)現(xiàn)的項(xiàng)相比。該SAFI字段是NVS中結(jié)構(gòu),其包含了存儲在RAM中MTE的下部分內(nèi)容狀態(tài)+SN 部分。RAM中MTE的第一部分不需要存儲在NVS中,因?yàn)榈谝徊糠职?NVS中物理地址, 其中存儲了 LBA,物理地址可以從正被讀取的SAFl字段獲知。當(dāng)系統(tǒng)在干凈關(guān)閉后重新啟動(dòng),存儲在NVS中的增加存儲的被設(shè)置檢查點(diǎn)的元數(shù) 據(jù),表示存儲器的最新狀態(tài),正確指向存儲在物理存儲位置的LBA數(shù)據(jù)的位置,因?yàn)橛凶銐虻臅r(shí)間利用易失日志來更新的所有在RAM被設(shè)置檢查點(diǎn)的元數(shù)據(jù),并作為被設(shè)置檢查點(diǎn)的 原書存儲一個(gè)已更新的元數(shù)據(jù)的完整版本到NVS??蛇x的,當(dāng)通過存儲最近的日志文件段而 不是完整的元數(shù)據(jù)來執(zhí)行干凈關(guān)閉時(shí),該存儲在NVS和讀取到VS中的元數(shù)據(jù)可以由存儲的 日志數(shù)據(jù)更新。但是,如上所述,一個(gè)“異?!标P(guān)閉可能導(dǎo)致一個(gè)當(dāng)前動(dòng)態(tài)元數(shù)據(jù)的不完全 映像,并且需要使用上述的技術(shù)發(fā)現(xiàn)易失日志數(shù)據(jù)和丟失的數(shù)據(jù)。一個(gè)映射表項(xiàng)(MTE)可能是一個(gè)64位字,如圖15所示,其中32位是分配給LBA 的位置的地址以及32位被分配給序列號和狀態(tài)信息。當(dāng)MT是NVS中的MT時(shí),位置數(shù)據(jù)指 向閃存中數(shù)據(jù)的地址;或當(dāng)MT是緩存MT時(shí),位置數(shù)據(jù)指向緩沖BDU描述符,其包含了閃存 地址。在BDU是在閃存(VO)或DRMA(VS)中的背景下,該MT字位置字段在圖16中被更進(jìn) 一步的描述。V12可能被用來避免必須將數(shù)據(jù)寫入NVS,V12是由一些固定模式組成,例如, 所有1的或0的模式是,如0XfO,0X5a等的共同測試模式。在這種情況下,該類型字段的告 知了該模式字段的說明。在一個(gè)方面,當(dāng)模式是相同的2個(gè)字節(jié)的簡單重復(fù),那么該類型的字段的值將指 示直接使用該模式字段。在另一個(gè)方面,當(dāng)在數(shù)據(jù)中的模式是一些眾所周知的填充模式,如 Oxdeadbeef, Oxfeedface等的,則該類型的字段的值將指示該模式字段是一個(gè)到如被仿制 數(shù)據(jù)的預(yù)定列表的索引,或者該模式字段可以是一個(gè)到一些學(xué)術(shù)模式的動(dòng)態(tài)列表的索引。 可以預(yù)留其他類型的描述符(如,V14和V15)。如用在閃存中的MTE位置字符如圖17所 示。邏輯BDU地址比物理BDU地址大1位,以便于容納兩個(gè)地址空間。當(dāng)與日志和預(yù)留在NVS上的CPB —起被使用時(shí),若不是V8,MTE位置字段可以是任 何使用在易失存儲器(VS)形式中的值,該形式是指DRAM的位置。如果MTE位置字段是V8, 那么指示緩存描述符需要被去引用,以便確定BDU在NVS的狀態(tài),并且相當(dāng)于BDU在NVS的 狀態(tài)的位置字段是適當(dāng)?shù)乇环胖迷谌罩净駽PB中。通過去引用指針,讀取在該指針指向的 地址值的數(shù)據(jù),而不是指針的值本身,該指針的值是數(shù)據(jù)地址值。MTE狀態(tài)字段和序列號((SeqNum)字段如圖18A所示。使用一個(gè)20位的SeqNum。 為3個(gè)行為預(yù)報(bào)器中的每一個(gè)分配一個(gè)4位的行為預(yù)報(bào)器。讀取預(yù)報(bào)器(P-R)可以用來指 示如果當(dāng)前BDU被讀取則ODU中其他BDU也將被讀取的可能性。寫預(yù)報(bào)器(P-W)可以用來 指示如果當(dāng)前BDU被寫入則ODU中其他BDU也將被寫入的可能性。以及,壽命預(yù)報(bào)器(P-L) 可以用來指示在數(shù)據(jù)的閃存形式在垃圾收集操作期間被移動(dòng)之前該BDU將被再重寫進(jìn)NVS 的可能性。圖20-25所示為日志中各種不同類型的數(shù)據(jù)項(xiàng),用存儲在29-31位的項(xiàng)的類型字 段表示。圖20所示的類型1是一個(gè)圖標(biāo)項(xiàng)更新,當(dāng)一個(gè)BDU被寫入到NVS時(shí)使用。字“A” 包含該BDU的在先位置的物理地址;字“B”包含該BDU的邏輯地址;以及,字“C”和“D”包 含關(guān)于所述BDU的VS的MT項(xiàng)的內(nèi)容。圖21所示的類型2是一個(gè)寫日志項(xiàng),其可以被用來記錄一個(gè)到元數(shù)據(jù)的NSV的寫 操作,而不是用戶數(shù)據(jù)。字“A”包含PBI,所述寫操作被執(zhí)行到該P(yáng)BI,該項(xiàng)的剩余部分具有 各種不同字段,例如塊的類型,BDU的PSN,以及包含其他不是關(guān)于數(shù)據(jù)檢測的數(shù)據(jù)就是支 持內(nèi)務(wù)和管理的功能。如圖22所示,類3是一個(gè)塊擦除日志項(xiàng),其可用于指示一個(gè)塊擦除的完成。字“A”
25是該塊中第一個(gè)BDU的地址;在字“C”的“0”字段是作為冗余錯(cuò)誤檢測被在擦除的塊類型。 以及,當(dāng)塊擦除被執(zhí)行時(shí),PSN是該P(yáng)SN的值。圖23所示的類型4是一個(gè)塊分配日志項(xiàng),當(dāng)一個(gè)塊被變更后可以使用該類型;隨 著“N”字段的增加其將于類型3項(xiàng)相同,該“N”字段包含新類型塊和字“B”中的索引字段, 如果塊被指定為一個(gè)檢查點(diǎn)塊來指示在循環(huán)檢查點(diǎn)緩沖器中塊位置,使用該索引字段。圖24所示的類型5是一個(gè)壞塊日志項(xiàng),當(dāng)一塊被宣布為壞時(shí)使用該項(xiàng)。字“B”中 索引字段包含該塊中導(dǎo)致塊被宣布壞的錯(cuò)誤的位置。圖25所示的類型0是一個(gè)襯墊日志項(xiàng),當(dāng)在日志BDU裝滿數(shù)據(jù)前該項(xiàng)被希望寫日 志BDU到NVS時(shí)可以該襯墊日志項(xiàng)用來填滿日志BDU中的未使用的空間該用語“垃圾收集”和“損耗均衡”通常用來描述在閃存系統(tǒng)執(zhí)行的內(nèi)務(wù)操作。垃 圾收集與由到位于快閃存儲器中的一個(gè)LBA的數(shù)據(jù)寫入創(chuàng)建的“無效”存儲位置的回收進(jìn) 程有關(guān)。物理存儲器中的源數(shù)據(jù)位置現(xiàn)在包含過期的數(shù)據(jù)和表示需要被回收的被浪費(fèi)的空 間,這樣維護(hù)一個(gè)適當(dāng)數(shù)量的空閑存儲器來允許延續(xù)的寫操作。磨損均衡一般與快閃存儲 器中移動(dòng)數(shù)據(jù)的進(jìn)程有關(guān),以試圖保持存儲塊擦除操作的數(shù)量大致不小于存儲器的塊,以 避免閃存過早的耗盡。目前閃存電路由制造商評估,按具有在故障前可以由擦除操作的數(shù) 量來衡量的壽命。每次BDU作出變更是序列號SeqNum被增加,不管該新BDU是否預(yù)留在NVS上。 SeqNum可以在從“異?!标P(guān)機(jī)期間恢復(fù)時(shí)使用,不管怎樣導(dǎo)致。使用RAID技術(shù)時(shí),在所有 RAID組的BDU上SeqNum可是相同的,無論在哪里存儲。當(dāng)數(shù)據(jù)從一個(gè)RAID組的不同存儲 位置返回時(shí)(存儲位置可以是,例如,芯片,電路,封裝或模塊),那么屬于相同寫操作的所 有RAID組中的數(shù)據(jù)將具有相同的SeqNum。在這個(gè)例子中的BDU,包括1KB的數(shù)據(jù),以及相關(guān)的輔助數(shù)據(jù)。當(dāng)執(zhí)行一個(gè)讀取操 作是可以將該SeqNum作為通道在相同的數(shù)據(jù)通道返回??梢詫⒃揝eqNum作為通道這樣的 數(shù)據(jù)通道返回,例如,在確認(rèn)(要求)將要寫入存儲器的數(shù)據(jù)回執(zhí)時(shí)。在發(fā)出寫入IKBDBU的數(shù)據(jù)到NVS的命令時(shí)刻可設(shè)置該SeqNum。該SeqNum的一個(gè) 用處可以是用來重建和重新同步一個(gè)RAID組的存儲位置,如果它們變得易變,在異常關(guān)閉 期間可得到的情況。MTE已被設(shè)置檢查點(diǎn)到NVS,可以設(shè)置在位置字段中的SxS位,以使關(guān) 聯(lián)的SeqNum在恢復(fù)進(jìn)程中不會(huì)在被使用。一個(gè)2block由512個(gè)BDU構(gòu)成,以下信息可能可用狀態(tài),一個(gè)64位BDU有效狀 態(tài)位圖,空閑BDU的數(shù)量,和有效BDU數(shù)量,各由2個(gè)字節(jié)表示;CPB的PSN,由5個(gè)字節(jié)來表 示;一個(gè)3字節(jié)的擦除計(jì)數(shù),一個(gè)3字節(jié)的讀取計(jì)數(shù),一個(gè)錯(cuò)誤計(jì)數(shù)[maX_bits]3字節(jié)/1字 節(jié),以及,平均編程次數(shù)(3字節(jié))。Max_bits表示位的最大數(shù)字,其在任何時(shí)候都被被ECC 探測為出錯(cuò)。因?yàn)镋CC只能修正特定數(shù)量的錯(cuò)誤,知道有多少出錯(cuò)位可能是有用的,以便使 該數(shù)據(jù)可在出錯(cuò)位的數(shù)量太大而不能被ECC修正之前,被移至新的存儲位置。其他可對記 錄有用的數(shù)據(jù)可能為平均擦除次數(shù),和編程及擦除的最大次數(shù),這些數(shù)據(jù)可能改變該部分 的壽命??赡苁褂脙煞N類型的檢查點(diǎn)塊(CPB)塊表(BT)CPB和映像表(MT) CPB。每個(gè)BDU中的BT-CPB可能有8個(gè)項(xiàng),每個(gè)ODU中有64個(gè)項(xiàng)。各數(shù)據(jù)塊可能包括 512個(gè)BDU,因此,在BT-CPB中一個(gè)BDU包含8個(gè)項(xiàng)檢查點(diǎn)BT結(jié)構(gòu)表示4K數(shù)據(jù)BDU,容納4MB的數(shù)據(jù),且一個(gè)ODU中的64個(gè)項(xiàng)容納的BT結(jié)構(gòu)表示32K數(shù)據(jù)BDU或32MB的數(shù)據(jù)。塊 表(BT),在正常操作期間,可能周期性地被設(shè)置檢查點(diǎn)到NVS。例如,20個(gè)ODU BT,表示1280 個(gè)2block可能每秒都被設(shè)置檢查點(diǎn)到NVS中。在正常關(guān)閉期間,在易失存儲器里的BT可 能以一個(gè)較快的傳輸率被設(shè)置檢查點(diǎn)到存儲器中直到所有的BT都被設(shè)置檢查點(diǎn)。如上所述周期性地設(shè)置檢查點(diǎn)BT時(shí),一個(gè)完全檢查點(diǎn)的BT與所管理的存儲器大 小大約是成比例的,如,以上述規(guī)定的設(shè)置檢查點(diǎn)蘇拉,一個(gè)32G字節(jié)存儲器的完全檢查點(diǎn) 的BT可能每50秒運(yùn)行一次。設(shè)置檢查點(diǎn)較大的存儲系統(tǒng)的時(shí)間應(yīng)與系統(tǒng)中存儲量成比例。 因此,例如,一個(gè)513GB的存儲系統(tǒng)將在13分鐘后被設(shè)置檢查點(diǎn)。例如,一個(gè)映像表CPB的每個(gè)BDU可能包括128個(gè)項(xiàng),每個(gè)ODU包括IK數(shù)據(jù)項(xiàng)。且 160MT ODU可能每秒。被設(shè)置檢查點(diǎn)。然而,對于32GB的內(nèi)存來說,一個(gè)完整檢查點(diǎn)的MT CPB可能在204秒后運(yùn)行,對于512GB的內(nèi)存每54分被設(shè)置一次檢查點(diǎn)。各檢查點(diǎn)塊備用區(qū)域可能有額外信息,如20D所示,其中一個(gè)字段類型字節(jié)指示 一種類型的CPB,0xF2指示一個(gè)BT CPB,0xF4指示一個(gè)MT CPB.此外,可變的SAFO是在BDU 中第一個(gè)項(xiàng)的索引,SAFI可能是區(qū)域擦除計(jì)數(shù)。映像表(MT)為存儲器提供地址信息。次級表(每128個(gè)MTE有一個(gè))可能包括 “活躍的”描述符和一個(gè)PSN?!盎钴S的”描述符可能指示在[128*i,128*i+127]范圍內(nèi)MTE 的數(shù)量并有一個(gè)類型V8位置字段,其中數(shù)據(jù)是在易失存儲器中的(如,RAM)且在設(shè)置檢查 點(diǎn)時(shí),必須被解除參照。在[128*i,128*i+127]范圍內(nèi)包括MTE的CPB的PSN[i]可在系統(tǒng) 修復(fù)期間被用來安排日志重放順序。日志塊(LB)由16字節(jié)項(xiàng)組成,因此每個(gè)LB的BDU有256個(gè)項(xiàng)。BDU中的所有 項(xiàng)應(yīng)被填滿,以避免不清楚。因此,襯墊項(xiàng)可在關(guān)閉期間用來編程BDU中不用的內(nèi)存位置, 或那里可能需要一個(gè)BDU的及時(shí)寫到NVS中,例如當(dāng)出現(xiàn)一個(gè)壞塊項(xiàng)時(shí)。LB項(xiàng)類型是 MTE(Oxl),CPB寫入(0x2),塊擦除(0x3),塊分配(0x4),壞塊(0x5),以及未編程(0x7)。指 針0x6被預(yù)留.LB項(xiàng)代表一個(gè)MTE,如圖20所示。字A可以是BDU的物理位置,優(yōu)先于導(dǎo)出該LB 項(xiàng)的編程(寫)指令。字B可以是邏輯塊的索引(LBA),其是正在被寫入。字C和D是正被 寫入的LBA的MTE。然而LB項(xiàng)將LBA之前的物理存儲位置與其新的物理存儲位置聯(lián)系起來。當(dāng)一個(gè)CPB正被寫入時(shí),LB項(xiàng)如圖21所示。字A是一 BDU中CPB的物理位置,該 位置正在被寫入;字B是BDU中第一個(gè)項(xiàng)索引值,該索引值可被用作有效性檢查以確定正在 讀取的數(shù)據(jù)是正確的數(shù)據(jù)(其他檢查數(shù)據(jù)可能被取代,如BDU上的CRC,或可能根據(jù)系統(tǒng)的 數(shù)據(jù)穩(wěn)定性需要而被刪除);字C包括一個(gè)單字節(jié)類型字段,以及PSN的第一個(gè)字節(jié);字D 包括PSN的最后4個(gè)字節(jié),與CPB BDU相關(guān)。字A是NVS的塊中第一個(gè)BDU的正被擦除的 索引值(其他檢查數(shù)據(jù)可能被取代,如BDU上的CRC,第一個(gè)BDU的PSN等;這些值允許了 一個(gè)通過確定當(dāng)前數(shù)據(jù)與檢查數(shù)據(jù)不匹配而確認(rèn)該塊被擦除的確認(rèn),因此指示舊的,擦除 前的數(shù)據(jù)已被替代);字B被預(yù)留;字C有一個(gè)單字節(jié)指示被擦除的塊類型,以及PSN的第 一個(gè)字節(jié);字D有PSN的最后4個(gè)字節(jié)。如上所述,本例中,不作為限制,每個(gè)塊可能包含一種類型的數(shù)據(jù)索引,日志,檢 查點(diǎn),或用戶數(shù)據(jù)。雖然這可能確實(shí)是一個(gè)特定設(shè)計(jì)的結(jié)果,這里所作出的限制,僅是為了簡化演示。如圖24所示的塊分配操作的LB項(xiàng)。字A是塊中第一個(gè)BDU的索引值;字B是塊 中第一個(gè)項(xiàng)的索引值(如果合適的話);字C有一個(gè)指示新的塊類型的字節(jié),一個(gè)指示舊的 塊類型的字節(jié),和PSN的第一個(gè)字節(jié);字D有PSN的最后四個(gè)字節(jié)。如圖22E所示的無效塊的LB項(xiàng)。該項(xiàng)生成2次。第一次項(xiàng)在無效塊被發(fā)現(xiàn)時(shí)生 成。LB的剩余空間被填充至完成,并立即被寫入NVS中。一旦無效的存儲塊中所有的BDU 被遷移,另一個(gè)項(xiàng)將被生成。項(xiàng)可能區(qū)別在于,第一次項(xiàng)使用當(dāng)前的塊類型作為塊類型,而 第二次項(xiàng)使用舊的塊類型作為至一個(gè)指針。字A是舊存儲塊中的第一個(gè)BDU的索引值,字 B是錯(cuò)誤頁的索引值,當(dāng)頁程序(寫)失敗時(shí),且當(dāng)塊擦除失敗時(shí),字B的值都為“1”。當(dāng)使 用當(dāng)前可用快閃存儲器并通過ECC來糾正它們時(shí),讀取錯(cuò)誤是“正常的”;錯(cuò)誤的數(shù)量可能存 在塊表中。塊可能因讀取錯(cuò)誤不被宣布為無效,而是作為程序結(jié)果或擦除錯(cuò)誤。字C包括 一個(gè)字節(jié)塊類型指針和PSN的第一個(gè)字節(jié);字D包括PSN的最后4個(gè)字節(jié)。如圖25所示,在襯墊操作中,LB項(xiàng)均為0。這允許了有固定內(nèi)容的ODU快速寫入 NVS。本例中使用的NVS存儲電路,允許了一個(gè)ODU在大約25us被襯墊,而非大約400us,當(dāng) 在總線上運(yùn)行寫動(dòng)作時(shí)。如圖22所示的LB備用區(qū)域。LP備用區(qū)域的獨(dú)特之處是該類型字段是OxFS指示 其為一個(gè)LB ;SAFO的值是LB中的項(xiàng)數(shù);SAFI的值是塊擦除計(jì)數(shù)。建立數(shù)據(jù)結(jié)構(gòu),運(yùn)行設(shè)置元數(shù)據(jù)和日志到NVS的檢查點(diǎn)的操作,修復(fù)或重啟可從 關(guān)閉時(shí)運(yùn)行,或從崩潰時(shí),若該關(guān)閉為異常。當(dāng)系統(tǒng)被初始化,重裝,或用其他方式重新啟動(dòng)時(shí),MT和BT從NVS (如,快閃)到 易失存儲器(如RAM)被讀取,且日志塊地址(LBA)的位置(LogStart)被確定,該位置的最 小PSN比在MT或BT中的任何項(xiàng)的最小PSN都要大。比最新檢查點(diǎn)的MT和BT表中所有的 項(xiàng)小的任何日志中的項(xiàng),不需要修復(fù),之前的事務(wù)完全反映在MT和BT中,MT和BT可從NVS 中讀取到,日志修復(fù)開始與日志中的BDU的位置(LogStart),該位置的小PSN比在MT或BT 中的任何項(xiàng)的最小PSN都要大。此例中進(jìn)程的方面可能用如下偽代碼描述L = LogStartWhile (Li = NULL) &(L. PSN > = LogStart. PSN) {/* 當(dāng)所指的日志 BDU 為非空(未 被擦除)且BDU的PSN大于(即,更近于)Log開始的PSN時(shí),進(jìn)行BDU的項(xiàng)因?yàn)長og是循 環(huán)的,當(dāng)L沿著日志移動(dòng),L將最終回滾,且若所指的BDU未被擦除,BDU將擁有一個(gè)比Log 開始時(shí)更早的一個(gè)PSN。這將指示整個(gè)日志已運(yùn)行*/For 1 = Oto 63If LJE[I], Type ! = OProcess_LE(L, I)/* 運(yùn)行任何非襯墊項(xiàng) */L = NextLogEntry (L) 推到Log的下一個(gè)BDU,當(dāng)達(dá)到一個(gè)日志塊的末尾時(shí),發(fā) 現(xiàn)下一個(gè)日志塊并啟動(dòng)該塊的開始。此步假設(shè)日志是逐塊地被連續(xù)寫入的,然而,舉例來 說,如果日志在某時(shí)刻條形化分布到超過一個(gè)塊,或以其他方式被寫入,該方法按每次一個(gè) 塊連續(xù)地通過存儲器,那么將根據(jù)所使用的布局策略推進(jìn)到下一個(gè)NextLogEntry*/} Process_LE(L, I) {
E = L. E [I];T = E. PSNSwitch(L. E[I], Type) { Case MTE :/*處理一個(gè)數(shù)據(jù)BDU的位置變更*//*提取該日志項(xiàng)的各不同字段OldLoc是一個(gè)物理位置,是在本更新之前BDU所在的位置,如果BDU之前未被使 用,或者存儲于MT中僅作為一個(gè)模式,接著該OldLoc將被發(fā)往一個(gè)無效地址,如O202. NewLoc是BDU被寫入的位置,如果BDU由于諸如被重新分配或被存入MT作為 一個(gè)樣式的原因而沒被寫入NVS,那么NewLoc將被發(fā)往一個(gè)無效地址如OLBI是BDU的邏輯索引,它被寫入該項(xiàng)關(guān)于*/OldLoc = E:Bits
;NewLoc = E:Bits[64-92];LBI = E:Bits[32:60];/*得到BDU新舊位置的塊表項(xiàng)*/OB = BT [ (OldLoc/BlockSize)]
NB = BT[(NewLoc/BlockSize)]/*如果BDU新的或舊的位置在NVS中,且NVS中的塊表項(xiàng)比日志項(xiàng)舊,則從保存在 存儲器中的BT數(shù)據(jù)結(jié)構(gòu)中增加或移出該項(xiàng),并進(jìn)行其他任何合適的處理,如將塊移至空閑 列表如果該列表為空的,或?qū)⑺鼜目蓪懭雺K的列表中移除,如果列表是滿的.等*/If (OIdLoC ! = 0) & (Τ > 0B. PSN) {Remove (0B,OldLoc)}If (NewLoc ! = 0) & (T > NB. PSN) {Add (NB,NewLoc)}/*如果MT的在NVS中的包括BDU的PSN比日志項(xiàng)舊,則通過基于日志項(xiàng)中的數(shù)據(jù) 設(shè)定的PSN來更新保存在內(nèi)存中的MT*/IfT > PSN[LBI/128] {MT [LBI] = E:Bits [64-127]}}Break ;Case Block_Write /*可能被用于簡化內(nèi)務(wù),例如,通過指示所從改變塊類型需求的更新,如將一個(gè)索 引塊更新為一個(gè)指向塊,該塊剛被分配到一個(gè)日志塊被寫進(jìn)NVS,因此沒有必要檢查索引塊 確定其是否已更新。通常地,當(dāng)需確認(rèn)寫入NVS或此確認(rèn)是有幫助的時(shí)候其可以被使用*/Break ;Case Block_Erase ;B = E:Bits
;/* 塊的索引被擦除 */If (T > BT [B]. PSN) {/*在塊的BT項(xiàng)被設(shè)置檢查點(diǎn)后,該塊被擦除*/Process_Block_Erase (B) ;/*在塊擦除后,處理所有進(jìn)行的數(shù)據(jù)結(jié)構(gòu)內(nèi)務(wù),清除 有效節(jié)字段,增加擦除計(jì)數(shù),將項(xiàng)移動(dòng)到空閑列表,等*/Break ;
Case Block Assign ;B = E:Bits
;/* 塊的索引被指定 */If (T > BT[B]-PSN) {/*在塊的BT項(xiàng)被設(shè)置檢查點(diǎn),該塊被指定一種新類型*/Process_Block_Assign(B) ;/*在塊的類型被更改后,處理運(yùn)行的所有數(shù)據(jù)結(jié) 構(gòu)內(nèi)務(wù),可能涉及將該塊從若干列表中增加進(jìn)去或移除。如果該塊被改為一個(gè)檢查點(diǎn)塊或 日志塊或從檢查點(diǎn)塊或日志塊改為其他類型,則索引塊(如果使用)可能需要被更新。如 果該塊被改為索引塊或從索引塊改為其他類型,則根塊(如果使用)可能需要被更新。應(yīng) 進(jìn)行一個(gè)檢查去看是否該塊已被更新*/}Break ;End Switch ;上述偽代碼是眾多進(jìn)程明細(xì)節(jié)片中的一個(gè),它可被用來解釋例子的很多方面,且 不作為為限制的。經(jīng)過日志的處理,最后數(shù)據(jù)位置被寫入每一個(gè)塊,因?yàn)槿罩镜膶懖僮鲗⒈淮_定;然 后,檢查各塊確定是否有額外的數(shù)據(jù)出現(xiàn),額外的數(shù)據(jù)在最后的日志項(xiàng)之后被寫入。如果發(fā) 現(xiàn)BDU比已知BDU的LBA的存于MT中的項(xiàng)還新,則MT被更新,反映了數(shù)據(jù)的新位置,且新 舊BT項(xiàng)得到相應(yīng)的更新。為了防止序號集旗信號在被發(fā)現(xiàn)的BDU中被設(shè)定,那么MTE序號 可能不被用來確定被發(fā)現(xiàn)的BDU或是由MT項(xiàng)最新指定的LBA的BDU,哪個(gè)BDU是較新的,且 在NVS中BDU的PSN指示同一個(gè)LBA必須被比較以確定哪個(gè)數(shù)據(jù)是較新的。如果PSN的規(guī) 格足夠小,則PSN可以在存儲系統(tǒng)的壽命中環(huán)繞,那么應(yīng)實(shí)施某些形式的擦洗來移動(dòng)BDU, 當(dāng)其PSN太舊而可能不能正確地確定不同BDU的相對年齡,在修復(fù)操作過程中,其擁有對相 同LBA的數(shù)據(jù)。因此,此處意圖是認(rèn)為前面提到的詳細(xì)描述是解釋性的而非限制,并且可以理解 的是,后續(xù)的權(quán)利要求,包括所有等同的變更,用于定義本發(fā)明的精神和范圍。
30
權(quán)利要求
一種操作存儲系統(tǒng)的方法,其特征在于,該方法包括維護(hù)非易失存儲器(NVS)中的動(dòng)態(tài)表的檢查點(diǎn)副本;維護(hù)關(guān)于該動(dòng)態(tài)表的事務(wù)日志;發(fā)現(xiàn)對動(dòng)態(tài)表的未被該事務(wù)日志包含的變更;通過應(yīng)用該事務(wù)日志中的事務(wù)和被發(fā)現(xiàn)的變更更新該動(dòng)態(tài)表。
2.如權(quán)利要求1所述的方法,其特征在于,將所述動(dòng)態(tài)表的檢查點(diǎn)副本從該非易失存 儲器讀出到易失存儲器中。
3.如權(quán)利要求2所述的方法,其特征在于,所述動(dòng)態(tài)表包括一個(gè)快閃存儲器的一個(gè)塊 的索引值,該索引值是寫數(shù)據(jù)塊的扇區(qū)數(shù)的最高的增加值。
4.如權(quán)利要求3所述的方法,其特征在于,發(fā)現(xiàn)變更包括步驟檢查該塊以確定是否數(shù)據(jù)已被寫入一個(gè)具有比該塊的索引值更大的索引值的扇區(qū)。
5.如權(quán)利要求4所述的方法,其特征在于,數(shù)據(jù)已被寫入該扇區(qū)的指示是數(shù)據(jù)位不全 為 “1”。
6.如權(quán)利要求4所述的方法,其特征在于,數(shù)據(jù)已被寫入該扇區(qū)的指示是該扇區(qū)的空 閑數(shù)據(jù)區(qū)域的數(shù)據(jù)位不全為“ 1 ”。
7.如權(quán)利要求4所述的方法,其特征在于,發(fā)現(xiàn)變更包括步驟檢查每個(gè)塊的至少一個(gè)被最低編號的扇區(qū)以確定是否該塊已被從自該事務(wù)日志的檢 查點(diǎn)后擦除。
8.如權(quán)利要求4所述的方法,其特征在于,所述被發(fā)現(xiàn)的變更包括空閑數(shù)據(jù)。
9.如權(quán)利要求8所述的方法,其特征在于,所述備用數(shù)據(jù)包括該數(shù)據(jù)的邏輯塊地址和 事務(wù)序列號。
10.如權(quán)利要求8所述的方法,其特征在于,所述備用數(shù)據(jù)包括該數(shù)據(jù)的在先扇區(qū)地址。
11.如權(quán)利要求要求3所述的方法,其特征在于,所述扇區(qū)為多個(gè)扇區(qū)。
12.如權(quán)利要求要求10所述的方法,其特征在于,四個(gè)扇區(qū)是一個(gè)頁,以及該被發(fā)現(xiàn)的 變更是關(guān)于數(shù)據(jù)頁。
13.如權(quán)利要求要求1所述的方法,其特征在于,序列號被順序地分配動(dòng)態(tài)表的每個(gè)變更。
14.如權(quán)利要求要求1所述的方法,其特征在于,所述動(dòng)態(tài)表是表示至少一個(gè)寫入到每 個(gè)最小可寫存儲電路地址范圍內(nèi)的數(shù)據(jù)的基礎(chǔ)存儲地址的元數(shù)據(jù)。
15.如權(quán)利要求1所述,其特征在于,所述元數(shù)據(jù)將邏輯塊地址與物理扇區(qū)地址關(guān)聯(lián), 以及所述動(dòng)態(tài)表是通過以部分形式設(shè)置檢查點(diǎn)被維護(hù)在非易失存儲器中。
16.如權(quán)利要求1所述的方法,其特征在于,所述動(dòng)態(tài)表包含關(guān)于多個(gè)塊的元數(shù)據(jù)數(shù) 據(jù),每個(gè)塊包含多個(gè)扇區(qū)。
17.如權(quán)利要求1所述的方法,其特征在于,所述動(dòng)態(tài)表和事務(wù)日志被以段形式設(shè)置檢 查點(diǎn)到非易失存儲器。
18.如權(quán)利要求17所述的方法,其特征在于,在相同的段被再次被設(shè)置檢查點(diǎn)之前,該 動(dòng)態(tài)表的每個(gè)段被設(shè)置檢查點(diǎn)。
19.如權(quán)利要求17所述的方法,其特征在于,當(dāng)預(yù)定數(shù)量的變更被變?yōu)槎蔚膬?nèi)容時(shí)所2述動(dòng)態(tài)表的每個(gè)段被設(shè)置檢查點(diǎn)。
20.如權(quán)利要求17所述的方法,其特征在于,在最后一個(gè)檢查點(diǎn)后在經(jīng)過預(yù)定的時(shí)間 后所述動(dòng)態(tài)表的每個(gè)段被設(shè)置檢查點(diǎn)。
21.如權(quán)利要求1所述的方法,其特征在于,非易失存儲器(NVS)中被設(shè)置檢查點(diǎn)的事 務(wù)日志是通過將易失事務(wù)日志的最新的段的內(nèi)容寫入到事務(wù)非易失存儲器(NVS)來維護(hù) 的。
22.如權(quán)利要求1所述的方法,其特征在于,非易失存儲器(NVS)中事務(wù)日志的大小足 以維護(hù)在最后一次動(dòng)態(tài)表的每個(gè)段被設(shè)置檢查點(diǎn)后影響該動(dòng)態(tài)表的事務(wù)記錄。
23.如權(quán)利要求1所述的方法,其特征在于,用于發(fā)現(xiàn)的變更的空閑數(shù)據(jù)被寫到一個(gè)恢復(fù)日志。
24.如權(quán)利要求23所述的方法,其特征在于,根據(jù)從所述空閑數(shù)據(jù)提取的事務(wù)序列號, 所述空閑數(shù)據(jù)在恢復(fù)日志中是有序的。
25.如權(quán)利要求25所述的方法,其特征在于,通過應(yīng)用包含在該空閑數(shù)據(jù)的事務(wù)信息, 該有序的空閑數(shù)據(jù)被用來更新該動(dòng)態(tài)表。
26.如權(quán)利要求3所述的方法,其特征在于,檢查與塊的索引值一致的扇區(qū)。
27.如權(quán)利要求9所述的方法,其特征在于,當(dāng)所述扇區(qū)中包含所述塊已被一個(gè)擦除事 務(wù)所擦除的指示時(shí),更新空閑扇區(qū)表。
28.如權(quán)利要求9所述的方法,其特征在于,寫入非易失存儲器(NVS)的用戶數(shù)據(jù)是通 過使用獨(dú)立冗余磁盤陣列(RAID)算法來寫的。
29.如權(quán)利要求28所述的方法,其特征在于,動(dòng)態(tài)表數(shù)據(jù)包含所述獨(dú)立冗余磁盤陣列 (RAID)數(shù)據(jù)的序列號。
30.一種數(shù)據(jù)存儲系統(tǒng),該系統(tǒng)包括一個(gè)易失存儲器設(shè)備(VS);一個(gè)非易失存儲器設(shè)備(NVS);以及一個(gè)用于與該易失存儲器設(shè)備和非易失存儲器設(shè)備交互的處理器,其中,所述處理器被配置用來維護(hù)在易失存儲器中表示存儲在非易失存儲器(NVS)中 的數(shù)據(jù)的動(dòng)態(tài)表,非易失存儲器NVS中所述動(dòng)態(tài)表檢查點(diǎn)的版本,以及表示影響已存儲事 務(wù)的日志,并用來通過在上一次更新和某個(gè)修復(fù)時(shí)間之間發(fā)現(xiàn)寫到NVS中的數(shù)據(jù)來修改所 述動(dòng)態(tài)表。
31.如權(quán)利要求15所述的系統(tǒng),其特征在于,所述動(dòng)態(tài)表包含元數(shù)據(jù),所述元數(shù)據(jù)包括 一個(gè)邏輯地址到物理地址的映射,以及對非易失存儲器(NVS)的可寫數(shù)據(jù)區(qū)域索引的索引 值,該索引值表示對已寫入其中的非易失存儲器設(shè)備(NVS)的塊的最高可寫數(shù)據(jù)區(qū)域。
32.—種計(jì)算機(jī)程序產(chǎn)品,所述產(chǎn)品存儲或分布在一個(gè)計(jì)算機(jī)可讀介質(zhì)上,其特征在 于,包括指令,用于配置處理器和存儲系統(tǒng)來維護(hù)在易失存儲器設(shè)備中的表示存儲在非易失存儲器設(shè)備 (NVS)中的元數(shù)據(jù);維護(hù)非易失存儲器設(shè)備(NVS)中所述元數(shù)據(jù)的檢查點(diǎn)的版本和事務(wù)日志;以及修復(fù)所述元數(shù)據(jù)通過應(yīng)用到元數(shù)據(jù)的事務(wù)日志的事務(wù)來更新該元數(shù)據(jù);發(fā)現(xiàn)寫到非易失存儲器設(shè)備(NVS)的事務(wù),其中,在非易失存儲器 設(shè)備(NVS)中的事務(wù)日志尚未更新到包括該事務(wù);以及 應(yīng)用該被發(fā)現(xiàn)的事務(wù)來更新所述元數(shù)據(jù)。
33.如權(quán)利要求32所述的計(jì)算機(jī)程序產(chǎn)品,其特征在于,所述被發(fā)現(xiàn)的事務(wù)在應(yīng)用前 被安排在一個(gè)有序序列中。
34.如權(quán)利要求33所述的計(jì)算機(jī)程序產(chǎn)品,其特征在于,所述被發(fā)現(xiàn)的事務(wù)包括確定 非易失存儲器設(shè)備(NVS)的數(shù)據(jù)塊是否已被擦除以及該事務(wù)是否還未被記錄在檢查點(diǎn)元 數(shù)據(jù)或事務(wù)日志中,以及更新該元數(shù)據(jù)。
35.如權(quán)利要求32所述的計(jì)算機(jī)程序產(chǎn)品,其特征在于,所述元數(shù)據(jù)包括索引值,用于 表示非易失存儲器設(shè)備(NVS)的塊中一個(gè)較高的有數(shù)據(jù)寫入其中的扇區(qū)位置。
36.如權(quán)利要求32所述的計(jì)算機(jī)程序產(chǎn)品,其特征在于,所述元數(shù)據(jù)包括一個(gè)空閑塊 列表。
37.如權(quán)利要求36所述的計(jì)算機(jī)程序產(chǎn)品,其特征在于,所述空閑塊包括所有空閑扇區(qū)。
38.如權(quán)利要求37所述的計(jì)算機(jī)程序產(chǎn)品,其特征在于,按遞增的索引值的順序?qū)?shù) 據(jù)寫到空閑扇區(qū)。
39.如權(quán)利要求38所述的計(jì)算機(jī)程序產(chǎn)品,其特征在于,當(dāng)數(shù)據(jù)被寫到空閑扇區(qū)時(shí),該 扇區(qū)可視為具有有效數(shù)據(jù)并且在塊被擦除前該扇區(qū)不可再被寫入。
40.如權(quán)利要求24所述的計(jì)算機(jī)程序產(chǎn)品,其特征在于,在該塊中的含有有效數(shù)據(jù)的 所有扇區(qū)的數(shù)據(jù)被移到其他塊的空閑扇區(qū)前,該塊不可被擦除。
41.如權(quán)利要求25所述的計(jì)算機(jī)程序產(chǎn)品,其特征在于,當(dāng)扇區(qū)位置的數(shù)據(jù)被修改時(shí), 該被修改的數(shù)據(jù)的扇區(qū)位置被更改成寫入該被修改的數(shù)據(jù)空閑頁的扇區(qū)位置,并將從其移 動(dòng)出該修改數(shù)據(jù)的扇區(qū)位置標(biāo)記為無效頁。
42.一種操作存儲系統(tǒng)的方法,其特征在于,該方法包括 分配序列號給每個(gè)數(shù)據(jù)元素來確定該數(shù)據(jù)元素的最新版本; 設(shè)置旗信號來指示該序號何時(shí)不可使用。
43.一種操作存儲系統(tǒng)的方法,其特征在于,該方法包括創(chuàng)建表示與存儲在存儲器中的數(shù)據(jù)元素有關(guān)的元數(shù)據(jù),該元數(shù)據(jù)具有存儲該數(shù)據(jù)元素 地址的字段;當(dāng)數(shù)據(jù)元素是已知數(shù)據(jù)模式,用標(biāo)志替換該地址數(shù)據(jù),該標(biāo)志表示數(shù)據(jù)模式。
全文摘要
所描述的一種用于管理非易失存儲器中數(shù)據(jù)的保存的系統(tǒng)和方法。一方面,所該數(shù)據(jù)可以又元數(shù)據(jù)和一個(gè)被從易失存儲器到非易失存儲器設(shè)置檢查點(diǎn)的一個(gè)事物日志。考慮已知被記錄的每個(gè)塊中的最高扇區(qū),在元數(shù)據(jù)段的最后一個(gè)設(shè)置檢查點(diǎn)和日志文件段之間的發(fā)生的動(dòng)作被通過掃描非易失存儲器塊發(fā)現(xiàn)。發(fā)現(xiàn)任何在后的事務(wù)并使用其來更新被恢復(fù)的元數(shù)據(jù)以使該元數(shù)據(jù)能夠正確的表示被存儲的數(shù)據(jù)。
文檔編號G06F12/00GK101903866SQ200880117676
公開日2010年12月1日 申請日期2008年11月19日 優(yōu)先權(quán)日2007年11月21日
發(fā)明者喬恩·C.r.·貝內(nèi)特 申請人:提琴存儲器公司