專利名稱:具有存儲器平面對準(zhǔn)的非易失性存儲器及方法
技術(shù)領(lǐng)域:
本發(fā)明一般涉及非易失性半導(dǎo)體存儲器,尤其涉及具有存儲器區(qū)塊管理系統(tǒng)的非易失性半導(dǎo)體存儲器,其經(jīng)過優(yōu)化而用于并行地操作多個存儲器平面,其中每個平面均由其自己的讀/寫電路組來服務(wù)。
背景技術(shù):
能夠進(jìn)行電荷的非易失性存儲的固態(tài)存儲器,尤其是屬于封裝成小型存儲卡的EEPROM及快閃EEPROM的形式,近來已成為各種移動及手持裝置選擇的存儲裝置,特別是信息家電及消費(fèi)性電子產(chǎn)品。與同為固態(tài)存儲器的RAM(隨機(jī)存取存儲器)不同的是,快閃存儲器是非易失性的,即使在關(guān)閉電源后仍能保留其存儲的數(shù)據(jù)。還有,不像ROM(只讀存儲器),快閃存儲器和磁盤存儲裝置一樣都是可再寫。盡管成本較高,但在大量存儲應(yīng)用中,快閃存儲器的使用漸增?;谛D(zhuǎn)磁性媒體的常規(guī)大量存儲裝置,如硬盤驅(qū)動機(jī)及軟盤,并不適合移動及手持環(huán)境。這是因?yàn)榇疟P驅(qū)動器傾向于體積龐大,容易出現(xiàn)機(jī)械故障且具有高等待時間及高功率需求。這些不想要的屬性使得基于磁盤的存儲裝置無法在大多數(shù)的行動及便攜應(yīng)用中使用。另一方面,既為內(nèi)嵌式且為抽取式存儲卡形式的快閃存儲器在理想上適用于移動及手持環(huán)境,因?yàn)槠浯笮⌒ ⒐β氏牡?、高速及高可靠性特性?br>
快閃EEPROM和EEPROM(電子可擦除及可編程只讀存儲器)的相似處在于,其為能夠被擦除且能將新的數(shù)據(jù)寫入或“編程”到其存儲器單元中的非易失性存儲器。二者均利用場效晶體管結(jié)構(gòu)中,位于半導(dǎo)體襯底中溝道區(qū)之上且在源極及漏極區(qū)之間的浮動(未連接)導(dǎo)電柵極。接著在浮動?xùn)艠O之上提供控制柵極。浮動?xùn)艠O所保留的電荷量可控制晶體管的閾值電壓特性。也就是說,就浮動?xùn)艠O上給定電平的電荷而言,其中有必須在“開啟”晶體管之前施加于控制柵極的對應(yīng)電壓(閾值),以允許在其源極及漏極區(qū)之間的導(dǎo)電。尤其,如快閃EEPROM的快閃存儲器允許同時擦除存儲器單元的整個區(qū)塊。
浮動?xùn)艠O可以保持某個電荷范圍,因此,可經(jīng)編程為閾值電壓窗內(nèi)的任何閾值電壓電平。閾值電壓窗的大小受限于裝置的最小及最大閾值電平,而裝置的最小及最大閾值電平對應(yīng)于可編程到浮動?xùn)艠O上的電荷范圍。閾值窗一般根據(jù)存儲器裝置的特性、操作條件及記錄而定。原則上,在此窗內(nèi),各有所不同的、可分辨的閾值電壓電平范圍均可用于指定單元的明確的存儲器狀態(tài)。
通常會通過兩種機(jī)制之一,將作為存儲器單元的晶體管編程為“已編程”狀態(tài)。在“熱電子注入”中,施加到漏極的高電壓可加速橫跨在襯底溝道區(qū)上的電子。同時,施加到控制柵極的高電壓可吸引熱電子通過薄柵極電介質(zhì)到浮動?xùn)艠O上。在“隧穿注入”中,會相對于所述襯底將高電壓施加給所述控制柵極。依此方式,可將襯底的電子吸引到中間的浮動?xùn)艠O。雖然習(xí)慣使用用語“編程”描述通過注入電子到存儲器單元的初始擦除電荷存儲單元來寫入存儲器以改變存儲器狀態(tài),現(xiàn)已和較為常見的用語,如“寫入”或“記錄”交換使用。
可以利用下面數(shù)種機(jī)制來擦除所述存儲器裝置。對EEPROM而言,通過相對于所述控制柵極將高電壓施加給所述襯底,致使可于所述浮動?xùn)艠O中誘發(fā)出電子,使其隧穿一薄氧化物進(jìn)入所述襯底溝道區(qū)(也就是,F(xiàn)owler-Nordheim隧穿效應(yīng)),便可電擦除一存儲器單元。一般來說,EEPROM可以逐個字節(jié)的方式來擦除。對快閃EEPROM而言,可每次電擦除所有的存儲器或是每次電擦除一個或一個以上最小可擦除區(qū)塊,其中最小可擦除區(qū)塊可能是由一個或一個以上的扇區(qū)組成且每個扇區(qū)均可存儲512個或更多字節(jié)的數(shù)據(jù)。
所述存儲器裝置通常包括可被安裝于一存儲卡上的一個或一個以上存儲器芯片。各存儲器芯片包含周邊電路(如譯碼器和擦除、寫入及讀取等電路)所支持的存儲器單元陣列。較為精密的存儲器裝置還附有執(zhí)行智能型和較高階存儲器操作及接口連接的控制器。
現(xiàn)今已有許多市售成功的非易失性固態(tài)存儲器裝置。這些存儲器裝置可能是快閃EEPROM,或是可采用其它類型的非易失性存儲器單元??扉W存儲器與系統(tǒng)及其制造方法的范例揭示于美國專利案第5,070,032號、第5,095,344號、第5,315,541號、第5,343,063號、第5,661,053號、第5,313,421號、以及第6,222,762號。明確地說,美國專利案第5,570,315號、第5,903,495號、第6,046,935號中描述了具有NAND字符串結(jié)構(gòu)的快閃存儲器裝置。另外,也可利用具有一用來存儲電荷的介電層的存儲器單元來制造非易失性存儲器裝置。其利用介電層來取代前面所述的導(dǎo)電浮動?xùn)艠O組件。Eitan等人于2000年11月在IEEEElectron Device Letters,第21冊,第11號,第543-545頁中所發(fā)表的“NROMA NovelLocalized Trapping,2-Bit Nonvolatile Memory Cell”一文中描述了這些利用介電存儲組件的存儲器裝置。有一ONO介電層延伸跨越源極與漏極擴(kuò)散區(qū)間的溝道。其中一個數(shù)據(jù)位的電荷定位在靠近所述漏極的介電層中,而另一個數(shù)據(jù)位的電荷定位在靠近所述源極的介電層中。舉例來說,美國專利案第5,768,192號及第6,011,725號便揭示一種在兩層二氧化硅層間夾放一陷捕電介質(zhì)的非易失性存儲器單元。通過分開讀取所述電介質(zhì)內(nèi)空間分離的電荷存儲區(qū)域的二進(jìn)制狀態(tài),便可實(shí)現(xiàn)多狀態(tài)的數(shù)據(jù)存儲。
為了提高讀取及編程性能,并行讀取或編程陣列中的多個電荷存儲組件或存儲器晶體管。因此,一起讀取或編程存儲器組件的“頁”。在現(xiàn)有的存儲器架構(gòu)中,一行通常含有若干交錯的頁或一行可構(gòu)成一個頁。一個頁的所有存儲器組件會被一起讀取或編程。
在快閃存儲器系統(tǒng)中,擦除操作可能需要多達(dá)長于讀取及編程操作的數(shù)量級。因此,希望能夠具有大大小的擦除區(qū)塊。依此方式,即可降低總數(shù)很大的存儲器單元上的擦除時間。
依照快閃存儲器的性質(zhì),數(shù)據(jù)必須寫入已擦除的存儲器位置。如果要更新主機(jī)的特定邏輯地址的數(shù)據(jù),一種方式是將更新數(shù)據(jù)再寫入相同的物理存儲器位置中。也就是說,邏輯對物理地址映射不會變更。然而,這便表示必須先擦除含有所述物理位置的整個擦除區(qū)塊,然后再以更新數(shù)據(jù)再寫入。此更新方法很沒有效率,因?yàn)槠湫枰脸霸賹懭胝麄€擦除區(qū)塊,尤其在要更新的數(shù)據(jù)只占用擦除區(qū)塊的一小部分時。此外,還會造成比較頻繁的存儲器區(qū)塊的擦除再循環(huán),而這對此類型存儲器裝置的有限耐久性而言并不理想。
另一個管理快閃存儲器系統(tǒng)的問題是必須處理系統(tǒng)控制及目錄數(shù)據(jù)。各種存儲器操作的過程期間會產(chǎn)生且存取所述數(shù)據(jù)。因此,其有效處理及迅速存取將直接影響性能。由于快閃存儲器是用來存儲且是非易失性,因此希望能夠在快閃存儲器中維持此類型的數(shù)據(jù)。然而,因?yàn)樵诳刂破骷翱扉W存儲器之間有中間檔案管理系統(tǒng),所以無法直接存取數(shù)據(jù)。還有,系統(tǒng)控制及目錄數(shù)據(jù)傾向于成為作用中及成為片段,而這對于具有大大小區(qū)塊擦除的系統(tǒng)中的存儲毫無助益。照慣例,會在控制器RAM中設(shè)定此類型的數(shù)據(jù),藉此允許由控制器直接存取。在開啟存儲器裝置的電源后,初始化程序會掃描快閃存儲器,以編譯要放在控制器RAM中的必要系統(tǒng)控制及目錄信息。此過程既耗時又需要控制器RAM容量,對于持續(xù)增加的快閃存儲器容量更是如此。
US 6,567,307揭示一種在大擦除區(qū)塊中處理扇區(qū)更新的方法,其包括在多個用作可用高速暫存區(qū)的擦除區(qū)塊中記錄更新數(shù)據(jù),及最后在各種區(qū)塊中合并有效扇區(qū),然后按邏輯循序順序重新對準(zhǔn)有效扇區(qū)后將其再寫入。依此方式,在每個最微小的更新時,不必擦除及再寫入?yún)^(qū)塊。
WO 03/027828及WO 00/49488均揭示一種處理大擦除區(qū)塊中更新的存儲器系統(tǒng),其中包括以區(qū)域?yàn)閱挝环指钸壿嬌葏^(qū)地址。小區(qū)域的邏輯地址范圍是保留用于和另一個用于使用者數(shù)據(jù)的區(qū)域分開的作用中系統(tǒng)控制數(shù)據(jù)。依此方式,在其自己區(qū)域中的系統(tǒng)控制數(shù)據(jù)操控便不會和另一區(qū)域中關(guān)聯(lián)的使用者數(shù)據(jù)互相作用。更新屬于邏輯扇區(qū)層級,而且寫入指針會指向要寫入之區(qū)塊中的對應(yīng)物理扇區(qū)。映射信息在RAM中被緩沖,且最后被存儲在主存儲器的扇區(qū)配置表中。邏輯扇區(qū)的最新版本會使得現(xiàn)有區(qū)塊中的所有先前版本過時,這些區(qū)塊因此變成部分過時。執(zhí)行垃圾收集可保持部分過時區(qū)塊為可接受的數(shù)量。
先前技術(shù)的系統(tǒng)傾向于使更新數(shù)據(jù)分布在許多區(qū)塊上或更新數(shù)據(jù)會使許多現(xiàn)有的區(qū)塊部分過時。結(jié)果通常是部分過時區(qū)塊需要大量垃圾收集,這很沒有效率且會造成存儲器提早老化。此外,和非循序更新相比,更缺少有系統(tǒng)及有效的方式來處理循序更新。
因此,普遍需要高容量及高性能的非易失性存儲器。尤其,更需要有能夠在大區(qū)塊中執(zhí)行存儲器操作且沒有上述問題的高容量非易失性存儲器。
發(fā)明內(nèi)容
一種非易失性存儲器系統(tǒng)是按照物理存儲器位置的物理群組來組織。各物理群組(元區(qū)塊)可作為一個單元來擦除且能用來存儲一個邏輯群組的數(shù)據(jù)。存儲器管理系統(tǒng)允許通過配置記錄邏輯群組的更新數(shù)據(jù)專用的元區(qū)塊來更新一個邏輯群組的數(shù)據(jù)。更新元區(qū)塊按照所接收的順序記錄更新數(shù)據(jù),且對記錄按照原始存儲的正確邏輯順序(循序)與否(混亂)并沒有限制。最后會關(guān)閉更新元區(qū)塊以進(jìn)行其它記錄。會發(fā)生若干處理之一,但最終會以按照正確順序完全填滿的取代原始元區(qū)塊的元區(qū)塊結(jié)束。在混亂的情況下,會以有助于經(jīng)常更新的方式將目錄數(shù)據(jù)維持在非易失性存儲器中。系統(tǒng)支持多個同時更新的邏輯群組。
本發(fā)明的一個特點(diǎn)允許以逐個邏輯群組的方式來更新數(shù)據(jù)。因此,在更新邏輯群組時,會限制邏輯單位的分布(還有因更新而過時的存儲器單位的散布)范圍。這在邏輯群組通常含在物理區(qū)塊內(nèi)時更是如此。
在邏輯群組的更新期間,通常需要指派一或兩個緩沖已更新邏輯單位的區(qū)塊。因此,只需要在相對較少數(shù)量的區(qū)塊上執(zhí)行垃圾收集。通過合并或壓縮即可執(zhí)行混亂區(qū)塊的垃圾收集。
相較于循序區(qū)塊來說,更新處理的經(jīng)濟(jì)性在更新區(qū)塊的一般處理中會愈加明顯,因而便無須為混亂(非循序)更新配置任何額外的區(qū)塊。所有的更新區(qū)塊均被配置為循序的更新區(qū)塊,而且任何更新區(qū)塊均可被變更成混亂的更新區(qū)塊。更確切地說,可任意地將更新區(qū)塊從循序式變更成混亂式。
有效使用系統(tǒng)資源允許同時更新多個邏輯群組。這可進(jìn)一步提高效率及減少額外開銷。
分散在多個存儲器平面上的存儲器對準(zhǔn)根據(jù)本發(fā)明的另一方面,對于一被組織成復(fù)數(shù)個可擦除區(qū)塊且由多個存儲器平面所構(gòu)成(因而可并行地讀取復(fù)數(shù)個邏輯單位或是將復(fù)數(shù)個邏輯單位并行地編程到所述多個平面之中)的存儲器陣列,當(dāng)要更新存儲在特定存儲器平面中第一區(qū)塊的原始邏輯單位時,會供應(yīng)所需以將已更新的邏輯單位保持在和原始相同的平面中。這可通過以下方式來完成將已更新的邏輯單位記錄到仍在相同平面中的第二區(qū)塊的下一個可用位置。優(yōu)選將邏輯單位存儲在平面中和其中其它版本相同的偏移位置,使得給定邏輯單位的所有版本由相同組的感測電路予以服務(wù)。
據(jù)此,在一個優(yōu)選實(shí)施例中,以邏輯單位的目前版本來填補(bǔ)介于上一個編程存儲器單位與下一個可用平面對準(zhǔn)存儲器單位之間的任何中間間隙。將邏輯上位于所述最后被編程的邏輯單位后面的所述邏輯單位的目前版本以及邏輯上位于被存儲在下一個可用的平面對準(zhǔn)存儲器單位中的邏輯單位前面的所述邏輯單位的目前版本填入間隙中,便可完成所述填補(bǔ)操作。
依此方式,可將邏輯單位的所有版本維持在具有和原始相同偏移的相同平面中,致使在垃圾收集操作中,不必從不同平面檢索邏輯單位的最新版本,以免降低性能。在一個優(yōu)選實(shí)施例中,可利用所述最新的版本來更新或填補(bǔ)所述平面上的每個存儲器單位。因此,便可從每個平面中并行地讀出一邏輯單位,其將會具有邏輯順序而無需進(jìn)一步重新對準(zhǔn)。
此方案通過允許平面上重新對準(zhǔn)邏輯群組的邏輯單位的最新版本,且不必從不同存儲器平面中搜集最新版本,而縮短合并混亂區(qū)塊的時間。這很有好處,其中主機(jī)接口的性能規(guī)格可定義由存儲器系統(tǒng)完成扇區(qū)寫入操作的最大等待時間。
階段性程序錯誤處理根據(jù)本發(fā)明的另一方面,在具有區(qū)塊管理系統(tǒng)的存儲器中,在時間緊急的存儲器操作期間,區(qū)塊中的程序失敗可通過繼續(xù)中斷區(qū)塊(breakout block)中的編程操作來處理。稍后,在較不緊急的時間,可將中斷前記錄在失敗區(qū)塊中的數(shù)據(jù)傳送到其它可能也是中斷區(qū)塊的區(qū)塊。接著即可丟棄失敗的區(qū)塊。依此方式,在遇到缺陷區(qū)塊時,不會因必須立刻傳送缺陷區(qū)塊中存儲的數(shù)據(jù)而丟失數(shù)據(jù)及超過指定的時間限制,即可加以處理。此錯誤處理對于垃圾收集操作尤其重要,因此在緊急時間期間不需要對一嶄新的區(qū)塊重復(fù)進(jìn)行整個操作。其后,在適宜的時間,通過重新定位到其它區(qū)塊,即可挽救缺陷區(qū)塊的數(shù)據(jù)。
程序失敗處理在合并操作期間尤其重要。正常的合并操作可將常駐在原始區(qū)塊及更新區(qū)塊中的邏輯群組的所有邏輯單位的目前版本合并到合并區(qū)塊。在合并操作期間,如果在合并區(qū)塊中發(fā)生程序失敗,則會提供另一個當(dāng)作中斷合并區(qū)塊的區(qū)塊,以接收其余邏輯單位的合并。依此方式,無須復(fù)制邏輯單位一次以上,而仍可在正常合并操作指定的期間內(nèi)完成例外處理的操作。在適宜的時間,將群組所有未處理完成的邏輯單位合并到中斷區(qū)塊中,即可完成合并操作。適宜的時間將是在目前主機(jī)寫入操作以外的一些其它有時間執(zhí)行合并期間的期間。一個此種適宜的時間是在另一個其中有更新但無關(guān)聯(lián)合并操作的主機(jī)寫入的期間。
實(shí)質(zhì)上,可將程序失敗處理的合并視為以多階段來實(shí)施。在第一階段中,在發(fā)生程序失敗后,會將邏輯單位合并到一個以上區(qū)塊中,以避免合并各邏輯單位一次以上。在適宜的時間會完成最后階段,其中會將邏輯群組合并到一個區(qū)塊中,優(yōu)選通過按循序順序?qū)⑺羞壿媶挝皇占街袛嗪喜^(qū)塊中。
非循序更新區(qū)塊索引根據(jù)本發(fā)明的另一方面,在具有支持具有非循序邏輯單位的更新區(qū)塊的區(qū)塊管理系統(tǒng)的非易失性存儲器中,非循序更新區(qū)塊中邏輯單位的索引在RAM中緩沖,并定期將其存儲到非易失性存儲器中。在一個實(shí)施例中,將索引存儲在專用于存儲索引的區(qū)塊中。在另一個實(shí)施例中,將索引存儲在更新區(qū)塊本身中。在又一實(shí)施例中,將索引存儲在各邏輯單位的標(biāo)頭中。在另一方面中,在上一個索引更新之后但在下一個索引更新之前寫入的邏輯單位會將其索引信息存儲在各邏輯單位的標(biāo)頭中。依此方式,在電源中斷后,不必在初始化期間執(zhí)行掃描,即可決定最近寫入的邏輯單位的位置。在又一方面中,將區(qū)塊管理成部分循序及部分非循序,指向一個以上邏輯子群組。
控制數(shù)據(jù)完整性與管理根據(jù)本發(fā)明的另一方面,如部分或全部控制數(shù)據(jù)的關(guān)鍵數(shù)據(jù)如果被維持在復(fù)制項(xiàng)中,則保證額外等級的可靠性。復(fù)制的執(zhí)行方式對于采用兩次(two-pass)編程技術(shù)以連續(xù)編程相同組存儲器單元的多位的多狀態(tài)存儲器系統(tǒng)而言,第二次編碼過程中的任何編程錯誤都無法毀損第一次編碼過程建立的數(shù)據(jù)。復(fù)制還有助于檢測寫入中止、檢測誤測(即,兩個副本有良好的ECC但數(shù)據(jù)不同),且可增加額外等級的可靠性。若干數(shù)據(jù)復(fù)制的技術(shù)均已考慮。
在一個實(shí)施例中,在稍早編程編碼過程中編程給定數(shù)據(jù)的兩個副本后,后續(xù)編程編碼過程可避免編碼用于存儲所述兩個副本中至少一個的存儲器單元。依此方式,在后續(xù)編程編碼過程在完成之前中止及毀損稍早編碼過程的數(shù)據(jù)時,所述兩個副本中至少一個不會受到影響。
在另一實(shí)施例中,某一給定數(shù)據(jù)的兩個副本會被存儲于兩個不同的區(qū)塊中,而且所述兩個副本中至多僅有一者的存儲器單元會在后面的編程編碼過程中被編程。
在另一實(shí)施例中,在一編程編碼過程中存儲某一給定數(shù)據(jù)的兩個副本之后,便不再對用于存儲所述兩個副本的存儲器單元組實(shí)施任何進(jìn)一步的編程。在所述存儲器單元組的最終編程編碼過程中來編程所述兩個副本便可達(dá)成此目的。
在又一實(shí)施例中,可以二進(jìn)制編程模式將某一給定數(shù)據(jù)的兩個副本編程到一多狀態(tài)的存儲器之中,致使不會對所述已編程的存儲器單元進(jìn)行任何進(jìn)一步的編程。
在又一實(shí)施例中,對于采用兩次編程技術(shù)以連續(xù)編程相同組存儲器單元的多位的多狀態(tài)存儲器系統(tǒng)而言,會采用容錯碼以編碼多個存儲器狀態(tài),使稍早編程編碼過程所建立的數(shù)據(jù)不會受到后續(xù)編程編碼過程中錯誤的影響。
根據(jù)本發(fā)明的另一方面,在具有區(qū)塊管理系統(tǒng)的非易失性存儲器中,可實(shí)施存儲器區(qū)塊的“控制垃圾收集”或先占式重新定位,以避免發(fā)生大量的更新區(qū)塊均恰巧同時需要進(jìn)行重新定位的情形。例如,在更新用于控制區(qū)塊管理系統(tǒng)操作的控制數(shù)據(jù)時會發(fā)生此情況??刂茢?shù)據(jù)類型的層級可和不同程度的更新頻率共存,導(dǎo)致其關(guān)聯(lián)的更新區(qū)塊需要不同速率的垃圾收集或重新定位。會有一個以上控制數(shù)據(jù)類型的垃圾收集操作同時發(fā)生的特定時候。在極端的情況中,所有控制數(shù)據(jù)類型的更新區(qū)塊的重新定位階段會進(jìn)行整頓,導(dǎo)致所有的更新區(qū)塊都需要同時重新定位。
參考本發(fā)明以下結(jié)合附圖的優(yōu)選實(shí)施例的說明,即可了解本發(fā)明的其它特點(diǎn)及優(yōu)點(diǎn)。
圖1以示意圖顯示適于實(shí)施本發(fā)明的存儲器系統(tǒng)的主要硬件組件。
圖2顯示根據(jù)本發(fā)明的一個優(yōu)選實(shí)施例,經(jīng)組織成扇區(qū)(或元區(qū)塊)的物理群組并為控制器的存儲器管理器所管理的存儲器。
圖3A(i)-3A(iii)根據(jù)本發(fā)明的一個優(yōu)選實(shí)施例,以示意圖顯示邏輯群組及元區(qū)塊間的映射。
圖3B以示意圖顯示邏輯群組及元區(qū)塊間的映射。
圖4顯示元區(qū)塊和物理存儲器中結(jié)構(gòu)的對準(zhǔn)。
圖5A顯示從鏈接不同平面的最小擦除單位所構(gòu)成的元區(qū)塊。
圖5B顯示其中從各平面選擇最小擦除單位(MEU)以鏈接到元區(qū)塊的一個實(shí)施例。
圖5C顯示其中從各平面選擇一個以上MEU以鏈接到元區(qū)塊的另一實(shí)施例。
圖6為如控制器及快閃存儲器中實(shí)施的元區(qū)塊管理系統(tǒng)的示意方塊圖。
圖7A顯示邏輯群組中按循序順序?qū)懭胙蚋聟^(qū)塊的扇區(qū)的范例。
圖7B顯示邏輯群組中按混亂順序?qū)懭牖靵y更新區(qū)塊的扇區(qū)的范例。
圖8顯示由于兩個邏輯地址有中斷的分離主機(jī)寫入操作而在邏輯群組中按循序順序?qū)懭胙蚋聟^(qū)塊的扇區(qū)的范例。
圖9根據(jù)本發(fā)明的一般實(shí)施例,為顯示更新區(qū)塊管理器更新一個邏輯群組的數(shù)據(jù)的程序流程圖。
圖10顯示根據(jù)本發(fā)明的一個優(yōu)選實(shí)施例,更新區(qū)塊管理器更新一個邏輯群組的數(shù)據(jù)的程序流程圖。
圖11A為詳細(xì)顯示關(guān)閉圖10所示的混亂更新區(qū)塊的合并程序的流程圖。
圖11B為詳細(xì)顯示關(guān)閉圖10所示的混亂更新區(qū)塊的壓縮程序的流程圖。
圖12A顯示邏輯群組的所有可能狀態(tài),及其間在各種操作下的可能轉(zhuǎn)變。
圖12B為列出邏輯群組的可能狀態(tài)的表格。
圖13A顯示元區(qū)塊的所有可能狀態(tài),及其間在各種操作下的可能轉(zhuǎn)變。元區(qū)塊是對應(yīng)于邏輯群組的物理群組。
圖13B為列出元區(qū)塊的可能狀態(tài)的表格。
圖14(A)-14(J)為顯示邏輯群組狀態(tài)上及物理元區(qū)塊上各種操作效果的狀態(tài)圖。
圖15顯示用于記錄開啟及關(guān)閉的更新區(qū)塊及配置的已擦除區(qū)塊的配置區(qū)塊列表(ABL)結(jié)構(gòu)的一個優(yōu)選實(shí)施例。
圖16A顯示混亂區(qū)塊索引(CBI)扇區(qū)的數(shù)據(jù)字段。
圖16B顯示記錄在專用元區(qū)塊中的混亂區(qū)塊索引(CBI)扇區(qū)的范例。
圖16C為顯示存取進(jìn)行混亂更新的給定邏輯群組的邏輯扇區(qū)的數(shù)據(jù)的流程圖。
圖16D根據(jù)其中已將邏輯群組分割成子群組的替代性實(shí)施例,為顯示存取進(jìn)行混亂更新的給定邏輯群組的邏輯扇區(qū)的數(shù)據(jù)的流程圖。
圖16E顯示在其中將各邏輯群組分割成多個子群組的實(shí)施例中,混亂區(qū)塊索引(CBI)扇區(qū)及其功能的范例。
圖17A顯示群組地址表(GAT)扇區(qū)的數(shù)據(jù)字段。
圖17B顯示記錄在GAT區(qū)塊中的群組地址表(GAT)扇區(qū)的范例。
圖18為顯示使用及再循環(huán)已擦除區(qū)塊的控制及目錄信息的分布及流程的示意方塊圖。
圖19為顯示邏輯到物理地址轉(zhuǎn)換程序的流程圖。
圖20顯示在存儲器管理的操作過程中,在控制數(shù)據(jù)結(jié)構(gòu)上執(zhí)行的操作層級。
圖21顯示以多個存儲器平面所構(gòu)成的存儲器陣列。
圖22A顯示根據(jù)本發(fā)明的一般實(shí)施例,更新平面對準(zhǔn)的方法的流程圖。
圖22B顯示在圖22A所示的流程圖中存儲更新的步驟的優(yōu)選實(shí)施例。
圖23A顯示不顧平面對準(zhǔn)按循序順序?qū)⑦壿媶挝粚懭胙蚋聟^(qū)塊的范例。
圖23B顯示不顧平面對準(zhǔn)按非循序順序?qū)⑦壿媶挝粚懭牖靵y更新區(qū)塊的范例。
圖24A顯示根據(jù)本發(fā)明的一個優(yōu)選實(shí)施例,具有平面對準(zhǔn)及填補(bǔ)的圖23A的循序更新范例。
圖24B顯示根據(jù)本發(fā)明的一個優(yōu)選實(shí)施例,具有平面對準(zhǔn)及不具有任何填補(bǔ)的圖23B的混亂更新范例。
圖24C顯示根據(jù)本發(fā)明的另一優(yōu)選實(shí)施例,具有平面對準(zhǔn)及填補(bǔ)的圖23B的混亂更新范例。
圖25顯示其中各頁含有兩個用于存儲兩個邏輯單位(如兩個邏輯扇區(qū))的存儲器單位的范例存儲器組織。
圖26A和圖21的存儲器結(jié)構(gòu)相同,只是各頁含有兩個扇區(qū)而非一個。
圖26B顯示圖26A所示的具有以線性圖方式布局的存儲器單元的元區(qū)塊。
圖27顯示的替代性方案如下不用填補(bǔ)要從一個位置復(fù)制到另一個的邏輯單位,即可在更新區(qū)塊中進(jìn)行平面對準(zhǔn)。
圖28顯示其中缺陷區(qū)塊在合并操作期間發(fā)生程序失敗時會在另一個區(qū)塊上重復(fù)合并操作的方案。
圖29以示意圖顯示具有允許足夠時間完成寫入(更新)操作及合并操作的時序或?qū)懭氲却龝r間的主機(jī)寫入操作。
圖30根據(jù)本發(fā)明的一般方案,顯示程序失敗處理的流程圖。
圖31A顯示程序失敗處理的一個實(shí)施例,其中第三(最后的重新定位)區(qū)塊和第二(中斷)區(qū)塊不同。
圖31B顯示程序失敗處理的另一實(shí)施例,其中第三(最后的重新定位)區(qū)塊和第二(中斷)區(qū)塊相同。
圖32A顯示造成合并操作的初始更新操作的流程圖。
圖32B顯示根據(jù)本發(fā)明的一個優(yōu)選實(shí)施例,多階段合并操作的流程圖。
圖33顯示多階段合并操作的第一及最后階段的范例時序。
圖34A顯示其中中斷合并區(qū)塊并非用作更新區(qū)塊而是用作其合并操作已經(jīng)中斷的合并區(qū)塊的例子。
圖34B顯示始于圖34A的多階段合并的第三及最后階段。
圖35A顯示其中維持中斷合并區(qū)塊為接收主機(jī)寫入的更新區(qū)塊而非合并區(qū)塊的情形。
圖35B顯示始于第二情形中圖35A的多階段合并的第三及最后階段。
圖36A顯示應(yīng)用于主機(jī)寫入觸發(fā)關(guān)閉更新區(qū)塊且更新區(qū)塊為循序時的情況的階段性程序錯誤處理方法。
圖36B顯示在更新區(qū)塊的更新的情形下應(yīng)用于(局部區(qū)塊系統(tǒng))的階段性程序錯誤處理方法。
圖36C顯示處理垃圾收集操作的階段性程序錯誤,或不支持映射到元區(qū)塊的邏輯群組的存儲器區(qū)塊管理系統(tǒng)中的清除。
圖37顯示在每N個扇區(qū)寫入相同的邏輯群組后將CBI扇區(qū)寫入關(guān)聯(lián)的混亂索引扇區(qū)區(qū)塊的排程范例。
圖38A顯示直到在預(yù)定數(shù)量的寫入后在其中記錄CBI扇區(qū)時的更新區(qū)塊。
圖38B顯示圖38A的進(jìn)一步在索引扇區(qū)后在其中記錄數(shù)據(jù)頁1、2及4的更新區(qū)塊。
圖38C顯示圖38B的具有另一寫入以觸發(fā)索引扇區(qū)下一個記錄的邏輯扇區(qū)的更新區(qū)塊。
圖39A顯示存儲于混亂更新區(qū)塊中各數(shù)據(jù)扇區(qū)標(biāo)頭的中間寫入的中間索引。
圖39B顯示在寫入的各扇區(qū)標(biāo)頭中存儲中間寫入的中間索引的范例。
圖40顯示在混亂更新區(qū)塊的各數(shù)據(jù)扇區(qū)標(biāo)頭中存儲的混亂索引字段中的信息。
圖41A顯示當(dāng)各存儲器單元存儲兩個位的數(shù)據(jù)時,4狀態(tài)存儲器陣列的閾值電壓分布。
圖41B顯示現(xiàn)有使用格雷碼(Gray code)的2次編程方案。
圖42顯示通過存儲復(fù)制的各扇區(qū)以防衛(wèi)關(guān)鍵數(shù)據(jù)的方式。例如,可將扇區(qū)A、B、C及D存儲在復(fù)制副本中。如在一個扇區(qū)副本中有數(shù)據(jù)毀損,則可以讀取另一個來取代。
圖43顯示其中通常將復(fù)制扇區(qū)存儲在多狀態(tài)存儲器中的非健全性。
圖44A顯示將關(guān)鍵數(shù)據(jù)錯開的復(fù)制副本存儲到多狀態(tài)存儲器的一個實(shí)施例。
圖44B顯示只將關(guān)鍵數(shù)據(jù)的復(fù)制副本存儲到多狀態(tài)存儲器的邏輯上頁的另一實(shí)施例。
圖44C顯示又一以多狀態(tài)存儲器的二進(jìn)制模式存儲關(guān)鍵數(shù)據(jù)的復(fù)制副本的實(shí)施例。
圖45顯示同時將關(guān)鍵數(shù)據(jù)的復(fù)制副本存儲到兩個不同元區(qū)塊的又一實(shí)施例。
圖46A與圖41A相似,其顯示4狀態(tài)存儲器陣列的閾值電壓分布并顯示作為圖46B的參考。
圖46B顯示使用容錯碼同時存儲關(guān)鍵數(shù)據(jù)的復(fù)制副本的又一實(shí)施例。
圖47為顯示兩個數(shù)據(jù)副本的可能狀態(tài)及數(shù)據(jù)有效性的表格。
圖48顯示先占式重新定位存儲控制數(shù)據(jù)的存儲器區(qū)塊的流程圖。
具體實(shí)施例方式
圖1以示意圖顯示適合實(shí)施本發(fā)明的存儲器系統(tǒng)的主要硬件組件。存儲器系統(tǒng)20通常通過主機(jī)接口以主機(jī)10操作。存儲器系統(tǒng)通常形式為存儲卡或內(nèi)嵌式存儲器系統(tǒng)。存儲器系統(tǒng)20包括由控制器100控制操作的存儲器200。存儲器200包含分布于一個或一個以上集成電路芯片上的一個或一個以上陣列的非易失性存儲器單元??刂破?00包括接口110、處理器120、任選協(xié)處理器121、ROM 122(只讀存儲器)、RAM 130(隨機(jī)存取存儲器)、及任選可編程非易失性存儲器124。接口110有一個連接控制器和主機(jī)的組件及另一個連接到存儲器200的組件。存儲于非易失性ROM 122及/或任選非易失性存儲器124中的韌體可提供處理器120程序代碼以實(shí)施控制器100的功能。處理器120或任選協(xié)處理器121可處理錯誤校正碼。在替代性實(shí)施例中,控制器100可通過狀態(tài)機(jī)(未顯示)來實(shí)施。在又一實(shí)施例中,控制器100可在主機(jī)內(nèi)實(shí)施。
邏輯與物理區(qū)塊結(jié)構(gòu)圖2說明根據(jù)本發(fā)明一優(yōu)選實(shí)施例的存儲器,其被組織成數(shù)個物理扇區(qū)群組(或元區(qū)塊)并且由所述控制器的存儲器管理器來管理。所述存儲器200被組織成數(shù)個元區(qū)塊,其中每個元區(qū)塊是一群組的可一起擦除的物理扇區(qū)S0、...、SN-1。
主機(jī)10可在檔案系統(tǒng)或操作系統(tǒng)下執(zhí)行應(yīng)用程序時存取存儲器200。一般來說,所述主機(jī)系統(tǒng)以邏輯扇區(qū)為單位來尋址數(shù)據(jù),其中,例如,各扇區(qū)可含有512字節(jié)的數(shù)據(jù)。還有,主機(jī)通常會以邏輯群集為單位來讀取或?qū)懭胨龃鎯ζ飨到y(tǒng),各邏輯群集由一個或一個以上邏輯扇區(qū)所組成。在有些主機(jī)系統(tǒng)中,可存在任選主機(jī)端存儲器管理器,以執(zhí)行主機(jī)的較低階存儲器管理。在大部分的例子中,在讀取或?qū)懭氩僮髌陂g,主機(jī)10實(shí)質(zhì)上會對存儲器系統(tǒng)20發(fā)出指令,以讀取或?qū)懭牒幸淮哂羞B續(xù)地址的數(shù)據(jù)邏輯扇區(qū)的程序段。
一存儲器端存儲器管理器被實(shí)施在所述存儲器系統(tǒng)20的控制器100之中,用以管理于所述快閃存儲器200的元區(qū)塊中存儲與檢索主機(jī)邏輯扇區(qū)的數(shù)據(jù)。在所述優(yōu)選實(shí)施例中,所述存儲器管理器含有數(shù)個軟件模塊,用于管理所述元區(qū)塊的擦除操作、讀取操作以及寫入操作。所述存儲器管理器還會在所述快閃存儲器200及所述控制器RAM 130之中維護(hù)和其操作相關(guān)的系統(tǒng)控制與目錄數(shù)據(jù)。
圖3A(i)-3A(iii)示意性說明根據(jù)本發(fā)明一優(yōu)選實(shí)施例介于一邏輯群組與一元區(qū)塊間的映射。所述物理存儲器的元區(qū)塊具有N個物理扇區(qū),用于存儲一邏輯群組的N個邏輯扇區(qū)數(shù)據(jù)。圖3A(i)所示的是來自邏輯群組LGi的數(shù)據(jù),其中所述邏輯扇區(qū)呈現(xiàn)連續(xù)的邏輯順序0、1、...、N-1。圖3A(ii)所示的是正以相同的邏輯順序被存儲在所述元區(qū)塊中的相同數(shù)據(jù)。當(dāng)依此方式存儲時,所述元區(qū)塊便是所謂的“循序式”。一般來說,所述元區(qū)塊可能會具有以不同順序存儲的數(shù)據(jù),在所述情況中,所述元區(qū)塊則是所謂的“非循序式”或“混亂式”。
在邏輯群組的最低地址及其映射的元區(qū)塊的最低地址之間可能會有偏移。此時,邏輯扇區(qū)地址會在所述元區(qū)塊內(nèi)以環(huán)狀的方式從所述邏輯群組的底部反繞回至頂端。例如,在圖3A(iii)中,所述元區(qū)塊會在其始于邏輯扇區(qū)k的數(shù)據(jù)的第一位置中進(jìn)行存儲。在到達(dá)最后邏輯扇區(qū)N-1時,元區(qū)塊會繞回至扇區(qū)0,最后在其最后物理扇區(qū)中存儲和邏輯扇區(qū)k-1關(guān)聯(lián)的數(shù)據(jù)。在優(yōu)選實(shí)施例中,會使用頁標(biāo)記來識別任何偏移,例如,識別在元區(qū)塊的第一物理扇區(qū)中所存儲的數(shù)據(jù)的起始邏輯扇區(qū)地址。當(dāng)兩個區(qū)塊僅相差一個頁標(biāo)記時,則會認(rèn)為所述兩個區(qū)塊是以相同的順序來存儲其邏輯扇區(qū)。
圖3B示意性說明介于多個邏輯群組與多個元區(qū)塊間的映射。每個邏輯群組均映射到一唯一的元區(qū)塊,除了其中的數(shù)據(jù)正在被更新的少數(shù)邏輯群組以外。一邏輯群組在被更新之后,其可能會映射到一不同的元區(qū)塊??蓪⒂成湫畔⒕S持在一組邏輯對物理目錄中,稍后將會詳細(xì)說明。
也考慮其它類型的邏輯群組到元區(qū)塊映射關(guān)系。舉例來說,由Alan Sinclair在和本申請案同一天申請的共同待審及共同擁有的美國專利申請案,標(biāo)題為“AdaptiveMetablocks”之中便揭示具有可變大小的元區(qū)塊。本文以引用的方式并入所述共同待審申請案全部的揭示內(nèi)容。
本發(fā)明的一個特點(diǎn)在于系統(tǒng)以單一邏輯分割操作,及存儲器系統(tǒng)的整個邏輯地址范圍中的邏輯扇區(qū)群組均以相同的方式來處理。例如,可將含有系統(tǒng)數(shù)據(jù)的扇區(qū)及含有使用者數(shù)據(jù)的扇區(qū)分布在邏輯地址空間中的任何地方。
與先前技術(shù)的系統(tǒng)不同的是,并不存在系統(tǒng)扇區(qū)(即,有關(guān)檔案配置表、目錄或子目錄的扇區(qū))的特別分割或分區(qū),以定位在可能含有高頻率及小大小的更新數(shù)據(jù)的邏輯地址空間扇區(qū)中。而是,更新扇區(qū)的邏輯群組的本方案會有效處理為系統(tǒng)扇區(qū)典型且為檔案數(shù)據(jù)典型的存取模式。
圖4說明元區(qū)塊和物理存儲器中結(jié)構(gòu)的對準(zhǔn)。快閃存儲器包含可當(dāng)作一個單元一起擦除的存儲器單元的區(qū)塊。此種擦除區(qū)塊為快閃存儲器的最小的擦除單位或存儲器的最小可擦除單位(MEU)。最小擦除單位是存儲器的硬件設(shè)計參數(shù),不過,在一些支持多個MEU擦除的存儲器系統(tǒng)中,也可以設(shè)定包含一個以上MEU的“超級MEU”。對于快閃EEPROM,一個MEU可包含一個扇區(qū),但優(yōu)選包含多個扇區(qū)。在所示的范例中,其具有M個扇區(qū)。在優(yōu)選實(shí)施例中,各扇區(qū)可以存儲512字節(jié)的數(shù)據(jù)且具有使用者數(shù)據(jù)部分及用于存儲器系統(tǒng)或額外開銷數(shù)據(jù)的標(biāo)頭部分。如果元區(qū)塊是以P個MEU所構(gòu)成且各MEU含有M個扇區(qū),則各元區(qū)塊將具有N=P*M個扇區(qū)。
在系統(tǒng)層級,元區(qū)塊代表存儲器位置的群組,如,可一起擦除的扇區(qū)。快閃存儲器的物理地址空間會被視為一組元區(qū)塊,其中元區(qū)塊是最小的擦除單位。在本份說明書內(nèi),“元區(qū)塊”與“區(qū)塊”詞語是同義詞,用來定義媒體管理在系統(tǒng)層級的最小擦除單位,而“最小擦除單位”或MEU一詞則用來表示快閃存儲器的最小擦除單位。
鏈接數(shù)個最小擦除單位(MEU)以構(gòu)成元區(qū)塊為了最大化編程速度及擦除速度,盡可能利用并行方式,其通過配置多個要并行編程的信息頁(位于多個MEU中),及配置多個要并行擦除的MEU。
在快閃存儲器中,一個頁是可在單一操作中一起編程的存儲器單元的群組。一個頁可包含一個或一個以上扇區(qū)。此外,可將存儲器陣列分割成一個以上平面,其中一次只能編程或擦除一個平面內(nèi)的一個MEU。最后,可在一個或一個以上存儲器芯片中分布各平面。
在快閃存儲器中,MEU可包含一個或一個以上頁。可將快閃存儲器芯片內(nèi)的數(shù)個MEU按平面來組織。由于可同時編程或擦除各平面的一個MEU,因此從各平面選擇一個MEU以形成多個MEU元區(qū)塊(請見下文圖5B)是有利的。
圖5A顯示從鏈接不同平面的最小擦除單位所構(gòu)成的元區(qū)塊。各元區(qū)塊(例如MB0、MB1、...)均以存儲器系統(tǒng)的不同平面的數(shù)個MEU所構(gòu)成,其中不同平面可分布在一個或一個以上芯片中。圖2所示的元區(qū)塊鏈接管理器170可管理各元區(qū)塊的MEU的鏈接。如果MEU之一沒有失敗,在初始格式化程序期間設(shè)定各元區(qū)塊,并在整個系統(tǒng)壽命中保留其組成的MEU。
圖5B顯示從各平面選擇一個最小擦除單位(MEU)以鏈接成元區(qū)塊的一個實(shí)施例。
圖5C顯示其中從各平面選擇一個以上MEU以鏈接成元區(qū)塊的另一實(shí)施例。在另一實(shí)施例中,可從各平面選擇一個以上MEU以形成超級MEU。例如,舉例來說,超級MEU可能是由兩個MEU構(gòu)成的。在這種情形下,會采取一次以上編碼過程以進(jìn)行讀取或?qū)懭氩僮鳌?br>
由Carlos Gonzales等人在和本發(fā)明同一天申請的共同待審及共同擁有的美國專利申請案,標(biāo)題為“Adaptive Deterministic Grouping of Blocks into Multi-Block Structures”之中也揭示將MEU鏈接及再鏈接成元區(qū)塊。本文以引用的方式并入所述共同待審申請案全部的揭示內(nèi)容。
元區(qū)塊管理圖6為如控制器及快閃存儲器中建構(gòu)的元區(qū)塊管理系統(tǒng)的示意方塊圖。元區(qū)塊管理系統(tǒng)包含實(shí)施在控制器100中的各種功能模塊,并在依層級式分布于快閃存儲器200及控制器RAM 130的表格及列表中維持各種控制數(shù)據(jù)(包括目錄數(shù)據(jù))。建構(gòu)在控制器100中的功能模塊包括接口模塊110、邏輯對物理地址轉(zhuǎn)換模塊140、更新區(qū)塊管理器模塊150、擦除區(qū)塊管理器模塊160及元區(qū)塊鏈接管理器170。
接口110允許元區(qū)塊管理系統(tǒng)接口連接到主機(jī)系統(tǒng)。邏輯對物理地址轉(zhuǎn)換模塊140將主機(jī)的邏輯地址映射到物理存儲器位置。更新區(qū)塊管理器模塊150管理存儲器中給定的數(shù)據(jù)邏輯群組的數(shù)據(jù)更新操作。已擦除區(qū)塊管理器160管理元區(qū)塊的擦除操作及其用于存儲新信息的配置。元區(qū)塊鏈接管理器170管理扇區(qū)最小可擦除區(qū)塊的子群組的鏈接以構(gòu)成給定的元區(qū)塊。這些模塊將在其個別段落中詳細(xì)說明。
在操作期間,所述元區(qū)塊管理系統(tǒng)會產(chǎn)生且配合控制數(shù)據(jù)(例如地址、控制與狀態(tài)信息)來運(yùn)作。由于許多控制數(shù)據(jù)往往是經(jīng)常變更的小型數(shù)據(jù),因此無法在具有大型區(qū)塊結(jié)構(gòu)的快閃存儲器中隨時有效存儲及維持。為了在非易失性快閃存儲器中存儲比較靜態(tài)的控制數(shù)據(jù),同時在控制器RAM中尋找數(shù)量較少的比較有變化的控制數(shù)據(jù),以進(jìn)行更有效的更新及存取,會采用層級式與分布式的方案。在發(fā)生電源關(guān)閉或故障時,此方案允許掃描非易失性存儲器中一小組的控制數(shù)據(jù),以在易失性控制器RAM中快速重建控制數(shù)據(jù)。這之所以可行是因?yàn)楸景l(fā)明可限制和給定邏輯群組的數(shù)據(jù)的可能活動相關(guān)聯(lián)的區(qū)塊數(shù)量。依此方式,即可限制掃描。此外,將一些需要持久性的控制數(shù)據(jù)存儲在按扇區(qū)更新的非易失性元區(qū)塊中,其中每次更新將導(dǎo)致記錄一個取代先前扇區(qū)的新扇區(qū)。對控制數(shù)據(jù)采用扇區(qū)索引方案以在元區(qū)塊中記錄按扇區(qū)的更新。
非易失性快閃存儲器200存儲大量相對較靜態(tài)的控制數(shù)據(jù)。這包括群組地址表(GAT)210、混亂區(qū)塊索引(CBI)220、已擦除的區(qū)塊列表(EBL)230及MAP 240。GAT 210可記錄扇區(qū)的邏輯群組及其對應(yīng)元區(qū)塊之間的映射。除非經(jīng)受更新,否則所述映射不會改變。CBI 220可記錄更新期間邏輯上非循序扇區(qū)的映射。EBL 230可記錄已經(jīng)擦除的元區(qū)塊的集區(qū)。MAP 240是顯示快閃存儲器中所有元區(qū)塊的擦除狀態(tài)的位圖。
易失性控制器RAM 130存儲一小部分經(jīng)常變更及存取的控制數(shù)據(jù)。這包括配置區(qū)塊列表(ABL)134及清除區(qū)塊列表(CBL)136。ABL 134可記錄元區(qū)塊用于記錄更新數(shù)據(jù)的配置,而CBL 136可記錄已解除配置及已擦除的元區(qū)塊。在優(yōu)選實(shí)施例中,RAM 130可當(dāng)作存儲在快閃存儲器200的控制數(shù)據(jù)的高速緩存。
更新區(qū)塊管理器更新區(qū)塊管理器150(如圖2所示)處理邏輯群組的更新。根據(jù)本發(fā)明的一方面,會為進(jìn)行更新的扇區(qū)的各邏輯群組配置一用于記錄更新數(shù)據(jù)的專用更新元區(qū)塊。在優(yōu)選實(shí)施例中,會將邏輯群組的一個或一個以上扇區(qū)的任何程序段記錄在更新區(qū)塊中。可管理更新區(qū)塊以接收按循序順序或非循序(又稱為“混亂”)順序的更新數(shù)據(jù)。混亂更新區(qū)塊允許在邏輯群組內(nèi)按任何順序更新扇區(qū)數(shù)據(jù),并可任意重復(fù)個別扇區(qū)。尤其,不必重新定位任何數(shù)據(jù)扇區(qū),循序更新區(qū)塊可變成混亂更新區(qū)塊。混亂數(shù)據(jù)更新不需要任何預(yù)定的區(qū)塊配置;任何邏輯地址的非循序?qū)懭肟杀蛔詣蛹{入。因此,與現(xiàn)有技術(shù)系統(tǒng)不同的是,并不必特別處理邏輯群組的各個更新程序段究竟是邏輯循序還是非循序的。一般更新區(qū)塊只用來按照主機(jī)請求的順序記錄各種程序段。例如,即使主機(jī)系統(tǒng)數(shù)據(jù)或系統(tǒng)控制數(shù)據(jù)傾向于依混亂方式加以更新,仍不必以和主機(jī)使用者數(shù)據(jù)的不同方式來處理邏輯地址空間對應(yīng)于主機(jī)系統(tǒng)數(shù)據(jù)的區(qū)域。
優(yōu)選將扇區(qū)的完整邏輯群組的數(shù)據(jù)按邏輯上循序順序存儲在單一元區(qū)塊中。依此方式,可預(yù)定義已存儲的邏輯扇區(qū)的索引。當(dāng)元區(qū)塊按照預(yù)定義的順序存儲給定邏輯群組的所有扇區(qū)時,其可說是“完整”。至于更新區(qū)塊,當(dāng)其最后按邏輯上循序順序填滿更新數(shù)據(jù)時,則更新區(qū)塊將成為隨時可取代原始元區(qū)塊的已更新的完整元區(qū)塊。另一方面,如果更新區(qū)塊按邏輯上與完整區(qū)塊不同的順序填滿更新數(shù)據(jù),更新區(qū)塊為非循序或混亂更新區(qū)塊,則必須進(jìn)一步處理順序紊亂的程序段,以便最后能按與完整區(qū)塊相同的順序來存儲邏輯群組的更新數(shù)據(jù)。在優(yōu)選的情形下,其在單一元區(qū)塊中是按照邏輯上循序的順序。進(jìn)一步的處理涉及將更新區(qū)塊中已更新的扇區(qū)和原始區(qū)塊中未變更的扇區(qū)合并到又一個更新元區(qū)塊。然后合并的更新區(qū)塊將按照邏輯上循序的順序并能夠用來取代原始區(qū)塊。在一些預(yù)定條件下,合并程序之前會有一個或一個以上壓縮程序。壓縮程序只是將混亂更新區(qū)塊的扇區(qū)重新記錄成取代的混亂更新區(qū)塊,同時除去任何已由相同邏輯扇區(qū)的后續(xù)更新過時的復(fù)制邏輯扇區(qū)。
更新方案允許同時執(zhí)行多個多達(dá)預(yù)定義極大值的更新執(zhí)行緒。各執(zhí)行緒為使用其專用更新元區(qū)塊進(jìn)行更新的邏輯群組。
循序數(shù)據(jù)更新在先更新屬于邏輯群組的數(shù)據(jù)時,會配置元區(qū)塊及將其專用為邏輯群組的更新數(shù)據(jù)的更新區(qū)塊。當(dāng)從主機(jī)接收寫入邏輯群組的一個或一個以上扇區(qū)的程序段的指令時(現(xiàn)有的元區(qū)塊已經(jīng)存儲所有完整扇區(qū)),會配置更新區(qū)塊。對于第一主機(jī)寫入操作,會將第一程序段的數(shù)據(jù)記錄在更新區(qū)塊上。由于各主機(jī)寫入是具有連續(xù)邏輯地址的一個或一個以上扇區(qū)的一個程序段,因此會遵循第一更新在特性上永遠(yuǎn)循序。在后續(xù)的主機(jī)寫入中,會按照從主機(jī)接收的順序?qū)⑾嗤壿嬋航M內(nèi)的更新程序段記錄在更新區(qū)塊中。一個區(qū)塊繼續(xù)被管理為循序更新區(qū)塊,而關(guān)聯(lián)邏輯群組內(nèi)由主機(jī)更新的扇區(qū)維持邏輯上循序。在此邏輯群組中更新的所有扇區(qū)會被寫入此循序更新區(qū)塊,直到區(qū)塊關(guān)閉或轉(zhuǎn)換為混亂更新區(qū)塊。
圖7A顯示由于兩個分開的主機(jī)寫入操作而按循序順序?qū)懭胙蚋聟^(qū)塊的邏輯群組中的扇區(qū),而邏輯群組的原始區(qū)塊中對應(yīng)的扇區(qū)變成過時的范例。在主機(jī)寫入操作#1中,會更新邏輯扇區(qū)LS5-LS8的數(shù)據(jù)。更新成為LS5′-LS8′的數(shù)據(jù)會被記錄在新配置的專用更新區(qū)塊中。
為了方便起見,將邏輯群組中要更新的第一扇區(qū)記錄在始于第一物理扇區(qū)位置的專用更新區(qū)塊中。一般而言,要更新的第一邏輯扇區(qū)不一定是群組的邏輯第一扇區(qū),因此,在邏輯群組的起點(diǎn)與更新區(qū)塊的起點(diǎn)之間會有偏移。此偏移稱為“頁標(biāo)記”,如先前結(jié)合圖3A所述。后續(xù)扇區(qū)將按照邏輯上循序的順序加以更新。在寫入邏輯群組的最后扇區(qū)時,群組地址會繞回且寫入序列會從群組的第一扇區(qū)繼續(xù)。
在主機(jī)寫入操作#2中,更新邏輯扇區(qū)LS9-LS12中數(shù)據(jù)的程序段。更新成為LS9′-LS12′的數(shù)據(jù)會被記錄在直接在最后寫入結(jié)束處之后的位置中的專用更新區(qū)塊。圖中顯示兩個主機(jī)寫入如下按邏輯上循序順序記錄在更新區(qū)塊中的更新數(shù)據(jù),即LS5′-LS12′。更新區(qū)塊可視為循序更新區(qū)塊,因其已按邏輯上循序的順序填入。記錄在更新區(qū)塊中的更新數(shù)據(jù)可使得原始區(qū)塊中對應(yīng)的數(shù)據(jù)過時。
混亂數(shù)據(jù)更新當(dāng)關(guān)聯(lián)的邏輯群組內(nèi)由主機(jī)更新的任何扇區(qū)為邏輯上非循序時,可為現(xiàn)有的循序更新區(qū)塊啟始混亂更新區(qū)塊管理?;靵y更新區(qū)塊是數(shù)據(jù)更新區(qū)塊的形式,其中關(guān)聯(lián)邏輯群組內(nèi)的邏輯扇區(qū)可按任何順序進(jìn)行更新并可重復(fù)任意次。其可通過以下方式建立在主機(jī)寫入的扇區(qū)是邏輯上非循序時,從循序更新區(qū)塊轉(zhuǎn)換成受更新的邏輯群組內(nèi)先前寫入的扇區(qū)。所有其后在此邏輯群組中更新的扇區(qū)會被寫入混亂更新區(qū)塊中的下一個可用扇區(qū)位置,無論其在群組內(nèi)的邏輯扇區(qū)地址為何。
圖7B顯示由于五個分開的主機(jī)寫入操作而按混亂順序?qū)懭牖靵y更新區(qū)塊的邏輯群組的扇區(qū),而邏輯群組的原始區(qū)塊中被取代的扇區(qū)及混亂更新區(qū)塊中被復(fù)制的扇區(qū)變成過時的范例。在主機(jī)寫入操作#1中,會更新存儲于原始元區(qū)塊的給定邏輯群組的邏輯扇區(qū)LS10-LS11。已更新的邏輯扇區(qū)LS10′-LS11′會被存儲到新配置的更新區(qū)塊中。此時,更新區(qū)塊為循序的更新區(qū)塊。在主機(jī)寫入操作#2中,會將邏輯扇區(qū)LS5-LS6更新成為LS5′-LS6′且將其記錄在緊接上一次寫入之后的位置的更新區(qū)塊中。這可將循序的更新區(qū)塊轉(zhuǎn)換為混亂的更新區(qū)塊。在主機(jī)寫入操作#3中,再次更新邏輯扇區(qū)LS10且將其在更新區(qū)塊的下一個位置中記錄成LS10″。此時,更新區(qū)塊中的LS10″取代先前記錄中的LS10′,而LS10′又取代原始區(qū)塊中的LS10。在主機(jī)寫入操作#4中,再次更新邏輯扇區(qū)LS10中的數(shù)據(jù)且將其在更新區(qū)塊的下一個位置中記錄成LS10。因此,LS10現(xiàn)在是邏輯扇區(qū)LS10的最后且唯一有效的數(shù)據(jù)。在主機(jī)寫入操作#5中,更新邏輯扇區(qū)LS30中的數(shù)據(jù)且將其在更新區(qū)塊中記錄成LS30′。因此,此范例顯示可以按照任何順序及任意重復(fù),將一邏輯群組內(nèi)的邏輯扇區(qū)寫入一混亂更新區(qū)塊中。
強(qiáng)制循序更新圖8顯示由于兩個在邏輯地址上有中斷的分開的主機(jī)寫入操作而在邏輯群組中按循序順序?qū)懭胙蚋聟^(qū)塊的扇區(qū)的范例。在主機(jī)寫入#1中,將邏輯扇區(qū)LS5-LS8的更新數(shù)據(jù)在專用更新區(qū)塊中記錄成LS5′-LS8′。在主機(jī)寫入#2中,將邏輯扇區(qū)LS14-LS16中的更新數(shù)據(jù)在上一次寫入之后的更新區(qū)塊中記錄成LS14′-LS16′。然而,在LS8與LS14之間有地址跳躍,且主機(jī)寫入#2通常會使更新區(qū)塊成為非循序。由于地址跳躍不是很多,一個選項(xiàng)是在執(zhí)行主機(jī)寫入#2之前將原始區(qū)塊的中間扇區(qū)的數(shù)據(jù)復(fù)制到更新區(qū)塊,藉此先執(zhí)行填補(bǔ)操作(#2A)。依此方式,即可保存更新區(qū)塊的循序特性。
圖9顯示根據(jù)本發(fā)明的一般實(shí)施例,更新區(qū)塊管理器更新一個邏輯群組的數(shù)據(jù)的程序流程圖。所述更新程序包含以下步驟步驟260所述存儲器被組織成區(qū)塊,每個區(qū)塊均被分割成可一起擦除的存儲器單位,每個存儲器單位用于存儲一數(shù)據(jù)邏輯單位。
步驟262所述數(shù)據(jù)被組織成邏輯群組,每個邏輯群組均被分割成邏輯單位。
步驟264在標(biāo)準(zhǔn)的情形下,根據(jù)第一指定順序,優(yōu)選以邏輯上循序的順序,將邏輯群組的所有邏輯單位存儲在原始區(qū)塊的存儲器單位中。依此方式,即可得知存取區(qū)塊中個別邏輯單位的索引。
步驟270對于給定邏輯群組(如,LGx)的數(shù)據(jù),請求更新LGx內(nèi)的邏輯單位。(以邏輯單位更新為例。一般而言,更新將是由LGx內(nèi)一個或一個以上連續(xù)邏輯單位所組成的程序段。)步驟272請求的更新邏輯單位將會存儲在專用于記錄LGx的更新的第二區(qū)塊中。記錄順序是根據(jù)第二順序,通常是請求更新的順序。本發(fā)明的一個特點(diǎn)允許將更新區(qū)塊設(shè)定為初始一般按照邏輯上循序或混亂順序記錄數(shù)據(jù)。因此根據(jù)第二順序,第二區(qū)塊可以是循序區(qū)塊或混亂區(qū)塊。
步驟274當(dāng)程序循環(huán)返回到步驟270時,第二區(qū)塊繼續(xù)記錄所請求的邏輯單位。在關(guān)閉的預(yù)定條件成形時將會關(guān)閉第二區(qū)塊,以接收進(jìn)一步更新。在此情形下,程序繼續(xù)進(jìn)行到步驟276。
步驟276判斷所述已關(guān)閉的第二區(qū)塊是否以和原始區(qū)塊相同的順序來記錄其更新邏輯單位。當(dāng)所述兩個區(qū)塊記錄邏輯單位僅相差一頁標(biāo)記時,所述兩個區(qū)塊便會被視為具有相同的順序,如結(jié)合圖3A所述。如果這兩個區(qū)塊具有相同的順序,程序繼續(xù)進(jìn)行到步驟280,否則,必須在步驟290執(zhí)行廢棄某種項(xiàng)目收集。
步驟280由于第二區(qū)塊具有和第一區(qū)塊相同的順序,因此其可用來取代原始的第一區(qū)塊。然后,更新程序在步驟299結(jié)束。
步驟290從第二區(qū)塊(更新區(qū)塊)及第一區(qū)塊(原始區(qū)塊)搜集給定邏輯群組的各邏輯單位的最新版本。然后按照和第一區(qū)塊相同的順序?qū)⒔o定邏輯群組的已合并的邏輯單位寫入第三區(qū)塊。
步驟292由于第三區(qū)塊(合并的區(qū)塊)具有和第一區(qū)塊相同的順序,因此其可用來取代原始的第一區(qū)塊。然后,更新程序在步驟299結(jié)束。
步驟299當(dāng)停閉程序建立完整的更新區(qū)塊時,所述區(qū)塊會變成給定邏輯群組的新標(biāo)準(zhǔn)區(qū)塊。將會終止此邏輯群組的更新執(zhí)行緒。
圖10顯示根據(jù)本發(fā)明的一個優(yōu)選實(shí)施例,更新區(qū)塊管理器更新一個邏輯群組的數(shù)據(jù)的程序流程圖。更新程序包含以下步驟步驟310對于給定邏輯群組(如,LGx)的數(shù)據(jù),會請求更新LGx內(nèi)的邏輯扇區(qū)。(以扇區(qū)更新為例。一般而言,更新將是由LGx內(nèi)一個或一個以上連續(xù)邏輯扇區(qū)所組成的程序段。)步驟312如果LGx專用的更新區(qū)塊尚未存在,繼續(xù)進(jìn)行到步驟410以啟始邏輯群組的新的更新執(zhí)行緒。這可通過以下方式來完成配置記錄邏輯群組的更新數(shù)據(jù)專用的更新區(qū)塊。如果已經(jīng)有開啟的更新區(qū)塊,則繼續(xù)進(jìn)行到步驟314,開始將更新扇區(qū)記錄到更新區(qū)塊上。
步驟314如果目前更新區(qū)塊已經(jīng)混亂(即,非循序),則直接繼續(xù)進(jìn)行到步驟510,以將請求的更新扇區(qū)記錄到混亂更新區(qū)塊上。如果目前更新區(qū)塊為循序,則繼續(xù)進(jìn)行到步驟316,以處理循序更新區(qū)塊。
步驟316本發(fā)明的一個特點(diǎn)是允許將更新區(qū)塊初始設(shè)置成一般以邏輯循序或混亂順序的方式來記錄數(shù)據(jù)。不過,因?yàn)樗鲞壿嬋航M最終會將其數(shù)據(jù)以邏輯循序的順序存儲于元區(qū)塊中,所以希望盡可能保持所述更新區(qū)塊的循序狀態(tài)。接著,當(dāng)關(guān)閉一更新區(qū)塊以進(jìn)行進(jìn)一步更新時將會需要較少的處理,因?yàn)椴⒉恍枰M(jìn)行垃圾收集。
因此,判斷所請求的更新是否遵循更新區(qū)塊的目前循序順序。如果更新循序遵循,則繼續(xù)進(jìn)行到步驟510以執(zhí)行循序更新,且更新區(qū)塊將維持循序。另一方面,如果更新未循序遵循(混亂更新),則其會在未采取任何動作時將循序更新區(qū)塊轉(zhuǎn)換成混亂更新區(qū)塊。
在一個實(shí)施例中,不會進(jìn)行任何動作來挽救此情況,然后程序直接進(jìn)行到步驟370,其中允許更新將更新區(qū)塊變成混亂更新區(qū)塊。
任選強(qiáng)制循序程序在另一項(xiàng)實(shí)施例中,會任選執(zhí)行強(qiáng)制循序程序步驟320,以盡可能因顧及懸置的混亂更新而保存循序更新區(qū)塊。其中有兩種情況,這兩種情況都需要復(fù)制原始區(qū)塊的遺失扇區(qū),以維持更新區(qū)塊上記錄的邏輯扇區(qū)的循序順序。第一種情況是其中更新可建立短的地址跳躍。第二種情況是提早停閉更新區(qū)塊以將其保持循序。強(qiáng)制循序程序步驟320包含以下子步驟步驟330如果更新建立的邏輯地址跳躍未大于預(yù)定的數(shù)量CB,則程序繼續(xù)進(jìn)行到步驟350的強(qiáng)制循序更新程序,否則程序繼續(xù)進(jìn)行到步驟340,以考慮其是否適合進(jìn)行強(qiáng)制循序停閉。
步驟340如果未填充的物理扇區(qū)數(shù)量超過預(yù)定的設(shè)計參數(shù)CC(其代表值為更新區(qū)塊大小的一半),則更新區(qū)塊相對未被使用,因此不會提早關(guān)閉。程序繼續(xù)進(jìn)行到步驟370,且更新區(qū)塊會成為混亂。另一方面,如果實(shí)質(zhì)上已填充更新區(qū)塊,則將其視為已經(jīng)充分利用,因此進(jìn)入步驟360以進(jìn)行強(qiáng)制循序停閉。
步驟350只要地址跳躍未超過預(yù)定的數(shù)量CB,強(qiáng)制循序更新便允許目前循序更新區(qū)塊維持循序。實(shí)質(zhì)上,會復(fù)制更新區(qū)塊的關(guān)聯(lián)原始區(qū)塊的扇區(qū),以填充地址跳躍跨越的間隙。因此,在繼續(xù)進(jìn)行到步驟510之前,會以中間地址的數(shù)據(jù)填補(bǔ)循序更新區(qū)塊,以循序記錄目前的更新。
步驟360如果目前循序更新區(qū)塊在實(shí)質(zhì)上已經(jīng)被填充,而非由懸置的混亂更新轉(zhuǎn)換為混亂更新區(qū)塊,則強(qiáng)制循序允許目前循序更新區(qū)塊成為停閉狀態(tài)而不是通過待決混亂更新轉(zhuǎn)換成混亂區(qū)塊。混亂或非循序更新的定義是具有以下項(xiàng)目的更新不為上述地址跳躍例外所涵蓋的正向地址轉(zhuǎn)變、反向地址轉(zhuǎn)變或地址重復(fù)。為了防止循序更新區(qū)塊為混亂更新所轉(zhuǎn)換,會通過復(fù)制更新區(qū)塊的關(guān)聯(lián)的原始部分過時區(qū)塊的扇區(qū)來填充更新區(qū)塊的未寫入扇區(qū)位置。然后完全過時原始區(qū)塊且可將其擦除?,F(xiàn)在,目前的更新區(qū)塊具有完整組的邏輯扇區(qū),然后停閉成為取代原始元區(qū)塊的完整元區(qū)塊。然后,程序繼續(xù)進(jìn)行到步驟430以在其位置配置更新區(qū)塊,以接受在步驟310中首先請求的懸置扇區(qū)更新的記錄。
轉(zhuǎn)換成混亂更新區(qū)塊步驟370當(dāng)懸置的更新未按循序順序且可有可無時,如果無法滿足強(qiáng)制循序條件,則在程序繼續(xù)進(jìn)行到步驟510時,通過允許在更新區(qū)塊上記錄具有非循序地址的懸置更新扇區(qū),以允許循序更新區(qū)塊轉(zhuǎn)換為混亂更新區(qū)塊。如果最大數(shù)量的混亂更新區(qū)塊存在,則在允許轉(zhuǎn)換進(jìn)行之前,必須關(guān)閉最久未存取的混亂更新區(qū)塊;因而不會超過最大數(shù)量的混亂區(qū)塊。最久未存取的混亂更新區(qū)塊的識別和步驟420所述的一般情形相同,但僅限于混亂更新區(qū)塊。此時關(guān)閉混亂更新區(qū)塊可通過如步驟550所述的合并來達(dá)成。
配置受系統(tǒng)限制的新更新區(qū)塊步驟410將擦除元區(qū)塊配置為更新區(qū)塊的程序始于決定是否超過預(yù)定的系統(tǒng)限制。由于資源有限,存儲器管理系統(tǒng)通常允許可同時存在預(yù)定最大數(shù)量CA個更新區(qū)塊。此限制是循序更新區(qū)塊及混亂更新區(qū)塊的總數(shù),也是設(shè)計參數(shù)。在一項(xiàng)優(yōu)選實(shí)施例中,此限制為(例如)最大8個更新區(qū)塊。還有,由于系統(tǒng)資源的較高需求,在可同時開啟的混亂更新區(qū)塊的最大數(shù)量上還有對應(yīng)的預(yù)定限制(如,4個)。
因此,在已經(jīng)配置CA個更新區(qū)塊時,則只有在關(guān)閉現(xiàn)有的配置請求之一后,才能滿足下一個配置請求。程序繼續(xù)進(jìn)行到步驟420。當(dāng)開啟的更新區(qū)塊數(shù)量小于CA時,程序直接進(jìn)行到步驟430。
步驟420在超過更新區(qū)塊的最大數(shù)量CA時,關(guān)閉最久未存取的更新區(qū)塊并執(zhí)行垃圾收集。最久未存取的更新區(qū)塊會被識別為和最久未存取的邏輯區(qū)塊相關(guān)聯(lián)的更新區(qū)塊。為了決定最久未存取的區(qū)塊,存取包括邏輯扇區(qū)的寫入及選擇性讀取。按照存取的順序維持開啟更新區(qū)塊的列表;初始化時,不會假設(shè)任何存取順序。更新區(qū)塊的關(guān)閉在更新區(qū)塊為循序時,將按照結(jié)合步驟360及步驟530所述的相同程序,在更新區(qū)塊為混亂時,將按照結(jié)合步驟540所述的相同程序。此關(guān)閉可挪出空間以在步驟430配置新的更新區(qū)塊。
步驟430配置一新的元區(qū)塊作為所述給定邏輯群組LGX專屬的更新區(qū)塊便可滿足所述配置要求。接著,程序繼續(xù)進(jìn)行到步驟510。
在更新區(qū)塊上記錄更新數(shù)據(jù)步驟510將請求的更新扇區(qū)記錄在更新區(qū)塊的下一個可用物理位置上。然后,程序繼續(xù)進(jìn)行到步驟520,決定更新區(qū)塊是否準(zhǔn)備停閉就緒。
更新區(qū)塊停閉步驟520如果更新區(qū)塊還有接受附加更新的空間,則繼續(xù)進(jìn)行到步驟570。否則繼續(xù)進(jìn)行到步驟522以停閉更新區(qū)塊。在目前請求的寫入嘗試寫入多于區(qū)塊所有空間的邏輯扇區(qū)時,有兩項(xiàng)填滿更新區(qū)塊的可能實(shí)施例。在第一實(shí)施例中,會將寫入請求分成兩個部分,其中第一部分可寫入直到區(qū)塊的最后物理扇區(qū)。然后關(guān)閉區(qū)塊且將寫入的第二部分處理為下一個請求的寫入。在另一個實(shí)施例中,會在區(qū)塊填補(bǔ)其余扇區(qū)時保留請求的寫入,然后再將其關(guān)閉。請求的寫入會被處理為下一個請求的寫入。
步驟522如果更新區(qū)塊為循序,則繼續(xù)進(jìn)行到步驟530以進(jìn)行循序關(guān)閉。如果更新區(qū)塊為混亂,則繼續(xù)進(jìn)行到步驟540以進(jìn)行混亂關(guān)閉。
循序更新區(qū)塊停閉步驟530由于更新區(qū)塊為循序且已完全填充,則其中存儲的邏輯群組為完整。元區(qū)塊為完整且取代原始的元區(qū)塊。此時,會使原始區(qū)塊完全過時且將其擦除。然后程序繼續(xù)進(jìn)行到步驟570,其中給定邏輯群組的更新執(zhí)行緒結(jié)束。
混亂更新區(qū)塊停閉步驟540由于更新區(qū)塊為非循序填充,可能含有一些邏輯扇區(qū)的多個更新,因此會執(zhí)行垃圾收集以挽救其中的有效數(shù)據(jù)?;靵y更新區(qū)塊可為已經(jīng)壓縮或合并。在步驟542將會決定將執(zhí)行的程序。
步驟542將執(zhí)行壓縮還是合并將取決于更新區(qū)塊的退化。如果邏輯扇區(qū)已更新多次,其邏輯地址將高度退化。將有相同邏輯扇區(qū)的多個版本記錄在更新區(qū)塊上,而只有最后記錄的版本為所述邏輯扇區(qū)的有效版本。在含有多個版本的邏輯扇區(qū)的更新區(qū)塊中,有所區(qū)分的邏輯扇區(qū)的數(shù)量會比邏輯群組的數(shù)量少很多。
在優(yōu)選實(shí)施例中,當(dāng)更新區(qū)塊中有所區(qū)分的邏輯扇區(qū)的數(shù)量超過預(yù)定的設(shè)計參數(shù)CD(其代表值為邏輯群組大小的一半)時,停閉程序會在步驟550執(zhí)行合并,否則程序會繼續(xù)進(jìn)行到步驟560的壓縮。
步驟550如果要合并混亂更新區(qū)塊,則將以含有合并數(shù)據(jù)的新的標(biāo)準(zhǔn)元區(qū)塊取代原始區(qū)塊及更新區(qū)塊。合并后,更新執(zhí)行緒將在步驟570結(jié)束。
步驟560如果要壓縮混亂更新區(qū)塊,則將以載有壓縮數(shù)據(jù)的新的更新區(qū)塊取而代之。壓縮后,已壓縮更新區(qū)塊的處理將在步驟570結(jié)束?;蛘?,可將壓縮延遲直到再次寫入更新區(qū)塊,因此排除壓縮之后為沒有中間更新的合并的可能性。然后,當(dāng)步驟502中出現(xiàn)下一個要求在LGX中進(jìn)行更新時,在給定邏輯區(qū)塊的進(jìn)一步更新中將使用新的更新區(qū)塊。
步驟570當(dāng)停閉程序建立完整的更新區(qū)塊時,所述區(qū)塊會變成給定邏輯群組的新標(biāo)準(zhǔn)區(qū)塊。此邏輯群組的更新執(zhí)行緒將會終止。在停閉程序建立取代現(xiàn)有更新區(qū)塊的新的更新區(qū)塊時,會使用新的更新區(qū)塊記錄為給定邏輯群組請求的下一個更新。在更新區(qū)塊未停閉時,處理會在步驟310中出現(xiàn)下一個要求在LGX中進(jìn)行更新時繼續(xù)。
從上述程序可知,在關(guān)閉混亂更新區(qū)塊時,會進(jìn)一步處理其上記錄的更新數(shù)據(jù)。尤其,其有效數(shù)據(jù)的垃圾收集是通過以下程序壓縮到另一個混亂區(qū)塊的程序,或和其關(guān)聯(lián)的原始區(qū)塊合并以形成新的標(biāo)準(zhǔn)循序區(qū)塊的程序。
圖11A為詳細(xì)顯示關(guān)閉圖10所示的混亂更新區(qū)塊的合并程序的流程圖。混亂更新區(qū)塊合并是執(zhí)行于停閉更新區(qū)塊時(例如,當(dāng)更新區(qū)塊已填滿其寫入的最后物理扇區(qū)位置時)的兩個可能程序之一。區(qū)塊中寫入的有所區(qū)分的邏輯扇區(qū)數(shù)量超過預(yù)定的設(shè)計參數(shù)CD時,將選擇合并。圖10所示的合并程序步驟550包含以下子步驟步驟551在混亂更新區(qū)塊被關(guān)閉時,會配置可取而代之的新元區(qū)塊。
步驟552在混亂更新區(qū)塊及關(guān)聯(lián)的原始區(qū)塊中,搜集各邏輯扇區(qū)的最新版本并忽略所有的過時扇區(qū)。
步驟554將所搜集的有效扇區(qū)按邏輯上循序順序記錄在新的元區(qū)塊上,以形成完整區(qū)塊,即,按循序順序記錄的邏輯群組的所有邏輯扇區(qū)的區(qū)塊。
步驟556以新的完整區(qū)塊取代原始區(qū)塊。
步驟558擦除已停閉的更新區(qū)塊及原始區(qū)塊。
圖11B為詳細(xì)顯示關(guān)閉圖10所示的混亂更新區(qū)塊的壓縮程序的流程圖。區(qū)塊中寫入的有所區(qū)分的邏輯扇區(qū)數(shù)量低于預(yù)定的設(shè)計參數(shù)CD時,將選擇壓縮。圖10所示的壓縮程序步驟560包含以下子步驟步驟561在混亂更新區(qū)塊被壓縮時,會配置取而代之的新元區(qū)塊。
步驟562在要壓縮的現(xiàn)有的混亂更新區(qū)塊中,搜集各邏輯扇區(qū)的最新版本。
步驟564將所搜集的扇區(qū)記錄在新的更新區(qū)塊上,以形成具有壓縮扇區(qū)的新的更新區(qū)塊。
步驟566以具有壓縮扇區(qū)的新的更新區(qū)塊取代現(xiàn)有的更新區(qū)塊。
步驟568擦除已停閉的更新區(qū)塊。
邏輯與元區(qū)塊狀態(tài)圖12A顯示邏輯群組的所有可能狀態(tài),及其間在各種操作下的可能轉(zhuǎn)變。
圖12B為列出邏輯群組的可能狀態(tài)的表格。邏輯群組狀態(tài)的定義如下1.完整可能利用頁標(biāo)記卷繞方式將邏輯群組中的所有邏輯扇區(qū)已依照邏輯循序順序被寫入單一元區(qū)塊之中。
2.未寫入邏輯群組中未曾寫入任何邏輯扇區(qū)。邏輯群組在群組地址表中會被標(biāo)示為未寫入且沒有任何配置的元區(qū)塊。返回預(yù)定義的數(shù)據(jù)模式,以響應(yīng)此群組內(nèi)每個扇區(qū)的主機(jī)讀取。
3.循序更新可能使用頁標(biāo)記將邏輯群組內(nèi)的一些扇區(qū)按邏輯上循序順序?qū)懭朐獏^(qū)塊中,因此其可取代群組中任何先前完整狀態(tài)的對應(yīng)的邏輯扇區(qū)。
4.混亂更新可能使用頁標(biāo)記將邏輯群組內(nèi)的一些扇區(qū)按邏輯上非循序順序?qū)懭朐獏^(qū)塊中,因此其可取代群組中任何先前完整狀態(tài)的對應(yīng)的邏輯扇區(qū)。群組內(nèi)的扇區(qū)可被寫入一次以上,其中最新版本將取代所有先前的版本。
圖13A顯示元區(qū)塊的所有可能狀態(tài),及在各種操作下在所述可能狀態(tài)之間的可能轉(zhuǎn)變。
圖13B顯示元區(qū)塊的所有可能狀態(tài)。元區(qū)塊狀態(tài)定義如下1.已擦除元區(qū)塊中的所有扇區(qū)已被擦除。
2.循序更新可能使用頁標(biāo)記將呈現(xiàn)邏輯循序順序的扇區(qū)部份地寫入元區(qū)塊。所有扇區(qū)均屬于相同的邏輯群組。
3.混亂更新元區(qū)塊已經(jīng)被呈現(xiàn)邏輯非循序順序的扇區(qū)部份或完全寫入。任何扇區(qū)均可被寫入一次以上。所有扇區(qū)均屬于相同的邏輯群組。
4.完整可能使用頁標(biāo)記以邏輯循序的順序?qū)⒃獏^(qū)塊完全寫入。
5.原始元區(qū)塊先前為完整但至少一個扇區(qū)已因主機(jī)數(shù)據(jù)更新而過時。
圖14(A)-14(J)為顯示各種操作對邏輯群組狀態(tài)以及物理元區(qū)塊的效果的狀態(tài)圖。
圖14(A)顯示對應(yīng)于第一寫入操作的邏輯群組及元區(qū)塊轉(zhuǎn)變的狀態(tài)圖。主機(jī)按邏輯上循序順序?qū)⑾惹拔磳懭氲倪壿嬋航M的一個或一個以上扇區(qū)寫入新配置的已擦除元區(qū)塊。邏輯群組及元區(qū)塊進(jìn)入循序更新狀態(tài)。
圖14(B)顯示對應(yīng)于第一完整操作的邏輯群組及元區(qū)塊轉(zhuǎn)變的狀態(tài)圖。先前未寫入的循序更新邏輯群組因主機(jī)循序?qū)懭胨猩葏^(qū)而變完整。如果存儲卡通過以預(yù)定義的數(shù)據(jù)模式填充其余未寫入的扇區(qū)來填滿群組,則也會發(fā)生轉(zhuǎn)變。元區(qū)塊變成完整。
圖14(C)顯示對應(yīng)于第一混亂操作的邏輯群組及元區(qū)塊轉(zhuǎn)變的狀態(tài)圖。先前未寫入的循序更新邏輯群組在主機(jī)非循序?qū)懭胫辽僖粋€扇區(qū)時變成混亂。
圖14(D)顯示對應(yīng)于第一壓縮操作的邏輯群組及元區(qū)塊轉(zhuǎn)變的狀態(tài)圖。從舊區(qū)塊將先前未寫入的混亂更新邏輯群組內(nèi)的所有有效扇區(qū)復(fù)制到新的混亂元區(qū)塊,然后再將其擦除。
圖14(E)顯示對應(yīng)于第一合并操作的邏輯群組及元區(qū)塊轉(zhuǎn)變的狀態(tài)圖。從舊的混亂區(qū)塊移動先前未寫入的混亂更新邏輯群組內(nèi)的所有有效扇區(qū),以按邏輯上循序順序填充新配置的已擦除區(qū)塊。主機(jī)未寫入的扇區(qū)會以預(yù)定義的數(shù)據(jù)模式加以填充。然后擦除舊的混亂區(qū)塊。
圖14(F)顯示對應(yīng)于循序?qū)懭氩僮鞯倪壿嬋航M及元區(qū)塊轉(zhuǎn)變的狀態(tài)圖。主機(jī)按邏輯上循序順序?qū)⑼暾壿嬋航M的一個或一個以上扇區(qū)寫入新配置的已擦除元區(qū)塊。邏輯群組及元區(qū)塊成為循序更新狀態(tài)。先前完整的元區(qū)塊變成原始元區(qū)塊。
圖14(G)顯示對應(yīng)于循序填充操作的邏輯群組及元區(qū)塊轉(zhuǎn)變的狀態(tài)圖。循序更新邏輯群組在主機(jī)循序?qū)懭胨衅渖葏^(qū)時變成完整。這也可發(fā)生于以原始區(qū)塊的有效扇區(qū)填充循序更新邏輯群組以使其完整的垃圾收集期間,在此之后會擦除原始區(qū)塊。
圖14(H)顯示對應(yīng)于非循序?qū)懭氩僮鞯倪壿嬋航M及元區(qū)塊轉(zhuǎn)變的狀態(tài)圖。循序更新邏輯群組在主機(jī)非循序?qū)懭胫辽僖粋€扇區(qū)時變成混亂。非循序扇區(qū)寫入可造成更新區(qū)塊或?qū)?yīng)原始區(qū)塊中的有效扇區(qū)變成過時。
圖14(I)顯示對應(yīng)于壓縮操作的邏輯群組及元區(qū)塊轉(zhuǎn)變的狀態(tài)圖。從舊區(qū)塊將混亂更新邏輯群組內(nèi)的所有有效扇區(qū)復(fù)制到新的混亂元區(qū)塊,然后再將其擦除。原始區(qū)塊不會受到影響。
圖14(J)顯示對應(yīng)于合并操作的邏輯群組及元區(qū)塊轉(zhuǎn)變的狀態(tài)圖。從舊的混亂區(qū)塊復(fù)制混亂更新邏輯群組內(nèi)的所有有效扇區(qū),以按邏輯上循序順序填充新配置的已擦除區(qū)塊。然后擦除舊的混亂區(qū)塊及原始區(qū)塊。
更新區(qū)塊追蹤及管理圖15顯示用于追蹤已開啟及已關(guān)閉的更新區(qū)塊與已擦除區(qū)塊以進(jìn)行配置的配置區(qū)塊列表(ABL)的結(jié)構(gòu)的優(yōu)選實(shí)施例。所述配置區(qū)塊列表(ABL)610會被保存于控制器RAM130之中,以允許管理已擦除區(qū)塊的配置、配置的更新區(qū)塊、關(guān)聯(lián)的區(qū)塊及控制結(jié)構(gòu),以啟用正確的邏輯對物理地址轉(zhuǎn)換。在優(yōu)選實(shí)施例中,ABL包括已擦除區(qū)塊的列表、開啟的更新區(qū)塊列表614及關(guān)閉的更新區(qū)塊列表616。
開啟的更新區(qū)塊列表614是ABL中具有開啟更新區(qū)塊屬性的區(qū)塊項(xiàng)目組。開啟的更新區(qū)塊列表具有用于目前開啟的每個數(shù)據(jù)更新區(qū)塊的一個項(xiàng)目。各項(xiàng)目保有以下信息。LG是目前更新元區(qū)塊專用的邏輯群組地址。循序/混亂是代表以循序或混亂更新數(shù)據(jù)填充更新區(qū)塊的狀態(tài)。MB是更新區(qū)塊的元區(qū)塊地址。頁標(biāo)記是在更新區(qū)塊的第一物理位置記錄的起始邏輯扇區(qū)。寫入的扇區(qū)號碼代表目前在更新區(qū)塊上寫入的扇區(qū)號碼。MB0是關(guān)聯(lián)的原始區(qū)塊的元區(qū)塊地址。Page Tag0是關(guān)聯(lián)的原始區(qū)塊的頁標(biāo)記。
關(guān)閉的更新區(qū)塊列表616是配置區(qū)塊列表(ABL)的子集。其為ABL中具有關(guān)閉更新區(qū)塊的屬性的區(qū)塊項(xiàng)目組。關(guān)閉的更新區(qū)塊列表具有一個用于已關(guān)閉的每個數(shù)據(jù)更新區(qū)塊的項(xiàng)目,但其項(xiàng)目在邏輯對主物理目錄中并未更新。各項(xiàng)目保有以下信息。LG是目前更新區(qū)塊專用的邏輯群組地址。MB是更新區(qū)塊的元區(qū)塊地址。頁標(biāo)記是在更新區(qū)塊的第一物理位置記錄的起始邏輯扇區(qū)。MB0是關(guān)聯(lián)的原始區(qū)塊的元區(qū)塊地址。
混亂區(qū)塊索引循序更新區(qū)塊具有按邏輯上循序順序存儲的數(shù)據(jù),因此很容易尋找區(qū)塊中的任何邏輯扇區(qū)?;靵y更新區(qū)塊具有其未按順序存儲的邏輯扇區(qū)并可存儲一個邏輯扇區(qū)的多個更新世代。必須維持附加信息,以記錄各有效邏輯扇區(qū)定位在混亂更新區(qū)塊中的位置。
在優(yōu)選實(shí)施例中,混亂區(qū)塊索引數(shù)據(jù)結(jié)構(gòu)允許追蹤及快速存取混亂區(qū)塊中的所有有效扇區(qū)?;靵y區(qū)塊索引獨(dú)立管理小型區(qū)域的邏輯地址空間,并可有效處理系統(tǒng)數(shù)據(jù)及使用者數(shù)據(jù)的熱區(qū)。索引數(shù)據(jù)結(jié)構(gòu)實(shí)質(zhì)上允許在快閃存儲器中維持具有不常更新需求的索引信息,以免性能明顯受到影響。另一方面,將混亂區(qū)塊中最近寫入扇區(qū)的列表保留在控制器RAM的混亂扇區(qū)列表中。此外,將快閃存儲器的索引信息的高速緩存保留在控制器RAM中,以減少地址轉(zhuǎn)換的快閃扇區(qū)存取的數(shù)量。各混亂區(qū)塊的索引存儲于快閃存儲器中的混亂區(qū)塊索引(CBI)扇區(qū)中。
圖16A顯示混亂區(qū)塊索引(CBI)扇區(qū)的數(shù)據(jù)字段?;靵y區(qū)塊索引扇區(qū)(CBI扇區(qū))含有邏輯群組中各扇區(qū)映射到混亂更新區(qū)塊的索引,從而定義邏輯群組各扇區(qū)在混亂更新區(qū)塊或其關(guān)聯(lián)的原始區(qū)塊內(nèi)的位置。CBI扇區(qū)包括記錄混亂區(qū)塊內(nèi)有效扇區(qū)的混亂區(qū)塊索引字段、記錄混亂區(qū)塊地址參數(shù)的混亂區(qū)塊信息字段及記錄存儲CBI扇區(qū)的元區(qū)塊(CBI區(qū)塊)內(nèi)有效CBI扇區(qū)的扇區(qū)索引字段。
圖16B顯示記錄于專用元區(qū)塊中的混亂區(qū)塊索引(CBI)扇區(qū)的范例。專用的元區(qū)塊將稱為CBI區(qū)塊620。在更新CBI扇區(qū)時,會將其寫入CBI區(qū)塊620中下一個可用的物理扇區(qū)位置。因此,CBI扇區(qū)的多個副本可存在于CBI區(qū)塊中,其中只有最后寫入的副本為有效副本。例如,已經(jīng)利用為有效版本的最新版本將邏輯群組LG1的CBI扇區(qū)更新三次。區(qū)塊中最后寫入的CBI扇區(qū)的一組索引可識別CBI區(qū)塊中各有效扇區(qū)的位置。在此范例中,區(qū)塊中最后寫入的CBI扇區(qū)是LG136的CBI扇區(qū),且索引組是取代所有先前索引組的有效索引組。當(dāng)CBI區(qū)塊最后變成以CBI扇區(qū)予以完全填充時,將所有有效扇區(qū)再寫入新的區(qū)塊位置,以在控制寫入操作期間壓縮區(qū)塊。然后擦除整個區(qū)塊。
CBI扇區(qū)內(nèi)的混亂區(qū)塊索引字段含有邏輯群組內(nèi)或子群組內(nèi)各邏輯扇區(qū)映射到混亂更新區(qū)塊的索引項(xiàng)目。各索引項(xiàng)目代表對應(yīng)邏輯扇區(qū)的有效數(shù)據(jù)所在的混亂更新區(qū)塊內(nèi)的偏移。保留的索引值代表混亂更新區(qū)塊中不存在邏輯扇區(qū)的有效數(shù)據(jù),且代表關(guān)聯(lián)的原始區(qū)塊中的對應(yīng)扇區(qū)為有效。一些混亂區(qū)塊索引字段項(xiàng)目的高速緩存被保留在控制器RAM中。
CBI扇區(qū)內(nèi)的混亂區(qū)塊信息字段含有關(guān)于存在于系統(tǒng)中各混亂更新區(qū)塊的一個項(xiàng)目,以記錄區(qū)塊的地址參數(shù)信息。此字段中的信息只在CBI區(qū)塊的最后寫入扇區(qū)中有效。此信息也會出現(xiàn)在RAM的數(shù)據(jù)結(jié)構(gòu)中。
各混亂更新區(qū)塊的項(xiàng)目包括三個地址參數(shù)。第一個參數(shù)是和混亂更新區(qū)塊關(guān)聯(lián)的邏輯群組(或邏輯群組數(shù))的邏輯地址。第二個參數(shù)是混亂更新區(qū)塊的元區(qū)塊地址。第三個參數(shù)是寫入混亂更新區(qū)塊中最后扇區(qū)的物理地址偏移。偏移信息設(shè)定初始化期間混亂更新區(qū)塊的掃描起點(diǎn),以在RAM中重建數(shù)據(jù)結(jié)構(gòu)。
扇區(qū)索引字段含有關(guān)于CBI區(qū)塊中各有效CBI扇區(qū)的項(xiàng)目。其可定義CBI區(qū)塊內(nèi)有關(guān)各許可混亂更新區(qū)塊的最近寫入的CBI扇區(qū)所在的偏移。索引中偏移的保留值代表不存在許可的混亂更新區(qū)塊。
圖16C為顯示存取正在進(jìn)行混亂更新的給定邏輯群組的邏輯扇區(qū)的數(shù)據(jù)的流程圖。在更新程序期間,將更新數(shù)據(jù)記錄在混亂更新區(qū)塊中,而未變更的數(shù)據(jù)則留在和邏輯群組關(guān)聯(lián)的原始元區(qū)塊中。在混亂更新下存取邏輯群組的邏輯扇區(qū)的程序如下步驟650開始定位給定邏輯群組的給定邏輯扇區(qū)。
步驟652在CBI區(qū)塊中定位最后寫入的CBI扇區(qū)。
步驟654通過查詢最后寫入的CBI扇區(qū)的混亂區(qū)塊信息字段,定位和給定邏輯群組關(guān)聯(lián)的混亂更新區(qū)塊或原始區(qū)塊。此步驟可在步驟662前的任何時間執(zhí)行。
步驟658如果最后寫入的CBI扇區(qū)是指向給定的邏輯群組,則可定位CBI扇區(qū)。繼續(xù)進(jìn)行到步驟662。否則,繼續(xù)進(jìn)行到步驟660。
步驟660通過查詢最后寫入的CBI扇區(qū)的扇區(qū)索引字段,定位給定邏輯群組的CBI扇區(qū)。
步驟662通過查詢所尋找到的CBI扇區(qū)的混亂區(qū)塊索引字段,定位混亂區(qū)塊或原始區(qū)塊中的給定邏輯扇區(qū)。
圖16D顯示根據(jù)其中已將邏輯群組分割成子群組的替代性實(shí)施例,存取正在進(jìn)行混亂更新的給定邏輯群組的邏輯扇區(qū)的數(shù)據(jù)的流程圖。CBI扇區(qū)的有限容量只能記錄預(yù)定最大數(shù)量的邏輯扇區(qū)。當(dāng)邏輯群組具有多于單一CBI扇區(qū)所能處理的邏輯扇區(qū)時,將邏輯群組分割成多個具有指派給各子群組的CBI扇區(qū)的子群組。在一個范例中,各CBI扇區(qū)具有足夠追蹤由256個扇區(qū)及多達(dá)8個混亂更新區(qū)塊所組成的邏輯群組的容量。如果邏輯群組具有超過256個扇區(qū)的大小,則存在用于邏輯群組內(nèi)各256扇區(qū)子群組的分開的CBI扇區(qū)。可存在用于邏輯群組內(nèi)多達(dá)8個子群組的CBI扇區(qū),以支持大小多達(dá)2048個扇區(qū)的邏輯群組。
在優(yōu)選實(shí)施例中,采用間接索引方案以促進(jìn)索引的管理。扇區(qū)索引的各項(xiàng)目具有直接及間接字段。
直接扇區(qū)索引定義CBI區(qū)塊內(nèi)有關(guān)特定混亂更新區(qū)塊的所有可能CBI扇區(qū)所在的偏移。此字段中的信息只在有關(guān)所述特定混亂更新區(qū)塊的最后寫入的CBI扇區(qū)中有效。索引中偏移的保留值代表CBI扇區(qū)并不存在,因?yàn)閷?yīng)的有關(guān)混亂更新區(qū)塊的邏輯子群組或是不存在,或是由于已配置更新區(qū)塊而未更新。
間接扇區(qū)索引定義有關(guān)各許可的混亂更新區(qū)塊的最近寫入的CBI扇區(qū)所在的CBI區(qū)塊內(nèi)的偏移。索引中偏移的保留值代表不存在許可的混亂更新區(qū)塊。
圖16D顯示在混亂更新下存取邏輯群組的邏輯扇區(qū)的程序,其步驟如下步驟670將各邏輯群組分割成多個子群組并為各子群組指派CBI扇區(qū)。
步驟680開始定位給定邏輯群組的給定子群組的給定邏輯扇區(qū)。
步驟682在CBI區(qū)塊中尋找最后寫入的CBI扇區(qū)。
步驟684通過查詢最后寫入的CBI扇區(qū)的混亂區(qū)塊信息字段,尋找和給定子群組關(guān)聯(lián)的混亂更新區(qū)塊或原始區(qū)塊。此步驟可在步驟696前的任何時間執(zhí)行。
步驟686如果最后寫入的CBI扇區(qū)是指向給定的邏輯群組,則繼續(xù)進(jìn)行到步驟691。否則,繼續(xù)進(jìn)行到步驟690。
步驟690通過查詢最后寫入的CBI扇區(qū)的間接扇區(qū)索引字段,定位給定邏輯群組的多個CBI扇區(qū)中最后寫入的CBI扇區(qū)。
步驟691已經(jīng)定位和給定邏輯群組的子群組其中之一關(guān)聯(lián)的至少一個CBI扇區(qū)。繼續(xù)。
步驟692如果所定位的CBI扇區(qū)指向給定子群組,則可定位給定子群組的CBI扇區(qū)。繼續(xù)進(jìn)行到步驟696。否則,繼續(xù)進(jìn)行到步驟694。
步驟694通過查詢目前定位的CBI扇區(qū)的直接扇區(qū)索引字段,來尋找給定子群組的CBI扇區(qū)。
步驟696通過查詢給定子群組的CBI扇區(qū)的混亂區(qū)塊索引字段,來尋找混亂區(qū)塊或原始區(qū)塊中的給定邏輯扇區(qū)。
圖16E顯示在其中將各邏輯群組分割成多個子群組的實(shí)施例中,混亂區(qū)塊索引(CBI)扇區(qū)及其功能的范例。邏輯群組700原來將其完整的數(shù)據(jù)存儲在原始元區(qū)塊702中。接著,以專用的混亂更新區(qū)塊704的配置來更新邏輯群組。在本范例中,將邏輯群組700分割成子群組,這些子群組A、B、C、D各具有256個扇區(qū)。
為了定位子群組B中的第i個扇區(qū),先定位CBI區(qū)塊620中最后寫入的CBI扇區(qū)。最后寫入的CBI扇區(qū)的混亂區(qū)塊信息字段提供定位給定邏輯群組的混亂更新區(qū)塊704的地址。同時,其還可提供寫入混亂區(qū)塊中的最后扇區(qū)的位置。此信息在掃描及重建索引時很有用。
如果最后寫入的CBI扇區(qū)結(jié)果是給定邏輯群組的四個CBI扇區(qū)之一,則進(jìn)一步?jīng)Q定其是否正是含有第i個邏輯扇區(qū)的給定子群組B的CBI扇區(qū)。如果是,則CBI扇區(qū)的混亂區(qū)塊索引會指向存儲第i個邏輯扇區(qū)的數(shù)據(jù)的元區(qū)塊位置。扇區(qū)位置可能在混亂更新區(qū)塊704中或在原始區(qū)塊702中。
如果最后寫入的CBI扇區(qū)結(jié)果是給定邏輯群組的四個CBI扇區(qū)之一但卻非屬于子群組B,則查詢其直接扇區(qū)索引,以定位子群組B的CBI扇區(qū)。一旦定位了此確切的CBI扇區(qū),便查詢其混亂區(qū)塊索引,以在混亂更新區(qū)塊704及原始區(qū)塊702中尋找第i個邏輯扇區(qū)。
如果最后寫入的CBI扇區(qū)結(jié)果不是給定邏輯群組的四個CBI扇區(qū)中的任一個,則查詢其間接扇區(qū)索引以尋找四個CBI扇區(qū)中的一個。在圖16E所示的范例中,定位子群組C的CBI扇區(qū)。然后,子群組C的此CBI扇區(qū)查詢其直接扇區(qū)索引,以尋找子群組B的確切的CBI扇區(qū)。此范例顯示在查詢混亂區(qū)塊索引時,將發(fā)現(xiàn)第i個邏輯扇區(qū)為未變更且會在原始區(qū)塊中尋找到其有效數(shù)據(jù)。
同樣的考慮也適用于在給定邏輯群組的子群組C中尋找第j個邏輯扇區(qū)。此范例顯示最后寫入的CBI扇區(qū)結(jié)果不是給定邏輯群組的四個CBI扇區(qū)中的任何一個。其間接扇區(qū)索引指向給定群組的四個CBI扇區(qū)之一。所指向的四個中的最后寫入結(jié)果也正是子群組C的CBI扇區(qū)。在查詢其混亂區(qū)塊索引時,將發(fā)現(xiàn)第j個邏輯扇區(qū)被定位在混亂更新區(qū)塊704中的指定位置。
控制器RAM中存在系統(tǒng)中的各混亂更新區(qū)塊的混亂扇區(qū)列表。每份列表均含有一份從快閃存儲器中相關(guān)CBI扇區(qū)最后被更新以來被寫入所述混亂更新區(qū)塊之中的扇區(qū)的記錄。特定混亂更新區(qū)塊的邏輯扇區(qū)地址(可保留在混亂扇區(qū)列表中)的數(shù)量是具有8至16的代表值的設(shè)計參數(shù)。列表的最優(yōu)大小可決定為其對混亂數(shù)據(jù)寫入操作的額外開銷及初始化期間扇區(qū)掃描時間的作用之間的權(quán)衡。
在系統(tǒng)初始化期間,為了識別自其關(guān)聯(lián)的CBI扇區(qū)之一的先前更新后所寫入的有效扇區(qū),必須掃描各混亂更新區(qū)塊。在控制器RAM中,會構(gòu)成各混亂更新區(qū)塊的混亂扇區(qū)列表。只需要在最后寫入的CBI扇區(qū)中,從各區(qū)塊的混亂區(qū)塊信息字段中定義的最后扇區(qū)地址開始掃描各區(qū)塊即可。
在配置混亂更新區(qū)塊時,會寫入CBI扇區(qū)以對應(yīng)于所有的更新邏輯子群組?;靵y更新區(qū)塊的邏輯及物理地址會被寫入扇區(qū)中可用的混亂區(qū)塊信息字段,其中空值項(xiàng)目在混亂區(qū)塊索引字段中。會在控制器RAM中開啟混亂扇區(qū)列表。
在關(guān)閉混亂更新區(qū)塊時,會以從扇區(qū)中的混亂區(qū)塊信息字段移除的區(qū)塊邏輯及物理地址寫入CBI扇區(qū)。RAM中對應(yīng)的混亂扇區(qū)列表變成未使用。
可修改控制器RAM中對應(yīng)的混亂扇區(qū)列表,以包括寫入混亂更新區(qū)塊的扇區(qū)的記錄。當(dāng)控制器RAM中的混亂扇區(qū)列表沒有其它扇區(qū)記錄寫入混亂更新區(qū)塊的任何可用空間時,為有關(guān)列表中扇區(qū)的邏輯子群組寫入已更新的CBI扇區(qū),然后清除列表。
當(dāng)CBI區(qū)塊620變滿時,將有效的CBI扇區(qū)復(fù)制到已配置的已擦除區(qū)塊中,然后擦除先前的CBI區(qū)塊。
地址表圖2所示的邏輯對物理地址轉(zhuǎn)換模塊140負(fù)責(zé)關(guān)聯(lián)快閃存儲器中主機(jī)的邏輯地址對對應(yīng)的物理地址。邏輯群組及物理群組(元區(qū)塊)間的映射存儲于非易失性快閃存儲器200及易失性卻較為敏捷的RAM 130(見圖1)中分布的一組表格及列表中。在快閃存儲器中維持地址表,其含有存儲器系統(tǒng)中每個邏輯群組的元區(qū)塊地址。此外,最近寫入扇區(qū)的邏輯對物理地址記錄會暫時保留在RAM中。在系統(tǒng)通電后進(jìn)行初始化時,可從快閃存儲器中的區(qū)塊列表及數(shù)據(jù)扇區(qū)標(biāo)頭中重新構(gòu)成這些易失性記錄。因此,快閃存儲器中的地址表只需要偶而更新,從而使得控制數(shù)據(jù)的額外開銷寫入操作的百分比較低。
邏輯群組的地址記錄的層級包括RAM中的開啟的更新區(qū)塊列表、關(guān)閉的更新區(qū)塊列表及維持在快閃存儲器中的群組地址表(GAT)。
開啟的更新區(qū)塊列表是控制器RAM中目前開啟用于寫入已更新的主機(jī)扇區(qū)數(shù)據(jù)的數(shù)據(jù)更新區(qū)塊的列表。區(qū)塊的項(xiàng)目在區(qū)塊關(guān)閉時被移至關(guān)閉的更新區(qū)塊列表。關(guān)閉的更新區(qū)塊列表是控制器RAM中已經(jīng)關(guān)閉的數(shù)據(jù)更新區(qū)塊的列表。列表中項(xiàng)目的子集在控制寫入操作期間被移至群組地址表中的扇區(qū)。
群組地址表(GAT)是存儲器系統(tǒng)中主機(jī)數(shù)據(jù)所有邏輯群組的元區(qū)塊地址的列表。GAT含有根據(jù)邏輯地址循序排序的各邏輯群組的一個項(xiàng)目。GAT中的第n個項(xiàng)目含有具有地址n的邏輯群組的元區(qū)塊地址。在優(yōu)選實(shí)施例中,GAT是快閃存儲器中的表格,其中包含一組具定義存儲器系統(tǒng)中每個邏輯群組的元區(qū)塊地址的項(xiàng)目的扇區(qū)(稱為GAT扇區(qū))。GAT扇區(qū)定位在快閃存儲器中的一個或一個以上專用的控制區(qū)塊(稱為GAT區(qū)塊)中。
圖17A顯示群組地址表(GAT)扇區(qū)的數(shù)據(jù)字段。GAT扇區(qū)可(例如)具有足夠含有一組128個連續(xù)邏輯群組的GAT項(xiàng)目的容量。各GAT扇區(qū)包括兩個組成部分,即一組用于某一范圍內(nèi)各邏輯群組的元區(qū)塊地址的GAT項(xiàng)目,及GAT扇區(qū)索引。第一組成部分含有用于定位和邏輯地址關(guān)聯(lián)的元區(qū)塊的信息。第二組成部分含有用于定位GAT區(qū)塊內(nèi)所有有效GAT扇區(qū)的信息。各GAT項(xiàng)目有三個字段,即元區(qū)塊號碼、如先前結(jié)合圖3A(iii)所述的頁標(biāo)記及代表元區(qū)塊是否已經(jīng)重新鏈接的旗標(biāo)。GAT扇區(qū)索引列出GAT區(qū)塊中有效GAT扇區(qū)的位置。此索引存在于每個GAT扇區(qū)中但會被GAT區(qū)塊中下一個寫入的GAT扇區(qū)的版本所取代。因此只有最后寫入的GAT扇區(qū)中的版本有效。
圖17B顯示記錄在一個或一個以上GAT區(qū)塊中的群組地址表(GAT)扇區(qū)的范例。GAT區(qū)塊是記錄GAT扇區(qū)專用的元區(qū)塊。在更新GAT扇區(qū)時,會將其寫入GAT區(qū)塊720中下一個可用的物理扇區(qū)位置。因此,GAT區(qū)塊中可存在GAT扇區(qū)的多個副本,其中只有最后寫入的副本有效。例如,GAT扇區(qū)255(含有邏輯群組LG3968-LG4098的指針)至少已經(jīng)使用有效版本的最新版本更新兩次。區(qū)塊中最后寫入的GAT扇區(qū)的一組索引可識別GAT區(qū)塊中各有效扇區(qū)的位置。在此范例中,區(qū)塊中最后寫入的GAT扇區(qū)是GAT扇區(qū)236,且其索引組是取代所有先前索引組的有效索引組。當(dāng)GAT區(qū)塊最后變成以GAT扇區(qū)完全填充時,會將所有有效扇區(qū)再寫入新的區(qū)塊位置,以在控制寫入操作期間壓縮區(qū)塊。然后擦除整個區(qū)塊。
如上所述,GAT區(qū)塊在邏輯地址空間的區(qū)域中含有邏輯上連續(xù)組的群組的項(xiàng)目。GAT區(qū)塊內(nèi)的GAT扇區(qū)各含有128個連續(xù)邏輯群組的邏輯對物理映射信息。在GAT區(qū)塊所跨越的地址范圍內(nèi),存儲所有邏輯群組項(xiàng)目所需的GAT扇區(qū)數(shù)僅占用區(qū)塊內(nèi)總扇區(qū)位置的一小部分。因此,通過在區(qū)塊中下一個可用扇區(qū)位置將GAT扇區(qū)寫入,即可將所述GAT扇區(qū)更新。GAT區(qū)塊中所有有效GAT扇區(qū)及其位置的索引維持在最近寫入的GAT扇區(qū)中的索引字段中。GAT區(qū)塊中有效GAT扇區(qū)所占用的總扇區(qū)的一小部分為系統(tǒng)設(shè)計參數(shù),其通常為25%。然而,每個GAT區(qū)塊中最多有64個有效GAT扇區(qū)。在大邏輯容量的系統(tǒng)中,可能必須在一個以上的GAT區(qū)塊中存儲GAT扇區(qū)。此時,各GAT區(qū)塊與固定范圍的邏輯群組關(guān)聯(lián)。
可作為控制寫入操作的一部分執(zhí)行GAT更新,此操作會在ABL用盡用于配置的區(qū)塊時受到觸發(fā)(見圖18)。其執(zhí)行和ABL填充及CBL清空操作同時進(jìn)行。在GAT更新操作期間,一個GAT扇區(qū)以關(guān)閉的更新區(qū)塊列表中對應(yīng)項(xiàng)目的信息來更新項(xiàng)目。GAT項(xiàng)目被更新時,會從關(guān)閉的更新區(qū)塊列表(CUBL)移除任何對應(yīng)的項(xiàng)目。例如,會根據(jù)關(guān)閉的更新區(qū)塊列表中的第一項(xiàng)目來選擇要更新的GAT扇區(qū)。可將更新扇區(qū)寫入GAT區(qū)塊中的下一個可用扇區(qū)位置。
當(dāng)沒有任何扇區(qū)位置可供一已更新的GAT扇區(qū)使用時,在控制寫入操作期間便會發(fā)生GAT再寫入操作。將會配置新的GAT區(qū)塊且從完整的GAT區(qū)塊中按循序順序復(fù)制GAT索引所定義的有效GAT扇區(qū)。然后擦除整個GAT區(qū)塊。
GAT高速緩存是控制器RAM 130中,GAT扇區(qū)的128個項(xiàng)目的子部分的項(xiàng)目的副本。GAT高速緩存項(xiàng)目的數(shù)量是一項(xiàng)系統(tǒng)設(shè)計參數(shù),代表值為32。每次從GAT扇區(qū)讀取一個項(xiàng)目時,即可建立相關(guān)扇區(qū)子部分的GAT高速緩存。將會維持多個GAT高速緩存。其數(shù)量是代表值為4的設(shè)計參數(shù)。根據(jù)最久未使用以不同扇區(qū)子部分的項(xiàng)目來覆寫GAT高速緩存。
擦除的元區(qū)塊管理圖2所示的擦除區(qū)塊管理器160可使用一組維持目錄及系統(tǒng)控制信息的列表來管理擦除區(qū)塊。這些列表分布于控制器RAM 130及快閃存儲器200中。當(dāng)必須配置已擦除的元區(qū)塊以存儲使用者數(shù)據(jù)或存儲器系統(tǒng)控制數(shù)據(jù)結(jié)構(gòu)時,會選擇保留在控制器RAM中的配置區(qū)塊列表(ABL)中的下一個可用元區(qū)塊號碼(見圖15)。同樣,在撤出元區(qū)塊后而將其擦除時,會將其號碼添加到同樣保留在控制器RAM中的清除區(qū)塊列表(CBL)。相對靜態(tài)的目錄及系統(tǒng)控制數(shù)據(jù)存儲于快閃存儲器中。這些包括列出快閃存儲器中所有元區(qū)塊的擦除狀態(tài)的已擦除區(qū)塊列表及位圖(MAP)。已擦除的區(qū)塊列表及MAP存儲于個別扇區(qū)中,且會記錄在稱為“MAP區(qū)塊”的專用元區(qū)塊中。這些分布于控制器RAM及快閃存儲器中的列表可提供已擦除區(qū)塊記錄的層級以對已擦除元區(qū)塊的使用進(jìn)行有效管理。
圖18為顯示用于使用及再循環(huán)已擦除區(qū)塊的控制及目錄信息的分布及流程的示意方塊圖??刂萍澳夸洈?shù)據(jù)維持在被保留在控制器RAM 130中在或常駐于快閃存儲器200中的MAP區(qū)塊750中的列表之中。
在優(yōu)選實(shí)施例中,控制器RAM 130會保留配置區(qū)塊列表(ABL)610及清除區(qū)塊列表(CBL)740。如先前結(jié)合圖15所述,配置區(qū)塊列表(ABL)可記錄最近已配置哪些元區(qū)塊以存儲使用者數(shù)據(jù)或存儲器系統(tǒng)控制數(shù)據(jù)結(jié)構(gòu)。在必須配置新的已擦除元區(qū)塊時,會在配置區(qū)塊列表(ABL)中選擇下一個可用的元區(qū)塊號碼。同樣,會使用清除區(qū)塊列表(CBL)記錄已經(jīng)解除配置及擦除的更新元區(qū)塊。在控制器RAM 130(見圖1)中會保留ABL及CBL以在追蹤相對作用中更新區(qū)塊時進(jìn)行快速存取且簡易的操控。
配置區(qū)塊列表(ABL)可記錄即將成為更新區(qū)塊的已擦除元區(qū)塊的集區(qū)及已擦除元區(qū)塊的配置。因此,這些元區(qū)塊中每一者均可由指定其是否為ABL懸置配置中的已擦除區(qū)塊、開啟的更新區(qū)塊或關(guān)閉的更新區(qū)塊的屬性來說明。圖18顯示ABL含有已擦除ABL列表612、開啟的更新區(qū)塊列表614及關(guān)閉的更新區(qū)塊列表616。此外,和開啟的更新區(qū)塊列表614關(guān)聯(lián)的是關(guān)聯(lián)的原始區(qū)塊列表615。同樣,和關(guān)閉的更新區(qū)塊列表關(guān)聯(lián)的是關(guān)聯(lián)的已擦除原始區(qū)塊列表617。如先前圖15所示,這些關(guān)聯(lián)的列表分別是開啟的更新區(qū)塊列表614及關(guān)閉的更新區(qū)塊列表616的子集。已擦除的ABL區(qū)塊列表612、開啟的更新區(qū)塊列表614及關(guān)閉的更新區(qū)塊列表616均為配置區(qū)塊列表(ABL)610的子集,各列表中的項(xiàng)目分別具有對應(yīng)的屬性。
MAP區(qū)塊750是存儲快閃存儲器200中的擦除管理記錄專用的元區(qū)塊。MAP區(qū)塊存儲MAP區(qū)塊扇區(qū)的時間序列,其中各MAP扇區(qū)不是擦除區(qū)塊管理(EBM)扇區(qū)760,就是MAP扇區(qū)780。當(dāng)已擦除區(qū)塊配置用盡且在撤出元區(qū)塊時再循環(huán)時,關(guān)聯(lián)的控制及目錄數(shù)據(jù)優(yōu)選含在可在MAP區(qū)塊中更新的邏輯扇區(qū)中,其中會將更新數(shù)據(jù)的各例項(xiàng)記錄在新的區(qū)塊扇區(qū)中。MAP區(qū)塊750中可存在EBM扇區(qū)760及MAP扇區(qū)780的多個副本,其中只有最新版本有效。有效MAP扇區(qū)的位置的索引包含在EMB區(qū)塊中的字段中。有效的EMB扇區(qū)總是在控制寫入操作期間最后被寫入MAP區(qū)塊中。當(dāng)MAP區(qū)塊750已滿時,會在控制寫入操作期間將所有有效扇區(qū)再寫入新的區(qū)塊位置而將其壓縮。然后擦除整個區(qū)塊。
各EBM扇區(qū)760含有已擦除的區(qū)塊列表(EBL)770,所述列表是已擦除區(qū)塊總體的子集地址的列表。已擦除的區(qū)塊列表(EBL)770可當(dāng)作含有已擦除元區(qū)塊號碼的緩沖器,從此緩沖器中會定期取用元區(qū)塊號碼以重新填充ABL,并定期將元區(qū)塊號碼添加到此緩沖器中以重新清空CBL。EBL 770可當(dāng)作用于以下項(xiàng)目的緩沖器可用的區(qū)塊緩沖器(ABB)772、已擦除的區(qū)塊緩沖器(EBB)774及已清除的區(qū)塊緩沖器(CBB)776。
可用的區(qū)塊緩沖器(ABB)772含有緊接先前ABL填充操作之后的ABL 610的項(xiàng)目的副本。其實(shí)際上是正在ABL填充操作之后的ABL的備份副本。
已擦除的區(qū)塊緩沖器(EBB)774含有先前從MAP扇區(qū)780或CBB列表776傳送的已擦除的區(qū)塊地址(說明如下),且所述地址可用于在ABL填充操作期間傳送至ABL 610。
已清除的區(qū)塊緩沖器(CBB)776含有在CBL清空操作期間已從CBL 740傳送及其后會被傳送至MAP扇區(qū)780或EBB列表774的已擦除區(qū)塊的地址。
各個MAP扇區(qū)780含有稱為MAP的位圖結(jié)構(gòu)。MAP會使用快閃存儲器中各元區(qū)塊的一位,以用來表示各區(qū)塊的擦除狀態(tài)。對應(yīng)于EBM扇區(qū)中ABL、CBL或已擦除的區(qū)塊列表所列的區(qū)塊地址的位在MAP中不會被設(shè)為擦除狀態(tài)。
區(qū)塊配置算法永遠(yuǎn)不會使用在MAP、已擦除的區(qū)塊列表、ABL或CBL內(nèi),任何不含有有效數(shù)據(jù)結(jié)構(gòu)且未被指定為已擦除區(qū)塊的區(qū)塊,因此無法存取此類區(qū)塊用于存儲主機(jī)或控制數(shù)據(jù)結(jié)構(gòu)。這可提供從可存取的快閃存儲器地址空間排除具有缺陷位置的區(qū)塊的簡單機(jī)制。
圖18所示的層級可有效地管理已擦除區(qū)塊記錄,并且對被存儲于所述控制器的RAM中的所述區(qū)塊地址列表提供完整的安全性。可以不頻繁的方式在所述區(qū)塊地址列表及一個或一個以上的MAP扇區(qū)780之間交換已擦除的區(qū)塊項(xiàng)目。可于電源關(guān)閉之后的系統(tǒng)初始化期間,通過存儲于快閃存儲器中的扇區(qū)中的所述已擦除區(qū)塊列表及地址轉(zhuǎn)換表中的信息,以及有限地掃描快閃存儲器中少量被參照的數(shù)據(jù)區(qū)塊,來重建所述列表。
用于更新已擦除元區(qū)塊記錄的層級所采用的算法可以下面的順序來配置使用已擦除區(qū)塊將來自所述MAP區(qū)塊750的區(qū)塊叢以地址順序與來自所述CBL 740的區(qū)塊地址叢交錯,其反映的是區(qū)塊被所述主機(jī)更新的順序。對大部份的元區(qū)塊大小與系統(tǒng)存儲器容量而言,單一MAP扇區(qū)可針對所述系統(tǒng)中的所有元區(qū)塊提供位圖。在此情況下,已擦除的區(qū)塊必定會以和此MAP扇區(qū)中記錄的相同的地址順序來配置使用。
擦除區(qū)塊管理操作如上所述,ABL 610是具有可經(jīng)配置供使用的已擦除元區(qū)塊及最近已配置為數(shù)據(jù)更新區(qū)塊的元區(qū)塊的地址項(xiàng)目的列表。ABL中區(qū)塊地址的實(shí)際數(shù)量介于為系統(tǒng)設(shè)計變量的最大及最小限制之間。在制造期間,格式化的ABL項(xiàng)目的數(shù)量是存儲卡類型及容量的函數(shù)。此外,由于可用的已擦除區(qū)塊的數(shù)量會因壽命期間的區(qū)塊故障而縮減,也會縮減接近系統(tǒng)壽命終點(diǎn)處ABL中項(xiàng)目的數(shù)量。例如,在填充操作后,ABL中的項(xiàng)目可指定可用于以下用途的區(qū)塊。每個區(qū)塊具有一個項(xiàng)目的部分寫入數(shù)據(jù)更新區(qū)塊的項(xiàng)目不超過系統(tǒng)對同時開啟的最大更新區(qū)塊量的限制。用于配置為數(shù)據(jù)更新區(qū)塊的擦除區(qū)塊介于一至二十個項(xiàng)目之間。有已擦除區(qū)塊的四個項(xiàng)目配置為控制區(qū)塊。
ABL填充操作由于ABL 610會因?yàn)榕渲枚兂珊谋M,因此需要進(jìn)行重新填充。填充ABL的操作發(fā)生于控制寫入操作期間。當(dāng)必須配置區(qū)塊,但ABL含有不足用于配置為數(shù)據(jù)更新區(qū)塊或其它某個控制數(shù)據(jù)更新區(qū)塊的已擦除區(qū)塊項(xiàng)目時,此操作被觸發(fā)。在控制寫入期間,ABL填充操作和GAT更新操作同時進(jìn)行。
在ABL填充操作期間會發(fā)生以下動作。
1.保留具有目前數(shù)據(jù)更新區(qū)塊的屬性的ABL項(xiàng)目。
2.保留具有已關(guān)閉數(shù)據(jù)更新區(qū)塊的屬性的ABL項(xiàng)目,除非所述區(qū)塊的某個項(xiàng)目正于所述同時進(jìn)行的GAT更新操作中被寫入,在此情況下則從所述ABL中移除所述項(xiàng)目。
3.保留用于未配置的擦除區(qū)塊的ABL項(xiàng)目。
4.壓縮ABL以移除因移除項(xiàng)目所產(chǎn)生的間隙,從而以維持項(xiàng)目的順序。
5.通過附加來自所述EBB列表中下次可用的項(xiàng)目,來完全填充所述ABL。
6.利用所述ABL中所述目前的項(xiàng)目來覆寫所述ABB列表。
CBL清空操作CBL是控制器RAM中已擦除區(qū)塊地址的列表,對已擦除區(qū)塊項(xiàng)目數(shù)量的限制與ABL相同。清空CBL的操作發(fā)生于控制寫入操作期間。因此,其和ABL填充/GAT更新操作或CBI區(qū)塊寫入操作同時進(jìn)行。在CBL清空操作中,會從CBL 740移除項(xiàng)目并將其寫入CBB列表776。
MAP交換操作當(dāng)EBB列表774已為清空時,在MAP扇區(qū)780的擦除區(qū)塊信息及EBM扇區(qū)760間的MAP交換操作可定期發(fā)生于控制寫入操作期間。如果系統(tǒng)中的所有已擦除元區(qū)塊均記錄在EBM扇區(qū)760中,將無任何MAP扇區(qū)780存在且不會執(zhí)行任何MAP交換。在MAP交換操作期間,用于將已擦除區(qū)塊饋送給EBB 774的MAP扇區(qū)被視為來源MAP扇區(qū)782。相反,用于從CBB 776接收已擦除區(qū)塊的MAP扇區(qū)被視為目的地MAP扇區(qū)784。如果只存在一個MAP扇區(qū),則其可當(dāng)作來源及目的地MAP扇區(qū),其定義如下。
在MAP交換期間會執(zhí)行以下動作。
1.以遞增指針的方式為基礎(chǔ),選擇一來源MAP扇區(qū)。
2.以不在所述來源MAP扇區(qū)中的第一CBB項(xiàng)目中的區(qū)塊地址為基礎(chǔ)來選擇一目的MAP扇區(qū)。
3.如所述CBB中相關(guān)項(xiàng)目所定義的方式來更新所述目的MAP扇區(qū),并且從所述CBB中移除所述項(xiàng)目。
4.將所述已更新的目的MAP扇區(qū)寫入至所述MAP區(qū)塊之中,除非不存在分離的來源MAP扇區(qū)。
5.如所述CBB中相關(guān)項(xiàng)目所定義的方式來更新所述來源MAP扇區(qū),并且從所述CBB中移除所述項(xiàng)目。
6.將所述CBB中剩余的項(xiàng)目附加至所述EBB之中。
7.利用所述來源MAP扇區(qū)所定義的已擦除扇區(qū)地址盡可能地填充所述EBB。
8.將所述已更新的來源MAP扇區(qū)寫入至所述MAP區(qū)塊中。
9.將一已更新的EBM扇區(qū)寫入至所述MAP區(qū)塊中。
列表管理圖18顯示各種列表間控制及目錄信息的分布與流程。為了方便,在列表組件間移動項(xiàng)目或變更項(xiàng)目屬性的操作(在圖18中標(biāo)為[A]至[O])說明如下。
在將擦除區(qū)塊配置為主機(jī)數(shù)據(jù)的更新區(qū)塊時,將其在ABL中的項(xiàng)目屬性從已擦除的ABL區(qū)塊變更為開啟的更新區(qū)塊。
在將已擦除的區(qū)塊配置為控制區(qū)塊時,移除其在ABL中的項(xiàng)目。
在建立一具有開啟更新區(qū)塊屬性的ABL項(xiàng)目時,將關(guān)聯(lián)的原始區(qū)塊字段添加至項(xiàng)目,以記錄被更新的邏輯群組的原始元區(qū)塊地址??蓮腉AT中獲得此信息。
關(guān)閉更新區(qū)塊時,將其在ABL中的項(xiàng)目屬性從開啟的更新區(qū)塊變更為關(guān)閉的更新區(qū)塊。
關(guān)閉更新區(qū)塊時,擦除其關(guān)聯(lián)的原始區(qū)塊,且將其在ABL中項(xiàng)目的關(guān)聯(lián)原始區(qū)塊字段的屬性變更為已擦除的原始區(qū)塊。
在ABL填充操作期間,將任何其地址在相同控制寫入操作期間于GAT中更新的已關(guān)閉更新區(qū)塊的項(xiàng)目從ABL中移除。
在ABL填充操作期間,在從ABL移除已關(guān)閉的更新區(qū)塊的項(xiàng)目時,將其關(guān)聯(lián)的已擦除原始區(qū)塊的項(xiàng)目移至CBL。
在擦除控制區(qū)塊時,將其所用項(xiàng)目添加至CBL。
在ABL填充操作期間,從EBB列表將已擦除區(qū)塊項(xiàng)目移至ABL,且被賦以已擦除的ABL區(qū)塊的屬性。
在ABL填充操作期間修改所有相關(guān)的ABL項(xiàng)目后,ABL中的區(qū)塊地址將取代ABB列表中的區(qū)塊地址。
與控制寫入期間的ABL填充操作同時進(jìn)行,將CBL中已擦除區(qū)塊的項(xiàng)目移至CBB列表。
在MAP交換操作期間,將所有相關(guān)項(xiàng)目從CBB列表移至MAP目的地扇區(qū)。
在MAP交換操作期間,從CBB列表將所有相關(guān)項(xiàng)目移至MAP來源扇區(qū)。
在MAP交換操作期間的[L]與[M]之后,將所有其余項(xiàng)目從CBB列表移至EBB列表。
在MAP交換操作期間的[N]之后,如果可能,從MAP來源扇區(qū)移動除了在[M]中移動的項(xiàng)目以外的項(xiàng)目,以填充EBB列表。
邏輯對物理地址轉(zhuǎn)換為了在快閃存儲器中定位邏輯扇區(qū)的物理位置,圖2所示的邏輯對物理地址轉(zhuǎn)換模塊140可執(zhí)行邏輯對物理地址轉(zhuǎn)換。除了最近已更新的邏輯群組外,可以使用常駐在快閃存儲器200中的群組地址表(GAT)或在控制器RAM 130中的GAT高速緩存來執(zhí)行大多數(shù)的轉(zhuǎn)換。最近已更新的邏輯群組的地址轉(zhuǎn)換會需要查詢主要常駐在控制器RAM 130中的更新區(qū)塊的地址列表。因此,邏輯扇區(qū)地址的邏輯對物理地址轉(zhuǎn)換的程序視與扇區(qū)所在的邏輯群組關(guān)聯(lián)的區(qū)塊的類型而定。區(qū)塊的類型如下完整區(qū)塊、循序數(shù)據(jù)更新區(qū)塊、混亂數(shù)據(jù)更新區(qū)塊、關(guān)閉的數(shù)據(jù)更新區(qū)塊。
圖19為顯示邏輯對物理地址轉(zhuǎn)換程序的流程圖。實(shí)質(zhì)上,先使用邏輯扇區(qū)地址查詢各種更新目錄(例如,開啟的更新區(qū)塊列表及關(guān)閉的更新區(qū)塊列表),即可定位對應(yīng)的元區(qū)塊及物理扇區(qū)。如果關(guān)聯(lián)的元區(qū)塊并不是更新程序的一部分,則由GAT提供目錄信息。邏輯對物理地址轉(zhuǎn)換包括以下步驟步驟800給定一邏輯扇區(qū)地址。
步驟810查詢控制器RAM中開啟的更新區(qū)塊列表614的給定邏輯地址(見圖15與18)。如果查詢失敗,繼續(xù)進(jìn)行到步驟820,否則繼續(xù)進(jìn)行到步驟830。
步驟820在關(guān)閉的更新區(qū)塊列表616中查詢給定的邏輯地址。如果查詢失敗,則給定的邏輯地址并不是任何更新程序的一部分;繼續(xù)進(jìn)行到步驟870,以進(jìn)行GAT地址轉(zhuǎn)換。否則繼續(xù)進(jìn)行到步驟860,以進(jìn)行關(guān)閉的更新區(qū)塊地址轉(zhuǎn)換。
步驟830如果含有給定邏輯地址的更新區(qū)塊為循序,則繼續(xù)進(jìn)行到步驟840,以進(jìn)行循序更新區(qū)塊地址轉(zhuǎn)換。否則繼續(xù)進(jìn)行到步驟850,以進(jìn)行混亂更新區(qū)塊地址轉(zhuǎn)換。
步驟840使用循序更新區(qū)塊地址轉(zhuǎn)換來取得元區(qū)塊地址。繼續(xù)進(jìn)行到步驟880。
步驟850使用混亂更新區(qū)塊地址轉(zhuǎn)換來取得元區(qū)塊地址。繼續(xù)進(jìn)行到步驟880。
步驟860使用關(guān)閉的更新區(qū)塊地址轉(zhuǎn)換來取得元區(qū)塊地址。繼續(xù)進(jìn)行到步驟880。
步驟870使用群組地址表(GAT)轉(zhuǎn)換來取得元區(qū)塊地址。繼續(xù)進(jìn)行到步驟880。
步驟880將元區(qū)塊地址轉(zhuǎn)換為物理地址。轉(zhuǎn)換方法視元區(qū)塊是否已經(jīng)重新鏈接而定。
步驟890取得物理扇區(qū)地址。
下文將更詳細(xì)說明所述各種地址轉(zhuǎn)換處理循序更新區(qū)塊地址轉(zhuǎn)換(步驟840)
從開啟的更新區(qū)塊列表614(圖15及18)的信息即可直接完成和循序更新區(qū)塊關(guān)聯(lián)的邏輯群組中的目標(biāo)邏輯扇區(qū)地址的地址轉(zhuǎn)換,說明如下。
1.根據(jù)列表的“頁標(biāo)記”及“寫入的扇區(qū)號碼”字段確定目標(biāo)邏輯扇區(qū)是否已經(jīng)定位在更新區(qū)塊或其關(guān)聯(lián)的原始區(qū)塊中。
2.從列表中讀取適合目標(biāo)邏輯扇區(qū)的元區(qū)塊地址。
3.根據(jù)合適的“頁標(biāo)記”字段確定元區(qū)塊內(nèi)的扇區(qū)地址。
混亂更新區(qū)塊地址轉(zhuǎn)換(步驟850)與混亂更新區(qū)塊關(guān)聯(lián)的邏輯群組中的目標(biāo)邏輯扇區(qū)地址的地址轉(zhuǎn)換序列如下。
1.如果根據(jù)RAM中的混亂扇區(qū)列表確定了扇區(qū)是最近寫入的扇區(qū),則可直接根據(jù)其在此列表中的位置來完成地址轉(zhuǎn)換。
2.在CBI區(qū)塊中最近寫入的扇區(qū)在其混亂區(qū)塊數(shù)據(jù)字段內(nèi)含有和目標(biāo)邏輯扇區(qū)地址相關(guān)的混亂更新區(qū)塊的物理地址。其在間接扇區(qū)索引字段內(nèi)也含有有關(guān)此混亂更新區(qū)塊最后寫入的CBI扇區(qū)的CBI區(qū)塊內(nèi)的偏移(見圖16A-16E)。
3.所述些字段中的信息均被快取存儲于RAM之中,而不需要在后續(xù)的地址轉(zhuǎn)換期間來讀取所述扇區(qū)。
4.讀取步驟3中由間接扇區(qū)索引字段所識別的CBI扇區(qū)。
5.將最近被存取的混亂更新子群的直接扇區(qū)索引字段快取存儲于RAM之中,而不需要執(zhí)行步驟4中的讀取以重復(fù)存取相同的混亂更新區(qū)塊。
6.在步驟4或步驟5讀取的直接扇區(qū)索引字段接著識別有關(guān)含有目標(biāo)邏輯扇區(qū)地址的邏輯子群組的CBI扇區(qū)。
7.從步驟6中識別的CBI扇區(qū)讀取目標(biāo)邏輯扇區(qū)地址的混亂區(qū)塊索引項(xiàng)目。
8.所述最近被讀取的混亂區(qū)塊索引字段可被快取存儲于控制器RAM之中,而不需要執(zhí)行步驟4與步驟7處的讀取以重復(fù)存取相同的邏輯子群組。
9.混亂區(qū)塊索引項(xiàng)目定義目標(biāo)邏輯扇區(qū)在混亂更新區(qū)塊或關(guān)聯(lián)的原始區(qū)塊中的位置。如果目標(biāo)邏輯扇區(qū)的有效副本是在原始區(qū)塊中,則使用原始元區(qū)塊及頁標(biāo)記信息來將其定位。
關(guān)閉的更新區(qū)塊地址轉(zhuǎn)換(步驟860)可從關(guān)閉的區(qū)塊更新列表的信息直接完成與關(guān)閉的更新區(qū)塊關(guān)聯(lián)的邏輯群組中目標(biāo)邏輯扇區(qū)地址的地址轉(zhuǎn)換(參見圖18),說明如下。
1.從列表中讀取指派給目標(biāo)邏輯群組的元區(qū)塊地址。
2.根據(jù)列表中的“頁標(biāo)記”字段確定元區(qū)塊內(nèi)的扇區(qū)地址。
GAT地址轉(zhuǎn)換(步驟870)如果邏輯群組不受到開啟或關(guān)閉的區(qū)塊更新列表的參考,則其在GAT中的項(xiàng)目為有效。由GAT所參考的邏輯群組中目標(biāo)邏輯扇區(qū)地址的地址轉(zhuǎn)換序列如下。
1.評估RAM中可用GAT高速緩存的范圍,以確定目標(biāo)邏輯群組的項(xiàng)目是否包含在GAT高速緩存中。
2.如果在步驟1中發(fā)現(xiàn)目標(biāo)邏輯群組,則GAT高速緩存含有完整的群組地址信息,其中包括元區(qū)塊地址及頁標(biāo)記,因此允許轉(zhuǎn)換目標(biāo)邏輯扇區(qū)地址。
3.如果GAT高速緩存中沒有目標(biāo)地址,則必須讀取目標(biāo)GAT區(qū)塊的GAT索引,以識別有關(guān)目標(biāo)邏輯群組地址的GAT扇區(qū)的位置。
4.最后存取的GAT區(qū)塊的GAT索引保留在控制器RAM中,且不用從快閃存儲器讀取扇區(qū)即可存取。
5.將一份由每個GAT區(qū)塊的元區(qū)塊地址及被寫入每個GAT區(qū)塊之中的扇區(qū)數(shù)量所組成的列表保存在控制器RAM之中。假使步驟4處無法取得必要的GAT索引,則可立刻從快閃存儲器之中讀取。
6.從步驟4或步驟6處所獲得的GAT索引所定義的GAT區(qū)塊中的扇區(qū)位置中讀取有關(guān)目標(biāo)邏輯群組地址的GAT扇區(qū)。以含有目標(biāo)項(xiàng)目的扇區(qū)的子部分來更新GAT高速緩存。
7.從目標(biāo)GAT項(xiàng)目內(nèi)的元區(qū)塊地址及“頁標(biāo)記”字段取得目標(biāo)扇區(qū)地址。
元區(qū)塊對物理地址轉(zhuǎn)換(步驟880)如果和元區(qū)塊地址關(guān)聯(lián)的旗標(biāo)指示元區(qū)塊已經(jīng)被重新鏈接,則從BLM區(qū)塊讀取相關(guān)的LT扇區(qū),以確定目標(biāo)扇區(qū)地址的擦除區(qū)塊地址。否則,從元區(qū)塊地址直接確定擦除區(qū)塊地址。
控制數(shù)據(jù)管理圖20顯示在存儲器管理的操作過程中,對控制數(shù)據(jù)結(jié)構(gòu)執(zhí)行的操作的層級。數(shù)據(jù)更新管理操作可對常駐在RAM中的各種列表發(fā)生作用??刂茖懭氩僮骺蓪扉W存儲器中各種控制數(shù)據(jù)扇區(qū)及專用區(qū)塊發(fā)生作用,并且與RAM中的列表交換數(shù)據(jù)。
在RAM中針對ABL、CBL以及混亂扇區(qū)列表來執(zhí)行數(shù)據(jù)更新管理操作。當(dāng)一已擦除區(qū)塊被配置為更新區(qū)塊或控制區(qū)塊時,或是關(guān)閉更新區(qū)塊時,便會更新所述ABL。當(dāng)擦除一控制區(qū)塊時,或是將一已關(guān)閉的更新區(qū)塊的某個項(xiàng)目寫入所述GAT之中時,便會更新所述CBL。當(dāng)一扇區(qū)被寫入一混亂更新區(qū)塊之中時,便會更新所述更新混亂扇區(qū)列表。
控制寫入操作使得來自RAM中的控制數(shù)據(jù)結(jié)構(gòu)的信息被寫入快閃存儲器中的控制數(shù)據(jù)結(jié)構(gòu)之中,必要時會隨之更新快閃存儲器與RAM之中其它支持的控制數(shù)據(jù)結(jié)構(gòu)。當(dāng)所述ABL不含擬被配置為更新區(qū)塊的已擦除區(qū)塊的任何其它項(xiàng)目時,或是再寫入所述CBI區(qū)塊時,便會觸發(fā)控制寫入操作。
在優(yōu)選實(shí)施例中,會在每次控制寫入操作期間執(zhí)行ABL填充操作、CBL清空操作及EBM扇區(qū)更新操作。當(dāng)含有EBM扇區(qū)的MAP區(qū)塊已滿時,將有效的EBM及MAP扇區(qū)復(fù)制到已配置的已擦除區(qū)塊,然后擦除先前的MAP區(qū)塊。
在每次控制寫入操作期間,寫入一個GAT扇區(qū),并相應(yīng)地修改關(guān)閉的更新區(qū)塊列表。當(dāng)GAT區(qū)塊變滿時,執(zhí)行GAT再寫入操作。
如上述,經(jīng)過某些混亂扇區(qū)寫入操作之后,便會寫入一CBI扇區(qū)。當(dāng)CBI區(qū)塊變滿時,將有效的CBI扇區(qū)復(fù)制到已配置的擦除區(qū)塊中,然后擦除先前的CBI區(qū)塊。
如上述,在EBM扇區(qū)的EBB列表中沒有其它已擦除的區(qū)塊項(xiàng)目時執(zhí)行MAP交換操作。
每次再寫入MAP區(qū)塊時,在專用的MAPA區(qū)塊中寫入用于記錄MAP區(qū)塊的目前地址的MAP地址(MAPA)扇區(qū)。當(dāng)MAPA區(qū)塊變滿時,將有效的MAPA扇區(qū)復(fù)制到已配置的已擦除區(qū)塊,然后擦除先前的MAPA區(qū)塊。
每次再寫入MAPA區(qū)塊時,將引導(dǎo)扇區(qū)寫入目前的引導(dǎo)區(qū)塊中。當(dāng)引導(dǎo)區(qū)塊變滿時,將目前版本的引導(dǎo)區(qū)塊中的有效引導(dǎo)扇區(qū)復(fù)制到備份版本,然后所述版本再變成目前的版本。先前的目前版本會被擦除并變成備份版本,并將有效的引導(dǎo)扇區(qū)寫回其中。
分散在多個存儲器平面上的存儲器的對準(zhǔn)如先前結(jié)合圖4及圖5A-5C所述,為了增加性能,會并行操作多個存儲器平面。基本上,各平面有其自己的感測放大器組作為讀取及程序電路的一部分,以并行服務(wù)跨越平面的存儲器單元的對應(yīng)頁。在結(jié)合多個平面時,可并行操作多個頁,使得性能更為提高。
根據(jù)本發(fā)明的另一方面,對于一被組織成可擦除區(qū)塊且由多個存儲器平面所構(gòu)成(因而可并行地讀取多個邏輯單位或是將多個邏輯單位并行地編程到所述多個平面之中)的存儲器陣列,當(dāng)要更新存儲于特定存儲器平面中的第一區(qū)塊的原始邏輯單位時,會供應(yīng)所需以將已更新的邏輯單位保持在和原始相同的平面中。這可通過以下方式來完成將已更新的邏輯單位記錄到第二區(qū)塊的仍在相同平面中的下一個可用位置。優(yōu)選將邏輯單位存儲在平面中和其其它版本相同的偏移位置,使得給定邏輯單位的所有版本由相同組的感測電路予以服務(wù)。
據(jù)此,在一項(xiàng)優(yōu)選實(shí)施例中,以邏輯單位的目前版本來填補(bǔ)介于上一個編程存儲器單元與下一個可用平面對準(zhǔn)存儲器單位之間的任何中間間隙。將邏輯上位于最后被編程的邏輯單位后面的邏輯單位的目前版本以及邏輯上位于被存儲在下一個可用的平面對準(zhǔn)存儲器單位中的邏輯單位前面的邏輯單位的目前版本填入間隙中,便可完成所述填補(bǔ)操作。
依此方式,將邏輯單位的所有版本維持在具有和原始相同偏移的相同平面中,致使在垃圾收集操作中,不必從不同平面檢索邏輯單位的最新版本,以免降低性能。在一項(xiàng)優(yōu)選實(shí)施例中,利用最新的版本來更新或填補(bǔ)每個平面上的每個存儲器單位。因此,在多個平面上進(jìn)行并行操作時,邏輯單位將會具有邏輯循序順序而無需進(jìn)一步重新對準(zhǔn)。
此方案通過允許在平面上重新對準(zhǔn)邏輯群組的邏輯單位的最新版本,且不必搜集不同存儲器平面的最新版本,而縮短合并混亂區(qū)塊的時間。這很有好處,其中主機(jī)接口的性能規(guī)格可定義由存儲器系統(tǒng)完成扇區(qū)寫入操作的最大等待時間。
圖21顯示由多個存儲器平面所構(gòu)成的存儲器陣列。存儲器平面可以來自相同的存儲器芯片或多個存儲器芯片。各平面910具有其自己的讀取及程序電路組912以并行服務(wù)存儲器單元的頁914。在不失一般性的前提下,在所示的范例中,存儲器陣列具有四個并行操作的平面。
一般而言,邏輯單位是主機(jī)系統(tǒng)存取的最小單位。通常一個邏輯單位是大小為512字節(jié)的扇區(qū)。頁是平面中并行讀取或編程的最大單位。通常一個邏輯頁含有一個或一個以上邏輯單位。因此,在結(jié)合多個平面時,可將并行讀取或編程的最大總數(shù)單位視為存儲器單元的元頁,其中元頁是由多個平面中每一平面的頁所構(gòu)成。例如,如MP0的元頁具有四個頁,每一個頁分別來自各平面P0、P1、P2及P3,并行存儲在邏輯頁LP0、LP1、LP2、LP3中。因此,和僅在一個平面中的操作相比,存儲器的讀取及寫入性能增加四倍。
存儲器陣列進(jìn)一步組織成多個元區(qū)塊,例如MB0、...、MBj,其中各元區(qū)塊內(nèi)的所有存儲器單元可作為一個單位一起擦除。諸如MB0的元區(qū)塊由多個存儲器位置構(gòu)成,以用于存儲數(shù)據(jù)的邏輯頁914,例如LP0-LPN-1。元區(qū)塊中的邏輯頁根據(jù)其填充于元區(qū)塊中的順序,按預(yù)定的序列分布于四個平面P0、P1、P2及P3上。例如,在按邏輯上循序順序填充邏輯頁時,會以第一平面中第一頁、第二平面中第二頁等等的循環(huán)順序訪問所述平面。在到達(dá)最后的平面后,填充會以循環(huán)方式返回,以從下一個元頁的第一平面重新開始。依此方式,即可在所有平面并行操作時并行存取一連串連續(xù)的邏輯頁。
一般而言,如果有W個平面并行操作且元區(qū)塊是按邏輯上循序順序進(jìn)行填充,則元區(qū)塊中第k個邏輯頁將常駐在平面x中,其中x=k MOD W。例如,如果有四個平面,W=4,在按邏輯循序順序填充區(qū)塊時,第5個邏輯頁LP5將常駐在由5 MOD 4給定的平面中,即平面1,如圖21所示。
每一存儲器平面中的存儲器操作是由一組讀取/寫入電路912來執(zhí)行。進(jìn)出每一讀取/寫入電路的數(shù)據(jù)在控制器920控制下通過數(shù)據(jù)總線930進(jìn)行傳送??刂破?20中的緩沖器922可協(xié)助緩沖經(jīng)由數(shù)據(jù)總線930的數(shù)據(jù)傳送。尤其在第一平面中的操作需要存取第二平面中的數(shù)據(jù)時,將需要兩個步驟的程序。控制器先從所述第二平面讀出數(shù)據(jù),然后經(jīng)由數(shù)據(jù)總線及緩沖器傳送至第一平面。事實(shí)上,在大多數(shù)的存儲器架構(gòu)中,在兩個不同的位線之間傳送數(shù)據(jù)也需要通過數(shù)據(jù)總線920交換數(shù)據(jù)。
至少,這涉及從一個平面中的一組讀取/寫入電路傳送出,并傳送進(jìn)另一平面中的另一組讀取/寫入電路。在所述平面是來自不同芯片的情況下,將需要在芯片之間進(jìn)行傳送。本發(fā)明可提供用于存儲器區(qū)塊管理的結(jié)構(gòu)及方案,以避免一個平面從另一個平面存取數(shù)據(jù),以便將性能最大化。
如圖21所示,元頁由多個邏輯頁(每個平面中各一個)構(gòu)成。每個邏輯頁可能是由一個或一個以上的邏輯單位所組成。當(dāng)數(shù)據(jù)正以逐個邏輯單位的方式被記錄于一跨越所述平面的區(qū)塊中時,每個邏輯單位便將會落在四個存儲器平面之一中。
在更新邏輯單位時會發(fā)生平面對準(zhǔn)問題。在目前的范例中,為了便于解釋,將邏輯單位視為512字節(jié)的邏輯扇區(qū),一個邏輯頁也是一個邏輯單位寬。由于快閃存儲器不允許在未先擦除整個區(qū)塊的情況下再寫入?yún)^(qū)塊的一部分,因此不會將邏輯頁的更新寫入現(xiàn)有的位置之上,而是將其記錄在區(qū)塊未使用的位置中。然后會將邏輯單位的先前版本視為過時。在一些更新后,區(qū)塊可含有一些由于已經(jīng)更新因此變成過時的邏輯單位。然后此區(qū)塊可以說是“不干凈的”,垃圾收集操作會忽略不干凈的邏輯單位而收集各個邏輯單位的最新版本并按邏輯上循序順序?qū)⑵渲匦掠涗浽谝粋€或一個以上新的區(qū)塊中。然后擦除并再循環(huán)不干凈的區(qū)塊。
當(dāng)已更新邏輯單位被記錄于某一區(qū)塊中下個未被使用的位置之中時,其通常不會被記錄于和先前版本相同的存儲器平面之中。當(dāng)要進(jìn)行垃圾收集操作(如合并或壓縮時),邏輯單位的最新版本便會被重新記錄于和原來相同的平面之中,以維持原來的順序。然而,如果必須從另一個平面檢索最新版本,性能將會降低。
因此,根據(jù)本發(fā)明的另一方面,當(dāng)給定平面中存儲的第一區(qū)塊的原始邏輯單位擬更新時,預(yù)備將更新的邏輯單位保留在與原先相同的平面中。這可通過以下方式來完成將已更新的邏輯單位記錄到第二區(qū)塊的仍在相同平面中的下一個可用位置。在一項(xiàng)優(yōu)選實(shí)施例中,會以和原始區(qū)塊中原始邏輯單位的相同相對位置的邏輯單位的目前版本,填補(bǔ)(即,通過復(fù)制來填充)任何在上一個編程存儲器單元和下一個可用平面對準(zhǔn)存儲器單元之間的中間間隙。
圖22A顯示根據(jù)本發(fā)明的一般實(shí)施例,具有平面對準(zhǔn)的更新方法的流程圖。
步驟950在一被組織成多個區(qū)塊的非易失性存儲器之中,每個區(qū)塊均被分割成可一起擦除的多個存儲器單位,每個存儲器單位用于存儲一個數(shù)據(jù)邏輯單位。
步驟952以多個存儲器平面構(gòu)成存儲器,各平面具有一組用于并行服務(wù)存儲器頁的感測電路,所述存儲器頁含有一個或一個以上存儲器單位。
步驟954依照第一順序?qū)⑦壿媶挝坏牡谝话姹敬鎯τ诘谝粎^(qū)塊的多個存儲器單位之中,每個第一版本邏輯單位均被存儲于所述存儲器平面之一中。
步驟956依照不同于第一順序的第二順序?qū)⑦壿媶挝坏暮罄m(xù)版本存儲于第二區(qū)塊之中,每個后續(xù)版本均被存儲于和第一版本相同的平面中下一個可用的存儲器單位之中,以便可利用同一組感測電路從同一平面中存取一邏輯單位的所有的版本。
圖22B顯示在圖22A所示的流程圖中存儲更新的步驟的優(yōu)選實(shí)施例。
步驟956′包括步驟957、步驟958及步驟959。
步驟957將各區(qū)塊分割成元頁,各元頁由各平面的一頁所構(gòu)成。此步驟可在任一存儲步驟之前執(zhí)行。
步驟958根據(jù)和第一順序不同的第二順序?qū)⑦壿媶挝坏暮罄m(xù)版本存儲至第二區(qū)塊,各后續(xù)版本存儲于具有元頁中和第一版本相同偏移的下一個可用存儲器單位中。
步驟959和邏輯單位的后續(xù)版本的存儲同時進(jìn)行,根據(jù)第一順序復(fù)制邏輯單位的目前版本,從而以逐個元頁的方式來填補(bǔ)在所述下一個可用存儲器單位之前的任何未使用存儲器單位。
圖23A顯示不顧平面對準(zhǔn)將邏輯單位按循序順序?qū)懭胙蚋聟^(qū)塊的范例。所述范例顯示出每個邏輯頁的大小均為一個邏輯扇區(qū),例如LS0、LS1...。在四平面的范例中,每個區(qū)塊(例如MB0)均可視為被分割成多個元頁MP0、MP1、...,其中每個元頁(例如MP0)均含有四個扇區(qū)(例如LS0、LS1、LS2以及LS3),每個扇區(qū)分別來自平面P0、P1、P2以及P3。所以,所述區(qū)塊會以循環(huán)順序逐個扇區(qū)地被填入平面P0、P1、P2以及P3中的邏輯單位之中。
在主機(jī)寫入操作#1中,正在更新邏輯扇區(qū)LS5-LS8中的數(shù)據(jù)。更新成為LS5′-LS8′的數(shù)據(jù)記錄在始于第一可用位置的新配置的更新區(qū)塊中。
在主機(jī)寫入操作#2中,正在更新邏輯扇區(qū)LS9-LS12中數(shù)據(jù)的程序段。將更新成為LS9′-LS12′的數(shù)據(jù)記錄在緊接在最后寫入結(jié)束處之后的位置中的更新區(qū)塊中。圖中顯示兩次主機(jī)寫入的方式是以邏輯循序方式將更新數(shù)據(jù)記錄于更新區(qū)塊之中,即LS5′-LS12′。更新區(qū)塊可視為循序更新區(qū)塊,因其已按邏輯上循序的順序被填充。記錄在更新區(qū)塊中的更新數(shù)據(jù)使得原始區(qū)塊中對應(yīng)的數(shù)據(jù)過時。
然而,將更新邏輯扇區(qū)根據(jù)下一個可用位置但卻不顧平面對準(zhǔn)而記錄在更新區(qū)塊中。例如,扇區(qū)LS5原來是記錄在平面P1中,但已更新的LS5′現(xiàn)在則記錄在P0中。同樣,其它更新扇區(qū)全未對準(zhǔn)。
圖23B顯示不顧平面對準(zhǔn)將邏輯單位按非循序順序?qū)懭牖靵y更新區(qū)塊的范例。
在主機(jī)寫入操作#1中,更新存儲于原始元區(qū)塊中的給定邏輯群組的邏輯扇區(qū)LS10-LS11。已更新的邏輯扇區(qū)LS10′-LS11′被存儲到新配置的更新區(qū)塊中。此時,更新區(qū)塊為循序的更新區(qū)塊。在主機(jī)寫入操作#2中,將邏輯扇區(qū)LS5-LS6更新成為LS5′-LS6′且將其記錄在緊接上一個寫入之后的位置中的更新區(qū)塊中。這將循序的更新區(qū)塊轉(zhuǎn)換為混亂的更新區(qū)塊。在主機(jī)寫入操作#3中,再次更新邏輯扇區(qū)LS10′且將其記錄在更新區(qū)塊的下一個位置中成為LS10″。此時,更新區(qū)塊中的LS10″取代先前記錄中的LS10′,而LS10′又取代原始區(qū)塊中的LS10。在主機(jī)寫入操作#4中,再次更新邏輯扇區(qū)LS10″中的數(shù)據(jù)且將其記錄在更新區(qū)塊的下一個位置中成為LS10。因此,LS10現(xiàn)在是邏輯扇區(qū)LS10的最新且唯一有效的版本。LS10的所有先前版本現(xiàn)在均已過時。在主機(jī)寫入操作#5中,更新邏輯扇區(qū)LS30中的數(shù)據(jù)且將其記錄在更新區(qū)塊中成為LS30′。在此范例中,可按任何順序且以任何重復(fù)將邏輯群組內(nèi)的邏輯單位寫入混亂更新區(qū)塊。
同樣,根據(jù)下一個可用位置而不顧平面對準(zhǔn),將更新邏輯扇區(qū)記錄在更新區(qū)塊中。例如,扇區(qū)LS10原來是記錄在平面P2(即,MP2、第三平面)中,但更新LS10′現(xiàn)在卻記錄在P0(即,MP0′,第一平面)中。同樣,在主機(jī)寫入#3中,邏輯扇區(qū)LS10′再次更新成為LS10″,且結(jié)果也在平面P0(MP1′的第一平面)的下一個可用位置中。因此,一般而言,可見,將更新扇區(qū)記錄至區(qū)塊的下一個可用位置會使更新扇區(qū)被存儲在和其先前版本不同的平面中。
中間間隙已通過填補(bǔ)來填充的平面對準(zhǔn)的循序更新區(qū)塊圖24A顯示根據(jù)本發(fā)明的一項(xiàng)優(yōu)選實(shí)施例,具有平面對準(zhǔn)及填補(bǔ)的圖23A的循序更新范例。
在主機(jī)寫入操作#1中,將更新成為LS5′-LS8′的數(shù)據(jù)記錄在始于第一可用平面對準(zhǔn)位置的新配置的更新區(qū)塊中。在此情況下,LS5原來在P1中,P1是元頁的第二平面。因此,會在更新區(qū)塊的第一可用元頁MP0的對應(yīng)平面中編程LS5′-LS7′。同時,會以原始區(qū)塊元頁中在LS5前的邏輯扇區(qū)LS4的目前版本來填補(bǔ)MP0′中未使用的第一平面的間隙。然后將原始LS4處理成過時的數(shù)據(jù)。然后將剩余的LS8′記錄在下一個元頁MP1′的第一個平面中并已平面對準(zhǔn)。
在主機(jī)寫入操作#2中,將更新成為LS9′-LS12′的數(shù)據(jù)記錄在下一個可用平面對準(zhǔn)位置中的更新區(qū)塊中。因此,將LS9′記錄在下一個可用的平面對準(zhǔn)存儲器單位中,即MP1′的第二平面。在這種情況下,不會造成任何間隙,也不必須進(jìn)行任何填補(bǔ)。更新區(qū)塊可視為循序更新區(qū)塊,因其已按邏輯上循序的順序填入。此外,其將因各更新邏輯單位和其原始的一樣都在相同平面中而已平面對準(zhǔn)。
具有中間間隙的平面對準(zhǔn)的混亂更新區(qū)塊圖24B顯示根據(jù)本發(fā)明的一項(xiàng)優(yōu)選實(shí)施例,具有平面對準(zhǔn)且不具有任何填補(bǔ)的圖23B的混亂更新范例。
在主機(jī)寫入操作#1中,將已更新的邏輯扇區(qū)LS10′-LS11′存儲在新配置的更新區(qū)塊中。不是將其存儲在下一個可用的存儲器單位中,而是將其存儲在下一個可用的平面對準(zhǔn)存儲器單位中。由于LS10′及LS11′原來分別存儲在平面P2及P3(原始區(qū)塊的MP2的第三及第四平面)中,所以下一個可用的平面對準(zhǔn)存儲器單位將在更新區(qū)塊的MP0′的第三及第四平面中。此時,更新區(qū)塊為非循序,其中將按“未填充”、“未填充”、LS10′及LS11′的順序填充元頁MP0的頁。
在主機(jī)寫入操作#2中,將邏輯扇區(qū)LS5-LS6更新成為LS5′-LS6′且將其記錄在下一個可用的平面對準(zhǔn)位置中的更新區(qū)塊中。因此,將原始區(qū)塊中MP1的第二(P1)及第三(P2)平面或存儲器單位中的LS5′及LS6′編程至更新區(qū)塊中下一個可用元頁MP1′的對應(yīng)的平面中。這會在MP1′中留下在前面未使用的第一平面。
在主機(jī)寫入操作#3中,再次更新邏輯扇區(qū)LS10′且將其記錄在更新區(qū)塊的下一個平面對準(zhǔn)位置中成為LS10″。因此,將其寫入下一個可用的第三平面,其將在MP2′中。這會在MP1′的最后平面及MP2′的前兩個平面中留下位于前面的間隙。這將會使得MP0′中的LS10′過時。
在主機(jī)寫入操作#4中,再次更新邏輯扇區(qū)LS10″中的數(shù)據(jù)并將其記錄在更新區(qū)塊中元頁MP2′的下一個可用第三平面中成為LS10。因此,LS10現(xiàn)在是邏輯扇區(qū)LS10的最新且唯一有效的版本。這會留下由MP2′的最后平面及MP3′的前兩個平面所組成的間隙。
在主機(jī)寫入操作#5中,更新邏輯扇區(qū)LS30中的數(shù)據(jù)且將其記錄在更新區(qū)塊中成為LS30′。由于原始的LS30常駐于元頁的P2或第三平面中,因此會將其寫入更新區(qū)塊中下一個可用的第三平面。在此情況下,其將是MP4′的第三平面。MP3′的最后平面與MP4′的前兩個平面之間將產(chǎn)生間隙。因此,此范例顯示可以平面對準(zhǔn)的方式,按照任何順序及任意重復(fù),將一邏輯群組內(nèi)的多個邏輯扇區(qū)寫入一混亂更新區(qū)塊中。在后續(xù)的垃圾收集操作中,將便利地由相同組的感測電路來服務(wù)給定邏輯扇區(qū)的所有版本,尤其是最新版本。
中間間隙已通過填補(bǔ)來填充的平面對準(zhǔn)的混亂更新區(qū)塊圖24C顯示根據(jù)本發(fā)明的另一項(xiàng)優(yōu)選實(shí)施例,具有平面對準(zhǔn)及填補(bǔ)的圖23B的混亂更新范例。
此操作和圖24B所示的相同,但中間間隙會先以填補(bǔ)加以填充。在主機(jī)寫入操作#1中,先以常駐在原始區(qū)塊中的LS8及LS9的目前版本,來填補(bǔ)元頁MP0′的第一及第二未使用的平面所產(chǎn)生的間隙。這會使原始區(qū)塊中的LS8及LS9過時。此時,更新區(qū)塊是循序的更新區(qū)塊,其中元頁MP0′的填充順序?yàn)長S8、LS9、LS10′及LS11′。
在主機(jī)寫入操作#2中,將因MP1′中在前面的未使用的第一平面而產(chǎn)生間隙,其將先以LS4進(jìn)行填補(bǔ)。這將使原始區(qū)塊中的LS4過時。和之前一樣,第二寫入可將循序更新區(qū)塊轉(zhuǎn)換為混亂更新區(qū)塊。
在主機(jī)寫入操作#3中,將因未使用的MP1′中的最后平面及MP2′的前兩個平面而產(chǎn)生間隙。先以在上一個編程的LS6′之后的LS7來填補(bǔ)MP1′的最后平面,然后以在LS10之前的邏輯單位(即LS8及LS9)來填補(bǔ)MP2′的前兩個平面。這會使MP0′中的LS10′及原始區(qū)塊中的LS7-LS9過時。
在主機(jī)寫入操作#4中,將產(chǎn)生由MP2′的最后平面及MP3′的前兩個平面所組成的間隙。MP2′的最后平面可由元頁MP2′中在最后寫入的LS10″之后的邏輯單位目前版本的LS11′進(jìn)行填補(bǔ)。MP3′的前兩個平面分別通過LS8及LS9進(jìn)行填補(bǔ),和元頁MP3′中在LS10之前的邏輯單位一樣。
在主機(jī)寫入操作#5中,也會相應(yīng)地分別以LS11′、LS28及LS29來填補(bǔ)從MP3′的最后平面到MP4′的前兩個平面之間的間隙。因此,此范例顯示可以平面對準(zhǔn)的方式,按照任何順序及任意重復(fù),將一邏輯群組內(nèi)的多個邏輯扇區(qū)寫入一混亂更新區(qū)塊中。
在優(yōu)選實(shí)施例中,元頁含有來自個別平面的循環(huán)頁。由于元頁可以并行讀取或編程,因此以元頁的粒度來建構(gòu)主機(jī)更新會很方便。在有任何填補(bǔ)時,其可和逐元頁的更新邏輯單位一起記錄。
在圖24A及圖24C的范例顯示的實(shí)施例中,在各主機(jī)寫入期間,會在要編程更新的平面對準(zhǔn)存儲器單位之前未使用的存儲器單位上執(zhí)行填補(bǔ)。在下一次主機(jī)寫入之前,會延后在上一個編程的存儲器單位后的任何未使用的存儲器單位的動作。一般而言,會在各元頁的邊界內(nèi)填補(bǔ)任何在前面未使用的存儲器單位。換言之,如果在前面的間隙跨越于兩個元頁之上,則按各元頁合適的邏輯上循序順序在各元頁上執(zhí)行填補(bǔ),而不顧橫跨邊界的連續(xù)性。在合并區(qū)塊時,最后寫入的元頁如為部分寫入,則可通過填補(bǔ)進(jìn)行完整填充。
在另一項(xiàng)實(shí)施例中,任何部分填充的元頁可在移至下一個元頁之前進(jìn)行完全填補(bǔ)。
存儲器單位粒度根據(jù)個別存儲器架構(gòu)所支持的彈性,讀取或編程的單位可以有各種變化。個別平面的獨(dú)立特性允許獨(dú)立讀取及編程元頁中個別平面的各頁。上述范例具有成為各平面中頁的最大編程單位。在元頁內(nèi),可以有小于所有頁的局部元頁編程。例如,可以編程元頁的前三個頁,然后再編程第四個頁。
此外,在平面級別,一個物理頁可含有一個或一個以上存儲器單位。如果各存儲器單位可以存儲一個扇區(qū)的數(shù)據(jù),則一個物理頁可存儲一個或一個以上扇區(qū)。某一存儲器架構(gòu)可支持局部頁編程,其中通過抑制頁內(nèi)選定存儲器單位的編程,可在多個編程編碼過程上,在不同的時間個別編程選定的邏輯單位。
在存儲器平面內(nèi)用于邏輯群組的混亂更新的邏輯單位對準(zhǔn)在區(qū)塊存儲器管理系統(tǒng)中,按邏輯上循序順序?qū)⑦壿媶挝坏倪壿嬋航M存儲于原始區(qū)塊中。在更新邏輯群組時,將邏輯單位的后續(xù)版本存儲于更新區(qū)塊中。如果將邏輯單位混亂地(即,非循序)存儲于更新區(qū)塊中,最后會執(zhí)行垃圾收集以收集原始區(qū)塊及更新區(qū)塊中邏輯單位的最新版本,以循序?qū)⑵湔蠟樾碌脑紖^(qū)塊。如果將給定邏輯單位的更新版本全部存儲在和其原始區(qū)塊中原始版本對準(zhǔn)的更新區(qū)塊中,致使相同組的感測電路可以存取所有版本,則垃圾收集操作會更有效。
根據(jù)本發(fā)明的另一方面,在上述區(qū)塊存儲器管理系統(tǒng)中,在將存儲器組織成一系列的存儲器頁時(其中存儲器單元的各頁是由一組感測電路并行服務(wù)),如果給定邏輯單位的所有版本在所存儲的頁中全部具有相同的偏移位置,則所有版本均已對準(zhǔn)。
圖25顯示其中各頁含有兩個用于存儲兩個邏輯單位(如兩個邏輯扇區(qū))的存儲器單位的范例存儲器組織。在原始區(qū)塊中,由于邏輯扇區(qū)是按邏輯上循序順序加以存儲,會將邏輯扇區(qū)LS0及LS1存儲于頁P(yáng)0中,將邏輯扇區(qū)LS2及LS3存儲于頁P(yáng)1中,及將邏輯扇區(qū)LS4及LS5存儲于頁P(yáng)3中等??梢钥闯鲈诖藘蓚€扇區(qū)的頁中,左邊算起第一個扇區(qū)的頁偏移為“0”,而第二個扇區(qū)的頁偏移為“1”。
在更新循序存儲于原始區(qū)塊中的邏輯扇區(qū)的邏輯群組時,會將已更新的邏輯扇區(qū)記錄在更新區(qū)塊中。例如,邏輯扇區(qū)LS2常駐在原始區(qū)塊中具有偏移“0”的頁P(yáng)0中。如果在第一寫入中,如果將LS2更新為LS2′,則會將其存儲于具有相同頁偏移“0”的更新區(qū)塊的第一可用位置。這會是在頁P(yáng)0′的第一存儲器單位中。如果在第二寫入中,將LS5更新為LS5′,則會將其存儲于具有相同頁偏移“1”的更新區(qū)塊的第一可用位置。這會是在具有頁P(yáng)1′的偏移“1”的第二存儲器單元中。然而,在存儲LS5′之前,會在其中復(fù)制至少在各頁中將會維持邏輯循序順序的邏輯扇區(qū)的最新版本,以先填補(bǔ)P0′中具有偏移“1”的及P1′中具有偏移“0”的未使用存儲器單位。在此情況下,會將LS3復(fù)制到P0′中偏移“1”位置且將LS4復(fù)制到P1′中偏移“0”位置。如果在第三寫入中,再次將LS2′更新為LS2″,則會將其存儲在P2′的偏移“0”中。如果在第四寫入中,分別將LS22及LS23更新為LS22′及LS23′,則會分別將其存儲在P3′的偏移“0”及“1”中。然而,在那之前,會以LS3填補(bǔ)在P2′中具有偏移“1”的未使用存儲器單位。
上述更新序列假設(shè)可以在頁內(nèi)編程個別扇區(qū)。對于一些其中不支持局部頁編程的存儲器架構(gòu),頁內(nèi)的所有扇區(qū)必須一起編程。在這種情況下,在第一寫入中,會將LS2′及LS3一起編程至P0′中。在第二寫入中,會將LS4及LS5′一起編程至P1′中。在第三寫入中,會將LS2″及LS3一起編程至P2′中等等。
元頁內(nèi)的平面對準(zhǔn)或者,編程的單位可具有元頁的粒度。如果寫入混亂更新區(qū)塊的粒度變成元頁,則結(jié)合圖16A及16B所述的CBI區(qū)塊中的項(xiàng)目將和元頁有關(guān),而非和扇區(qū)有關(guān)。增加的粒度會減少必須為混亂更新區(qū)塊所記錄的項(xiàng)目的數(shù)量,并允許消除直接索引及每個元區(qū)塊使用單一CBI扇區(qū)。
圖26A和圖21的存儲器結(jié)構(gòu)相同,只是各頁含有兩個扇區(qū)而非一個。因此,從圖中可見元頁MP0現(xiàn)在各有其能夠存儲兩個數(shù)據(jù)邏輯單位的頁。如果各邏輯單位是一個扇區(qū),則將邏輯扇區(qū)循序存儲于MP0之中,其中LS0及LS1在平面P0中且LS2及LS3在平面P1中等。
圖26B顯示圖26A所示的具有以示意性線性圖方式布局的存儲器單位的元區(qū)塊。和圖21的單一扇區(qū)頁相比,邏輯扇區(qū)是以循環(huán)的方式存儲于四個頁中,每個頁中具有兩個扇區(qū)。
一般而言,如果有W個并行操作的平面且每個頁有K個存儲器單位,且按邏輯上循序順序填充元區(qū)塊,則元區(qū)塊中第k個邏輯頁將常駐于平面x中,其中x=k′MOD W,其中k′=INT(k/K)。例如,有四個平面,W=4,每個頁2個扇區(qū),K=2,則對于k=5,即指第五個邏輯扇區(qū)LS5,其將常駐于由2 MOD 4所給定的平面中,即平面2,如圖24A所示。一般而言,相同原理適用于建構(gòu)上述的平面對準(zhǔn)。
上述范例是用于多重平面架構(gòu)中以平面進(jìn)行的頁對準(zhǔn)。在頁具有多個扇區(qū)的情況下,也維持頁內(nèi)的扇區(qū)對準(zhǔn)會很有利。依此方式,對于相同邏輯扇區(qū)的不同版本可有利地使用相同組的感測電路??捎行?zhí)行如扇區(qū)的重新定位及“讀取-修改-寫入的操作”。在對準(zhǔn)頁內(nèi)的扇區(qū)順序時,可以采用和對準(zhǔn)頁與平面的相同技術(shù)。還有根據(jù)實(shí)施例而定,可以填補(bǔ)也可以不填補(bǔ)任何中間間隙。
不用填補(bǔ)的邏輯單位或平面對準(zhǔn)圖27顯示的替代性方案如下不用填補(bǔ)要從一個位置復(fù)制到另一個的邏輯單位,即可在更新區(qū)塊中進(jìn)行平面對準(zhǔn)??蓪⒑透聟^(qū)塊交叉的四個平面的部分視為四個收集從主機(jī)接收的平面對準(zhǔn)的已更新邏輯單位的緩沖器。不用在合適緩沖器的下一個可用存儲器單位中進(jìn)行填補(bǔ),即可編程從主機(jī)接收的每個邏輯單位。依照從主機(jī)接收的邏輯單位地址的序列,可能會有不同數(shù)量的邏輯單位被編程于每個平面之中。
混亂更新區(qū)塊MB′1可含有邏輯元頁的所有邏輯單位的已更新版本,如用于MP′0的。其還可含有小于元頁的所有邏輯單位,如用于MP′1的。在MP′1的例子中,可從對應(yīng)的原始區(qū)塊MB0取得遺失的邏輯單位LS4。
此替代性方案在存儲器架構(gòu)可支持并行讀取各平面的任意邏輯頁時尤其有效。依此方式,可在單一并行讀取操作中讀取一個元頁的所有邏輯頁,即使個別邏輯頁并非來自相同行。
階段性程序錯誤處理當(dāng)區(qū)塊中有程序失敗時,通常會將所有要存儲至區(qū)塊的數(shù)據(jù)移至另一個區(qū)塊并將失敗的區(qū)塊標(biāo)示為不良。根據(jù)其中遇到失敗的操作的時序規(guī)格,可能沒有足夠的時間另外將存儲的數(shù)據(jù)移至另一個區(qū)塊。最壞的情況是在正常垃圾收集操作期間的程序失敗,其中需要另一個相同垃圾收集操作以將所有數(shù)據(jù)重新定位至另一個區(qū)塊。在此情況下,可能會違反一給定主機(jī)/存儲器裝置所規(guī)定的寫入等待時間限制,其所述限制通常被設(shè)計成容納一次(而非兩次)垃圾收集操作。
圖28顯示其中缺陷區(qū)塊在合并操作期間發(fā)生程序失敗時,會在另一個區(qū)塊上重復(fù)合并操作的方案。在此范例中,區(qū)塊1是按邏輯上循序順序存儲邏輯群組的完整邏輯單位的原始區(qū)塊。為了便于解釋,原始區(qū)塊含有扇區(qū)A、B、C及D,各存儲一個子群組的邏輯單位。當(dāng)主機(jī)更新群組的特定邏輯單位時,會將邏輯單位的較新版本記錄在更新區(qū)塊中,即區(qū)塊2。如先前結(jié)合更新區(qū)塊所述,根據(jù)主機(jī)而定,此更新可按循序或非循序(混亂)順序記錄邏輯單位。最后,會因更新區(qū)塊已滿或一些其它原因而關(guān)閉更新區(qū)塊以接收進(jìn)一步更新。當(dāng)更新區(qū)塊(區(qū)塊2)關(guān)閉時,會將常駐于更新區(qū)塊或原始區(qū)塊(區(qū)塊1)上的邏輯單位的目前版本合并在新的區(qū)塊(區(qū)塊3)上,以形成邏輯群組的新的原始區(qū)塊。此范例顯示更新區(qū)塊在扇區(qū)B及D中含有邏輯單位的較新版本。為了方便,圖中將扇區(qū)B及D示意性顯示在區(qū)塊2中未必是其記錄的位置,而是對準(zhǔn)其在區(qū)塊1中原始位置的位置。
在合并操作中,會按循序順序?qū)⒃瓉沓qv于區(qū)塊1中的邏輯群組的所有邏輯單位的目前版本記錄于合并區(qū)塊(區(qū)塊3)中。因此,會先從區(qū)塊1將扇區(qū)A的邏輯單位復(fù)制到區(qū)塊3,接著再從區(qū)塊2將扇區(qū)B復(fù)制到區(qū)塊3。在此范例中,在從區(qū)塊1將扇區(qū)C的邏輯單位復(fù)制到區(qū)塊3時,區(qū)塊3的缺陷將導(dǎo)致程序失敗。
一種處理程序失敗的方式是在全新的區(qū)塊(區(qū)塊4)上重新激活合并程序。因此,會將扇區(qū)A、B、C、D復(fù)制在區(qū)塊4上,然后丟棄缺陷區(qū)塊3。然而,這將表示執(zhí)行兩個串聯(lián)的合并操作,結(jié)果造成復(fù)制多達(dá)兩個充滿邏輯單位的區(qū)塊。
存儲器裝置具有完成特定操作的特定時間容限。例如,在主機(jī)寫入存儲器裝置時,會預(yù)計寫入操作在指定的時間內(nèi)完成,稱為“寫入等待時間”。當(dāng)存儲器裝置(如存儲卡)正忙于寫入主機(jī)的數(shù)據(jù)時,會發(fā)信“BUSY(忙碌)”狀態(tài)給主機(jī)。如果“BUSY”狀態(tài)持續(xù)超過寫入等待時間的長度,主機(jī)會使寫入操作逾時,然后對寫入操作登錄例外或錯誤。
圖29以示意圖顯示具有允許足夠時間完成寫入(更新)操作及合并操作的時序或?qū)懭氲却龝r間的主機(jī)寫入操作。主機(jī)寫入操作具有寫入等待時間Tw,其可提供足夠完成寫入主機(jī)數(shù)據(jù)至更新區(qū)塊之更新操作972的時間(圖29(A))。如先前在區(qū)塊管理系統(tǒng)所述,對更新區(qū)塊的主機(jī)寫入可觸發(fā)合并操作。因此,時序也允許在更新操作972之外的合并操作974(圖29(B))。然而,必須重新激活合并操作以響應(yīng)失敗的合并操作將會花費(fèi)太多時間并超過指定的寫入等待時間。
根據(jù)本發(fā)明的另一方面,在具有區(qū)塊管理系統(tǒng)的存儲器中,在時間緊急的存儲器操作期間,區(qū)塊中的程序失敗可通過繼續(xù)中斷區(qū)塊(breakout block)中的編程操作來處理。稍后,在較不緊急的時間,可將中斷前記錄在失敗區(qū)塊中的數(shù)據(jù)傳送到其它可能也是中斷區(qū)塊的區(qū)塊。接著即可丟棄失敗的區(qū)塊。依此方式,在遇到缺陷區(qū)塊時,不會因必須立刻傳送缺陷區(qū)塊中存儲的數(shù)據(jù)而損失數(shù)據(jù)及超過指定的時間限制,即可加以處理。此錯誤處理對于垃圾收集操作尤其重要,因此在緊急時間期間不需要對一嶄新的區(qū)塊重復(fù)進(jìn)行整個操作。其后,在適宜的時間,通過重新定位到其它區(qū)塊,即可挽救缺陷區(qū)塊的數(shù)據(jù)。
圖30顯示根據(jù)本發(fā)明一般方案的程序失敗處理的流程圖。
步驟1002將非易失性存儲器組織成區(qū)塊,將各區(qū)塊分割成可一起擦除的存儲器單位,各存儲器單位可存儲一數(shù)據(jù)邏輯單位。
程序失敗處理(第一階段)步驟1012在第一區(qū)塊中存儲一連串?dāng)?shù)據(jù)邏輯單位。
步驟1014為了響應(yīng)存儲若干邏輯單位后在第一區(qū)塊的存儲失敗,在作為第一區(qū)塊的中斷區(qū)塊的第二區(qū)塊中存儲后續(xù)的邏輯單位。
程序失敗處理(最后階段)步驟1020為了響應(yīng)預(yù)定義的事件,將存儲在第一區(qū)塊中的邏輯單位傳送至第三區(qū)塊,其中第三區(qū)塊和第二區(qū)塊可以相同或不同。
步驟1022丟棄第一區(qū)塊。
圖31A顯示程序失敗處理的一項(xiàng)實(shí)施例,其中第三(最后的重新定位)區(qū)塊和第二(中斷)區(qū)塊不同。在階段I期間,會在第一區(qū)塊上記錄一序列的邏輯單位。如果邏輯單位是來自主機(jī)寫入,則可將第一區(qū)塊視為更新區(qū)塊。如果邏輯單位是來自壓縮操作的合并,則可將第一區(qū)塊視為重新定位區(qū)塊。如果在某個點(diǎn)在區(qū)塊1中遇到程序失敗,則可提供當(dāng)作中斷區(qū)塊的第二區(qū)塊。在區(qū)塊1及后續(xù)邏輯單位中記錄失敗的邏輯單位會被記錄在中斷區(qū)塊上。依此方式,不需要額外的時間來取代失敗的區(qū)塊1及常駐其上的數(shù)據(jù)。
在中間階段II中,可在區(qū)塊1及區(qū)塊2之間取得序列中所有的已記錄邏輯單位。
在最后階段III中,會將邏輯單位重新定位至可當(dāng)作重新定位區(qū)塊的區(qū)塊3,以取代失敗的區(qū)塊1及常駐其上的數(shù)據(jù)。因此,可挽救已失敗區(qū)塊中的數(shù)據(jù),然后再丟棄失敗的區(qū)塊。會排定最后階段的時間,使其不會和任何同時的存儲器操作的時序沖突。
在此實(shí)施例中,重新定位區(qū)塊3和中斷區(qū)塊2有所區(qū)分。這在中間階段期間已經(jīng)以附加的邏輯單位記錄中斷區(qū)塊時會很方便。因此,中斷區(qū)塊已經(jīng)變成更新區(qū)塊,可能不適于將缺陷區(qū)塊1的邏輯單位重新定位至其中。
圖31B顯示程序失敗處理的另一項(xiàng)實(shí)施例,其中第三(最后的重新定位)區(qū)塊和第二(中斷)區(qū)塊相同。階段I及II和圖31A所示的第一實(shí)施例相同。然而,在階段III中,會將缺陷區(qū)塊1的邏輯單位重新定位至中斷區(qū)塊2。這在未以先前寫入操作之原始序列以外的附加邏輯單位記錄中斷區(qū)塊2時會很方便。依此方式,存儲所論邏輯單位所需的區(qū)塊數(shù)最小。
合并期間的程序失敗處理的實(shí)施例程序失敗處理在合并操作期間尤其重要。正常的合并操作可將常駐在原始區(qū)塊及更新區(qū)塊中的邏輯群組的所有邏輯單位的目前版本合并至合并區(qū)塊。在合并操作期間,如果在合并區(qū)塊中發(fā)生程序失敗,則會提供另一個當(dāng)作中斷合并區(qū)塊的區(qū)塊,以接收其余邏輯單位的合并。依此方式,不必將邏輯單位復(fù)制一次以上,而仍可在正常合并操作指定的期間內(nèi)完成例外處理的操作。在適宜的時間,將群組所有未處理完成的邏輯單位合并至中斷區(qū)塊中,即可完成合并操作。適宜的時間將是在目前主機(jī)寫入操作以外的其它某一有時間執(zhí)行合并的時期期間。一個此種適宜的時間是在另一個其中有更新但無關(guān)聯(lián)的合并操作的主機(jī)寫入的期間。
實(shí)質(zhì)上,可將程序失敗處理的合并視為以多階段來建構(gòu)。在第一階段中,在發(fā)生程序失敗后,會將邏輯單位合并至一個以上區(qū)塊中以避免將各邏輯單位合并一次以上。在適宜的時間會完成最后階段,其中會將邏輯群組合并至一個區(qū)塊中,優(yōu)選通過按循序順序?qū)⑺羞壿媶挝皇占林袛嗪喜^(qū)塊中。
圖32A顯示造成合并操作的初始更新操作的流程圖。
步驟1102將非易失性存儲器組織成區(qū)塊,將各區(qū)塊分割成可一起擦除的存儲器單位,各存儲器單位可存儲一數(shù)據(jù)邏輯單位。
步驟1104將數(shù)據(jù)組織成復(fù)數(shù)個邏輯群組,各邏輯群組為可存儲在區(qū)塊中的邏輯單位的群組。
步驟1112接收封裝在邏輯單位中的主機(jī)數(shù)據(jù)。
步驟1114根據(jù)第一順序在第一區(qū)塊中存儲邏輯群組的邏輯單位的第一版本,以建立邏輯群組的原始區(qū)塊。
步驟1116根據(jù)第二順序在第二區(qū)塊中存儲包括邏輯群組的邏輯單位的后續(xù)版本,以建立邏輯群組的更新區(qū)塊。
步驟1119在上述部分的預(yù)定事件,執(zhí)行垃圾收集以在各種區(qū)塊中收集邏輯單位的目前版本,且將其重新記錄至新的區(qū)塊。
圖32B顯示根據(jù)本發(fā)明一項(xiàng)優(yōu)選實(shí)施例的多階段合并操作的流程圖。
合并失敗處理(階段I)錯誤處理的合并,階段I操作1120包含步驟1122及步驟1124。
步驟1122以和第一順序相同的順序,在第三區(qū)塊中存儲邏輯群組的邏輯單位的目前版本,以建立邏輯群組的合并區(qū)塊。
步驟1124為了響應(yīng)合并區(qū)塊的存儲失敗,以和第一順序相同的順序,在第四區(qū)塊中存儲第三區(qū)塊所沒有的邏輯群組的邏輯單位,以提供中斷合并區(qū)塊。
由于已將區(qū)塊1及區(qū)塊2中的數(shù)據(jù)傳送至區(qū)塊3及區(qū)塊4,因此可擦除區(qū)塊1及區(qū)塊2以釋放空間。在優(yōu)選實(shí)施例中,可立即將區(qū)塊2釋放至EBL(已擦除的區(qū)塊列表,見圖18)再重新使用。區(qū)塊1只能在以下的條件下釋放如果其為關(guān)閉的更新區(qū)塊且其中有對應(yīng)的GAT項(xiàng)目指向的另一個區(qū)塊。
實(shí)質(zhì)上,區(qū)塊3會變成邏輯群組的原始區(qū)塊,而區(qū)塊4變成區(qū)塊3的取代循序更新區(qū)塊。
在完成階段I合并后,存儲器裝置通過釋放BUSY信號來發(fā)信給主機(jī)。
中間操作(階段II)階段II,即中間操作1130,可在階段III合并操作1140之前發(fā)生。如步驟1132、1134和1136中任一者所提出的,可能會有數(shù)種可能的情況。
步驟1132或是在邏輯群組的寫入操作中,寫入作為更新區(qū)塊的第四區(qū)塊(中斷合并區(qū)塊)。
如果主機(jī)寫入所論邏輯群組,則區(qū)塊4(其為中斷合并區(qū)塊且其至此已是取代循序更新區(qū)塊)將用作正常更新區(qū)塊。根據(jù)主機(jī)寫入而定,其可維持循序或變成混亂狀態(tài)。作為更新區(qū)塊,其將在某個點(diǎn)觸發(fā)關(guān)閉另一個混亂區(qū)塊,如先前的優(yōu)選實(shí)施例所述。
如果主機(jī)寫入另一個邏輯群組,則直接進(jìn)行至階段III操作。
步驟1134或是在讀取操作中,讀取其中第三區(qū)塊為邏輯群組原始區(qū)塊且第四區(qū)塊為更新區(qū)塊的存儲器。
此時,會從為邏輯群組的原始區(qū)塊的區(qū)塊3中讀取扇區(qū)A及B的邏輯單位,且從為群組的更新區(qū)塊的區(qū)塊4讀取扇區(qū)C及D的邏輯單位。由于從區(qū)塊3只能讀取扇區(qū)A及B,將無法存取其中編程失敗的頁,且無法存取其后未寫入的部分。雖然尚未更新快閃存儲器中的GAT目錄且其仍指向?yàn)樵紖^(qū)塊的區(qū)塊1,但不會從中讀取任何數(shù)據(jù),且此區(qū)塊本身已于稍早擦除。
另一種可能性是主機(jī)讀取邏輯群組中的邏輯單位。在此情況下,會從為邏輯群組的原始區(qū)塊的區(qū)塊3中讀取扇區(qū)A及B的邏輯單位,且從為群組的循序區(qū)塊的區(qū)塊4中讀取扇區(qū)C及D的邏輯單位。
步驟1136或在電源開啟初始化中,通過掃描其內(nèi)容來重新識別第一至第四區(qū)塊中的任一項(xiàng)。
中間階段的另一個可能性是關(guān)閉存儲器裝置的電源,然后重新激活。如上所述,在電源開啟初始化期間,會掃描配置區(qū)塊列表中的區(qū)塊(要使用的擦除集區(qū)區(qū)塊,見圖15及圖18)以識別邏輯群組中已成為特殊狀態(tài)原始區(qū)塊(區(qū)塊3)及關(guān)聯(lián)的循序更新區(qū)塊(區(qū)塊4)的缺陷合并區(qū)塊。中斷區(qū)塊(區(qū)塊4)的第一邏輯單位中的旗標(biāo)將指示關(guān)聯(lián)的區(qū)塊為已遭遇程序錯誤的原始區(qū)塊(區(qū)塊3)。通過查閱區(qū)塊目錄(GAT),即可尋找區(qū)塊3。
在一項(xiàng)實(shí)施例中,會將旗標(biāo)編程至中斷合并區(qū)塊(區(qū)塊4)的第一邏輯單位。這可協(xié)助指示邏輯群組的特殊狀態(tài)即,其已經(jīng)合并成兩個區(qū)塊,即,區(qū)塊3及區(qū)塊4。
使用旗標(biāo)以識別具有缺陷區(qū)塊的邏輯群組的一個替代方法是,利用不像原始區(qū)塊應(yīng)為已滿的特性(除非錯誤發(fā)生在最后頁,及最后頁沒有ECC錯誤)檢測在掃描期間為缺陷的區(qū)塊。還有,根據(jù)實(shí)施例而定,其中會有有關(guān)存儲在快閃存儲器中控制數(shù)據(jù)結(jié)構(gòu)中的失敗群組/區(qū)塊的信息記錄,而不只是在寫入中斷合并區(qū)塊(區(qū)塊4)的第一扇區(qū)的標(biāo)頭區(qū)中的旗標(biāo)。
合并完成(階段III)步驟1142為了響應(yīng)預(yù)定的事件,對于自階段I后未進(jìn)一步記錄第四區(qū)塊時的第一種情況,以和所述第一順序相同的順序,在其中存儲所述邏輯群組的所有未處理完成的邏輯單位的目前版本;對于自階段I后已進(jìn)一步記錄第四區(qū)塊時的第二種情況,將第三及第四區(qū)塊合并為第五區(qū)塊。
步驟1144之后,對于第一種情況,操作存儲器時,以合并的第四區(qū)塊作為邏輯群組的原始區(qū)塊;對于第二種情況,操作存儲器時,以第五區(qū)塊作為邏輯群組的原始區(qū)塊。
只要有任何不會違反任何指定時間限制的機(jī)會,即可執(zhí)行階段III中的最后合并。一個優(yōu)選情況是,在其中有另一個未附帶合并操作的邏輯群組的更新操作時,“掛附(piggy-back)”在下一個主機(jī)寫入時隙上。如果另一個邏輯群組的主機(jī)寫入觸發(fā)本身的垃圾收集,則將使階段III合并延后。
圖33顯示多階段合并操作的第一及最后階段的范例時序。主機(jī)寫入等待時間是具有持續(xù)期間Tw的各主機(jī)寫入時隙的寬度。主機(jī)寫入1是簡單的更新,且邏輯群組LG1中第一組邏輯單位的目前版本會被記錄在關(guān)聯(lián)的更新區(qū)塊上。
在主機(jī)寫入2中,會在邏輯群組LG1上發(fā)生更新,致使更新區(qū)塊被關(guān)閉(如,已滿)。會提供新的更新區(qū)塊以記錄其余的更新。提供新的更新區(qū)塊會觸發(fā)垃圾收集,而導(dǎo)致關(guān)于LG4的合并操作,以便再循環(huán)要再使用的區(qū)塊。LG4群組的目前邏輯單位會按循序順序記錄在合并區(qū)塊上。合并操作可繼續(xù)進(jìn)行直到在合并區(qū)塊中遭遇缺陷為止。然后調(diào)用階段I合并,其中合并操作在中斷合并區(qū)塊上繼續(xù)。同時,LG4(階段III)的最后合并會等待下一個機(jī)會。
在主機(jī)寫入3中,也會發(fā)生邏輯群組LG2的邏輯單位的寫入以觸發(fā)LG2的合并。這表示已經(jīng)完全利用時隙。
在主機(jī)寫入4中,操作只是將LG2的一些邏輯單位記錄至其更新區(qū)塊。時隙中剩余的時間可提供執(zhí)行LG4的最后合并的機(jī)會。
未將中斷合并區(qū)塊轉(zhuǎn)換為更新區(qū)塊的實(shí)施例圖34A及圖34B分別顯示圖28及圖31的范例適用的多階段合并階段I及階段III操作的第一種情況。
圖34A顯示其中中斷合并區(qū)塊并非用作更新區(qū)塊而是用作其合并操作已經(jīng)中斷的合并區(qū)塊的情況。尤其,圖34A是指圖33所示的主機(jī)寫入#2,其中主機(jī)寫入更新屬于邏輯群組LG1的邏輯單位的更新,且在此期間,此操作也會觸發(fā)和另一個邏輯群組LG4關(guān)聯(lián)的區(qū)塊的合并。
原始區(qū)塊(區(qū)塊1)及更新區(qū)塊(區(qū)塊2)的形成方式和圖28的范例相同。同樣,在合并操作期間,已知合并區(qū)塊(區(qū)塊3)在合并扇區(qū)C中的邏輯單位時有缺陷。然而,不像圖28所示的重新合并方案,本多階段方案可在新提供的可當(dāng)作中斷合并區(qū)塊的區(qū)塊(區(qū)塊4)上繼續(xù)合并操作。因此,在階段I合并操作中,已在合并區(qū)塊(區(qū)塊3)中合并扇區(qū)A及B中的邏輯單位。當(dāng)合并區(qū)塊中發(fā)生程序失敗時,會循序?qū)⑸葏^(qū)C及D中其余的邏輯單位復(fù)制至中斷合并區(qū)塊(區(qū)塊4)。
如果主機(jī)原來在第一邏輯群組中寫入會觸發(fā)和第二邏輯群組關(guān)聯(lián)的區(qū)塊的合并操作的更新,則會將第一邏輯群組的更新記錄至第一邏輯群組的更新區(qū)塊(通常為新的更新區(qū)塊)。在此種情況下,中斷合并區(qū)塊(區(qū)塊4)不會用來記錄合并操作之外的任何更新數(shù)據(jù)且會維持尚須完成的中斷合并區(qū)塊。
由于區(qū)塊1及區(qū)塊2中的數(shù)據(jù)現(xiàn)在完全包含在其他區(qū)塊(區(qū)塊3及區(qū)塊4)中,因此可將其擦除以便再循環(huán)。地址表(GAT)會被更新以指向區(qū)塊3,作為邏輯群組的原始區(qū)塊。更新區(qū)塊的目錄信息(在ACL中,見圖15及圖18)也會被更新,以指向已成為邏輯群組(如,LG4)的循序更新區(qū)塊的區(qū)塊4。
結(jié)果,合并的邏輯群組并未局限在一個區(qū)塊中,而是分布在缺陷合并區(qū)塊(區(qū)塊3)及中斷合并區(qū)塊(區(qū)塊4)之上。此方案的重要特點(diǎn)是群組中的邏輯單位只會在此階段期間合并一次,但卻將合并散布在一個以上區(qū)塊之上。依此方式,可在正常指定的時間內(nèi)完成合并操作。
圖34B顯示始于圖34A的多階段合并的第三及最后階段。如結(jié)合圖33所述,會在第一階段后的適宜時間(例如在后續(xù)不會觸發(fā)隨附合并操作的主機(jī)寫入期間)執(zhí)行階段III合并。尤其,圖34B是指其中發(fā)生如圖33所示的主機(jī)寫入#4的時隙。在所述期間中,主機(jī)寫入可更新屬于邏輯群組LG2的邏輯單位而不會觸發(fā)另一個額外的合并操作。因此,有利地將時隙中剩余的時間用于階段III操作,以完成邏輯群組LG4的合并。
此操作可將還不在中斷區(qū)塊中的LG4的所有未處理完成的邏輯單位合并至中斷區(qū)塊。在此范例中,這表示會按邏輯上循序順序?qū)⑸葏^(qū)A及B從區(qū)塊3復(fù)制至中斷區(qū)塊(區(qū)塊4)。由于區(qū)塊中邏輯單位的繞回方案及使用頁標(biāo)記(見圖3A),即使范例顯示在區(qū)塊4中,扇區(qū)A及B會被記錄在扇區(qū)C及D之后,但仍會將已記錄的序列考慮為等同于A、B、C、D的循序順序。根據(jù)實(shí)施例而定,優(yōu)選從區(qū)塊3取得要復(fù)制的未處理完成的邏輯單位的目前版本,因其已經(jīng)是合并的形式,不過也可從尚未被擦除的區(qū)塊1及區(qū)塊2中收集。
在中斷區(qū)塊(區(qū)塊4)上完成最后合并后,會將其指定為邏輯群組的原始區(qū)塊并相應(yīng)地更新合適的目錄(如,GAT,見圖17A)。同樣,會將失敗的物理區(qū)塊(區(qū)塊3)標(biāo)示為不良并將其排除。其它區(qū)塊(區(qū)塊1及區(qū)塊2)將被擦除及再循環(huán)。同時,會將LG2的更新記錄在和LG2關(guān)聯(lián)的更新區(qū)塊中。
將中斷合并區(qū)塊變成更新區(qū)塊的實(shí)施例圖35A及圖35B分別顯示圖28及圖33中的范例適用的多階段合并的階段I及階段III操作的第二種情況。
圖35A顯示其中將中斷合并區(qū)塊維持為接收主機(jī)寫入的更新區(qū)塊而非合并區(qū)塊的例子。這適用于如更新邏輯群組LG4的主機(jī)寫入,且在此程序中,也會觸發(fā)相同邏輯群組中的合并。
和圖34A的情況一樣,將區(qū)塊1與區(qū)塊2合并于區(qū)塊3上會繼續(xù)進(jìn)行,直到在處理扇區(qū)C時遇到程序失敗為止。然后會在中斷合并區(qū)塊(區(qū)塊4)上繼續(xù)合并。在中斷區(qū)塊(區(qū)塊4)中合并未處理完成的邏輯單位(如,在扇區(qū)C及D中)后,并不在階段III中等待完成其中的邏輯群組合并,而是將中斷區(qū)塊維持為更新區(qū)塊。這種情況尤其適于其中主機(jī)寫入可更新邏輯群組并觸發(fā)相同邏輯群組的合并的情形。在此范例中,這可將邏輯群組LG4的主機(jī)更新的記錄記錄在中斷合并區(qū)塊(區(qū)塊4)中,而非記錄至新的更新區(qū)塊。此更新區(qū)塊(先前為中斷合并區(qū)塊(區(qū)塊4))可根據(jù)其中記錄的主機(jī)數(shù)據(jù)而為循序或變成混亂。在所示的范例中,區(qū)塊4已變成混亂,因扇區(qū)C中邏輯單位的后續(xù)較新版本使得區(qū)塊4中的先前版本過時。
在中間階段期間,會將區(qū)塊3視為LG4的原始區(qū)塊,且區(qū)塊4會是關(guān)聯(lián)的更新區(qū)塊。
圖35B顯示始于第二種情況中圖35A的多階段合并的第三及最后階段。如結(jié)合圖33所述,會在第一階段后的適宜時間執(zhí)行階段III合并,如在后續(xù)不會觸發(fā)隨附合并操作的主機(jī)寫入期間。在所述期間中,主機(jī)寫入可更新屬于邏輯群組的邏輯單位而不會觸發(fā)額外的合并操作。因此,將時隙中剩余的時間用于階段III操作以完成邏輯群組LG4的合并是有利的。
然后將邏輯群組LG4的垃圾從區(qū)塊3及區(qū)塊4收集至新的合并區(qū)塊(區(qū)塊5)。然后將區(qū)塊3標(biāo)示為不良,將區(qū)塊4再循環(huán),且新的合并區(qū)塊(區(qū)塊5)將變成邏輯群組LG4的新的原始區(qū)塊。其它區(qū)塊(區(qū)塊1及區(qū)塊2),也會被擦除及再循環(huán)。
階段性程序失敗處理的其它實(shí)施例圖31A、31B、34A、34B、35A及35B中所述的范例適用于優(yōu)選的區(qū)塊管理系統(tǒng),其中各物理區(qū)塊(元區(qū)塊)僅存儲屬于相同邏輯群組的邏輯單位。本發(fā)明同樣適用于其它其中并無邏輯群組對物理區(qū)塊對準(zhǔn)的區(qū)塊管理系統(tǒng),如WO 03/027828及WO 00/49488中所揭示的區(qū)塊管理系統(tǒng)。在這些其它系統(tǒng)中實(shí)施階段性程序失敗處理方法的一些范例如圖36A、36B及36C所示。
圖36A顯示用于主機(jī)寫入觸發(fā)關(guān)閉更新區(qū)塊且更新區(qū)塊為循序時的情形中的階段性程序錯誤處理方法。此情況下的關(guān)閉是通過以下方式來完成將原始區(qū)塊2的其余的有效數(shù)據(jù)(B及C)復(fù)制至循序更新區(qū)塊3。在數(shù)據(jù)部分C編程起點(diǎn)的程序失敗的情況下,將部分C編程至保留的區(qū)塊4。然后可將新的主機(jī)數(shù)據(jù)寫入新的更新區(qū)塊5(未圖示)。此方法的階段II及III和混亂區(qū)塊關(guān)閉的情況相同。
圖36B顯示在更新區(qū)塊的更新的情況下用于(局部區(qū)塊系統(tǒng))的階段性程序錯誤處理方法。在此情況下,將邏輯群組存儲在原始區(qū)塊1及其它更新區(qū)塊中。合并操作包括將原始區(qū)塊1及其它更新區(qū)塊2的數(shù)據(jù)復(fù)制至更新區(qū)塊之一(根據(jù)某一規(guī)則來選擇,圖中為區(qū)塊3)。和已經(jīng)說明的主要情形不同處在于區(qū)塊3已經(jīng)被部分寫入。
圖36C顯示處理垃圾收集操作的階段性程序錯誤,或不支持映射至元區(qū)塊之邏輯群組之存儲器區(qū)塊管理系統(tǒng)中的清除。WO 03/027828 A1中說明了此種存儲器區(qū)塊管理(循環(huán)存儲)系統(tǒng)。循環(huán)存儲器系統(tǒng)明顯的特點(diǎn)是不對單個邏輯群組配置區(qū)塊。其中支持元區(qū)塊中控制數(shù)據(jù)的多個邏輯群組。垃圾收集涉及從部分過時的區(qū)塊,將可能沒有任何關(guān)系(隨機(jī)邏輯區(qū)塊地址)的有效數(shù)據(jù)扇區(qū)取至其中可能已經(jīng)有些數(shù)據(jù)的重新定位區(qū)塊。如果重新定位區(qū)塊在操作期間變滿,則將開啟另一個區(qū)塊。
非循序更新區(qū)塊索引在上文關(guān)于混亂區(qū)塊索引且結(jié)合圖16A-16E的段落中,CBI扇區(qū)可用來存儲可記錄隨機(jī)存儲在混亂或非循序更新區(qū)塊中的邏輯扇區(qū)位置的索引。
根據(jù)本發(fā)明的另一方面,在具有支持具非循序邏輯單位的更新區(qū)塊的區(qū)塊管理系統(tǒng)的非易失性存儲器中,緩沖存儲在RAM中的更新區(qū)塊的邏輯單位的索引被定期存儲在非易失性存儲器中。在一項(xiàng)實(shí)施例中,將索引存儲在專用于存儲索引的區(qū)塊中。在另一項(xiàng)實(shí)施例中,將索引存儲在更新區(qū)塊中。在又一項(xiàng)實(shí)施例中,將索引存儲在各邏輯單位的標(biāo)頭中。在另一方面中,在上一個索引更新之后但在下一個索引更新之前寫入的邏輯單位會將其索引信息存儲在各邏輯單位的標(biāo)頭中。依此方式,在電源中斷后,不必在初始化期間執(zhí)行掃描,即可確定最近寫入的邏輯單位的位置。在又一方面中,將區(qū)塊管理成部分循序及部分非循序,指向一個以上邏輯子群組。
在預(yù)定觸發(fā)事件后存儲在CBI區(qū)塊中的CBI扇區(qū)中的索引指針根據(jù)結(jié)合圖16A-16E所述的方案,將混亂區(qū)塊中最近寫入扇區(qū)的列表保留在控制器RAM中。只在和給定混亂區(qū)塊關(guān)聯(lián)的邏輯群組中有預(yù)定數(shù)量的寫入后,含有最新索引信息的CBI扇區(qū)才被寫入快閃存儲器(CBI區(qū)塊620)。依此方式,可縮減CBI區(qū)塊更新的數(shù)量。
在邏輯群組中CBI扇區(qū)的下一個更新之前,會將邏輯群組中最近寫入扇區(qū)的列表保留在控制器RAM中。此列表在存儲器裝置遭遇電源關(guān)閉時將會遺失,但可在電源開啟后的初始化中通過掃描更新區(qū)塊加以重建。
圖37說明在每N個扇區(qū)寫入相同的邏輯群組后將一CBI扇區(qū)寫入關(guān)聯(lián)的混亂索引扇區(qū)區(qū)塊的一排程范例。此范例顯示兩個同時進(jìn)行更新的邏輯群組LG3及LG11。起初,LG3的邏輯扇區(qū)按循序順序存儲在一原始區(qū)塊中。群組中邏輯扇區(qū)的更新會按照主機(jī)指定的順序被記錄在關(guān)聯(lián)的更新區(qū)塊上。此范例顯示混亂更新序列。同時,也會以與其更新區(qū)塊相同的方式更新邏輯群組LG11。在每個邏輯扇區(qū)寫入后,將其在更新區(qū)塊中的位置保留在控制器RAM中。在每個預(yù)定觸發(fā)事件后,以混亂索引扇區(qū)的形式將更新區(qū)塊中邏輯扇區(qū)的目前索引寫入非易失性混亂索引扇區(qū)區(qū)塊。例如,預(yù)定觸發(fā)事件可發(fā)生于每N個寫入之后,其中N可為3。
雖然所給出的范例中的數(shù)據(jù)邏輯單位是扇區(qū),但所屬領(lǐng)域的技術(shù)人員應(yīng)明白,邏輯單位也可以是其它某種集合體,例如含有一個扇區(qū)或一組扇區(qū)的頁。還有,循序區(qū)塊中的第一頁無需是邏輯頁0,因?yàn)槔@回的頁標(biāo)記可能到位。
在預(yù)定觸發(fā)事件后存儲在混亂更新區(qū)塊中的CBI扇區(qū)中的索引指針在另一實(shí)施例中,在每N個寫入后,將索引指針存儲在混亂更新區(qū)塊本身中的專用CBI扇區(qū)中。此方案和上述其中也將索引存儲在CBI扇區(qū)中的實(shí)施例相同。其差異在于在上述實(shí)施例中,CBI扇區(qū)被記錄在CBI扇區(qū)區(qū)塊中而非更新區(qū)塊本身中。
此方法是基于將所有混亂區(qū)塊索引信息保持在混亂更新區(qū)塊本身中。圖37A、37B及37C分別說明同樣在三個不同階段存儲CBI扇區(qū)的更新區(qū)塊的狀態(tài)。
圖38A顯示直到在預(yù)定數(shù)量的寫入后在其中記錄CBI扇區(qū)時的更新區(qū)塊。在此范例中,在主機(jī)已經(jīng)循序?qū)懭脒壿嬌葏^(qū)0-3后,其接著會發(fā)出再次寫入邏輯扇區(qū)1的另一版本的指令,因而打斷了數(shù)據(jù)寫入的連續(xù)序列。然后實(shí)施CBI扇區(qū)中承載的混亂區(qū)塊索引,將更新區(qū)塊轉(zhuǎn)換為混亂更新區(qū)塊。如上所述,CBI是一含有混亂區(qū)塊的所有邏輯扇區(qū)的索引的索引。例如,第0個項(xiàng)目代表更新區(qū)塊中第0個邏輯扇區(qū)的偏移,同樣,第n個項(xiàng)目代表第n個邏輯扇區(qū)的偏移??蓪BI扇區(qū)寫入更新區(qū)塊中的下一個可用位置。為了避免頻繁的快快閃存儲器取,在每N個數(shù)據(jù)扇區(qū)寫入后寫入CBI扇區(qū)。在此范例中,N為4。如果此時失去電源,則最后寫入的扇區(qū)將成為CBI扇區(qū),并將此區(qū)塊將被視為混亂更新區(qū)塊。
圖38B顯示圖38A的進(jìn)一步在索引扇區(qū)后在其中記錄邏輯扇區(qū)1、2及4的更新區(qū)塊。邏輯扇區(qū)1及2的較新版本可取代先前在更新區(qū)塊中記錄的舊版本。在此時的電源周期的例子中,需要先找到最后寫入的扇區(qū),然后需要掃描多達(dá)N個扇區(qū),以尋找最后寫入的索引扇區(qū)及最近寫入的數(shù)據(jù)扇區(qū)。
圖38C顯示圖38B的具有另一寫入以觸發(fā)索引扇區(qū)下一個記錄的邏輯扇區(qū)的更新區(qū)塊。在另N個(N=4)扇區(qū)寫入后的相同更新區(qū)塊可記錄CBI扇區(qū)的另一個目前版本。
此方案的優(yōu)點(diǎn)是不需要單獨(dú)的CBI區(qū)塊。同時還不必?fù)?dān)心物理快閃扇區(qū)的額外開銷數(shù)據(jù)區(qū)是否大到足以容納混亂更新區(qū)塊中有效扇區(qū)的索引所需數(shù)量的項(xiàng)目。然后,混亂更新區(qū)塊含有所有的信息,且地址轉(zhuǎn)換不需要外部的數(shù)據(jù)。這可讓算法比較簡單,其中可縮減有關(guān)CBI區(qū)塊壓縮的控制更新數(shù);也可讓串接控制更新比較簡短。(請見上文有關(guān)CBI區(qū)塊管理的部分)。
關(guān)于存儲在混亂更新區(qū)塊中數(shù)據(jù)扇區(qū)標(biāo)頭的最近寫入扇區(qū)的信息根據(jù)本發(fā)明的另一方面,會在每N個寫入后,將記錄在區(qū)塊中的邏輯單位的索引存儲在非易失性存儲器中,且將有關(guān)中間寫入的邏輯單位的目前信息存儲在所寫入的各邏輯單位的額外開銷部分。依此方式,在電源重新開啟后,不必掃描區(qū)塊,即可從區(qū)塊中最后寫入邏輯單位的額外開銷部分快速取得有關(guān)自上一次索引更新后寫入的邏輯單位的信息。
圖39A顯示存儲于混亂更新區(qū)塊中各數(shù)據(jù)扇區(qū)標(biāo)頭的中間寫入的中間索引。
圖39B顯示在寫入的各扇區(qū)標(biāo)頭中存儲中間寫入的中間索引的范例。在此范例中,在寫入四個扇區(qū)LS0-LS3后,會寫入CBI索引作為區(qū)塊中的下一個扇區(qū)。其后,將邏輯扇區(qū)LS′1、LS′2及LS4寫入?yún)^(qū)塊。每次,標(biāo)頭都會存儲自上一個CBI索引后寫入的邏輯單位的中間索引。因此,LS′2中的標(biāo)頭將具有提供上一個CBI索引及LS′1的偏移(即,位置)的索引。同樣,LS4中的標(biāo)頭將具有提供上一個CBI索引及LS′1和LS′2的偏移(即,位置)的索引。
最后寫入的數(shù)據(jù)扇區(qū)始終含有有關(guān)多達(dá)N個最后寫入的頁的信息(即,一直到最后寫入的CBI扇區(qū))。只要電源重新開啟,上一個CBI索引便可提供在CBI索引扇區(qū)之前寫入的邏輯單位的索引信息,而后續(xù)寫入的邏輯單位的索引信息可在最后寫入的數(shù)據(jù)扇區(qū)的標(biāo)頭中找到。這具有以下優(yōu)點(diǎn)在初始化時不必為其后寫入的扇區(qū)掃描區(qū)塊以確定其位置。
在數(shù)據(jù)扇區(qū)的標(biāo)頭中存儲中間索引信息的方案同樣適用,無論CBI索引扇區(qū)是存儲在更新區(qū)塊本身或是在單獨(dú)的CBI扇區(qū)區(qū)塊中,如上一節(jié)所述。
存儲在混亂更新區(qū)塊中數(shù)據(jù)扇區(qū)標(biāo)頭中的索引指針在另一項(xiàng)實(shí)施例中,將整個CBI索引存儲在混亂更新區(qū)塊中各數(shù)據(jù)扇區(qū)的額外開銷部分。
圖40顯示在混亂更新區(qū)塊的各數(shù)據(jù)扇區(qū)標(biāo)頭中存儲的混亂索引字段中的信息。
扇區(qū)標(biāo)頭的信息容量有限,因此可將由任何單個扇區(qū)所提供的索引范圍設(shè)計為層級索引方案的一部分。例如,存儲器特定平面內(nèi)的扇區(qū)可提供索引給僅在所述平面內(nèi)的扇區(qū)。此外,可將邏輯地址的范圍分割成若干子范圍,以允許采用間接索引方案。例如,如果可將有64個邏輯地址的扇區(qū)存儲在一個平面中,則各扇區(qū)可以有3個字段用于扇區(qū)偏移值,各字段能夠存儲4個偏移值。第一字段定義邏輯偏移范圍0-15、15-31、32-47及48-63內(nèi)最后寫入扇區(qū)的物理偏移。第二字段定義在其相關(guān)范圍內(nèi)各4個扇區(qū)之4個子范圍的物理偏移值。第三字段可定義在其相關(guān)子范圍內(nèi)4個扇區(qū)的物理偏移值。因此,通過讀取多達(dá)3個扇區(qū)的間接偏移值,即可確定混亂更新區(qū)塊內(nèi)邏輯扇區(qū)的物理偏移。
此方案的優(yōu)點(diǎn)是也不需要單獨(dú)的CBI區(qū)塊或CBI扇區(qū)。然而,這卻只適用于物理快閃扇區(qū)的額外開銷數(shù)據(jù)區(qū)大到足以容納混亂更新區(qū)塊中有效扇區(qū)索引所需數(shù)量的項(xiàng)目時。
混亂更新區(qū)塊的邏輯群組內(nèi)受限的邏輯范圍在邏輯群組內(nèi),可縮減可非循序?qū)懭氲纳葏^(qū)的邏輯范圍。此技術(shù)的主要優(yōu)點(diǎn)如下由于只需要讀取一個多重扇區(qū)頁(在多重芯片的例子中,可以并行讀取頁),即可取得目的地頁的所有數(shù)據(jù)(假設(shè)來源和目的地已對準(zhǔn),若未對準(zhǔn),則需要另一個讀取),使得循序?qū)懭霐?shù)據(jù)的復(fù)制能夠更快速地完成,因此范圍之外的扇區(qū)在原始區(qū)塊中保持循序?qū)懭耄依占僮髂茉诟痰臅r間內(nèi)完成。還有,使用芯片上的副本特點(diǎn),可將循序數(shù)據(jù)從來源復(fù)制至目的地,而不用在控制器之間來回傳送數(shù)據(jù)。如果來源數(shù)據(jù)已經(jīng)分散,如混亂區(qū)塊中所發(fā)生的,則可能需要每個扇區(qū)讀取多達(dá)一個頁,才能收集所有要寫入目的地的扇區(qū)。
在一項(xiàng)實(shí)施例中,不是將邏輯范圍限制在某個數(shù)量的扇區(qū),而是經(jīng)由限制CBI的數(shù)量來完成(只限制大群組/元區(qū)塊的混亂范圍很合理,因其需要多個混亂區(qū)塊索引才能涵蓋整個邏輯群組的范圍)。例如,如果元區(qū)塊/群組有2048個扇區(qū),則其將需要多達(dá)8個CBI扇區(qū),各涵蓋一個子群組256個扇區(qū)的連續(xù)邏輯范圍。如果將CBI的數(shù)量限制為4,則混亂元區(qū)塊可用來寫入多達(dá)4個子群組的扇區(qū)(其中任何一個)。因此,允許邏輯群組有多達(dá)4個部分或完全混亂子群組,且最少有4個子群組將維持完全循序。如果一個混亂區(qū)塊有4個和其關(guān)聯(lián)的有效CBI扇區(qū),且主機(jī)寫入在這些CBI扇區(qū)范圍之外(混亂子群組)的扇區(qū),則應(yīng)合并并關(guān)閉混亂邏輯群組。但是這卻極不可能發(fā)生,因?yàn)樵谡鎸?shí)的應(yīng)用中,主機(jī)在2048個扇區(qū)的范圍(邏輯群組)內(nèi)不需要多于4個256個扇區(qū)的混亂范圍(子群組)。結(jié)果,在正常的情況下,垃圾收集也不會受到影響,但限制規(guī)則的防范卻形成垃圾收集太長(會觸發(fā)主機(jī)的逾時)的極端例子。
部分循序混亂更新區(qū)塊的索引當(dāng)循序更新區(qū)塊在將區(qū)塊轉(zhuǎn)換為混亂管理模式之前被部分寫入時,邏輯群組的循序更新部分的全部或部分可繼續(xù)被處理成已經(jīng)循序更新,且可將混亂更新管理僅用于邏輯群組的地址范圍的子集。
控制數(shù)據(jù)完整性與管理存儲在存儲器裝置中的數(shù)據(jù)可能會因?yàn)殡娫粗袛嗷蛱囟ù鎯ζ魑恢米兂捎腥毕荻蔀橐褮p。如果遇到存儲器區(qū)塊缺陷,則將數(shù)據(jù)重新定位至不同的區(qū)塊且將缺陷區(qū)塊丟棄。如果錯誤不會擴(kuò)大,則可通過和數(shù)據(jù)一起存儲的錯誤校正碼(ECC)在執(zhí)行中進(jìn)行校正。然而,還是會有ECC無法校正已毀損數(shù)據(jù)的時候。例如,當(dāng)錯誤位的數(shù)量超過ECC的容量時。這對于如和存儲器區(qū)塊管理系統(tǒng)關(guān)聯(lián)的控制數(shù)據(jù)的關(guān)鍵數(shù)據(jù)是無法接受的。
控制數(shù)據(jù)的范例為目錄信息及和存儲器區(qū)塊管理系統(tǒng)關(guān)聯(lián)的區(qū)塊配置信息,如結(jié)合圖20所述。如上所述,可將控制數(shù)據(jù)維持在高速RAM及較慢的非易失性存儲器區(qū)塊中。任何經(jīng)常變更的控制數(shù)據(jù)會被維持在具有定期控制寫入的RAM中,以更新存儲于非易失性元區(qū)塊中的同等信息。依此方式,不必經(jīng)常存取,即可將控制數(shù)據(jù)存儲在非易失性但較慢的快閃存儲器中。如圖20所示GAT、CBI、MAP及MAPA的控制數(shù)據(jù)結(jié)構(gòu)的層級會被維持在快閃存儲器中。因此,控制寫入操作造成RAM中控制數(shù)據(jù)結(jié)構(gòu)的信息可更新快閃存儲器中同等的控制數(shù)據(jù)結(jié)構(gòu)。
關(guān)鍵數(shù)據(jù)復(fù)制根據(jù)本發(fā)明的另一方面,如部分或全部控制數(shù)據(jù)的關(guān)鍵數(shù)據(jù)如果被維持在復(fù)制項(xiàng)中,則可保證額外等級的可靠性。復(fù)制的執(zhí)行方式對于采用兩次(two-pass)編程技術(shù)以連續(xù)編程相同組存儲器單元的多位的多狀態(tài)存儲器系統(tǒng)而言,第二次編碼過程中的任何編程錯誤都無法毀損第一次編碼過程建立的數(shù)據(jù)。復(fù)制還有助于檢測寫入中止、檢測誤測(即,兩個副本有良好的ECC但數(shù)據(jù)不同),且可增加額外等級的可靠性。若干數(shù)據(jù)復(fù)制的技術(shù)均已考慮。
在一項(xiàng)實(shí)施例中,在稍早編程編碼過程中編程給定數(shù)據(jù)的兩個副本后,后續(xù)編程編碼過程可避免編程用于存儲所述兩個副本中至少一個的存儲器單元。依此方式,在后續(xù)編程編碼過程在完成之前中止且毀損稍早編碼過程的數(shù)據(jù)時,所述兩個副本中至少一個不會受到影響。
在另一項(xiàng)實(shí)施例中,某一給定數(shù)據(jù)的兩個副本會被存儲于兩個不同的區(qū)塊中,而且所述兩個副本中至多僅有其中一個的存儲器單元會于后面的編程編碼過程中被編程。
于另一實(shí)施例中,在一編程編碼過程中存儲某一給定數(shù)據(jù)的兩個副本之后,便不再對用于存儲所述兩個副本的存儲器單元組實(shí)施任何進(jìn)一步的編程。在所述存儲器單元組的最終編程編碼過程中來編程所述兩個副本便可達(dá)成此目的。
在又一項(xiàng)實(shí)施例中,可在二進(jìn)制編程模式中將某一給定數(shù)據(jù)的兩個副本編程至多狀態(tài)的存儲器之中,致使不會對已編程的存儲器單元進(jìn)行任何進(jìn)一步的編程。
在又一項(xiàng)實(shí)施例中,對于采用兩次編程技術(shù)以連續(xù)編程相同組存儲器單元的多位的多狀態(tài)存儲器系統(tǒng)而言,會采用容錯碼以編碼多個存儲器狀態(tài),使稍早編程編碼過程所建立的數(shù)據(jù)不會受到后續(xù)編程編碼過程中錯誤的影響。
在各存儲器單元可存儲一位以上數(shù)據(jù)的多狀態(tài)存儲器中會引發(fā)數(shù)據(jù)復(fù)制的復(fù)雜性。例如,一個4狀態(tài)存儲器可以兩個位來表示。一種現(xiàn)有的技術(shù)是使用2次編程來編程此種存儲器。第一位(下頁位)可由第一次編碼過程進(jìn)行編程。其后,可在第二次編碼過程中編程相同單元以代表所要的第二位(上頁位)。為了不要變更第二次編碼過程中第一位的值,會使第一位存儲器狀態(tài)表示取決于第二位的值。因此,在第二位的編程期間,如果因電源中斷或其它原因而發(fā)生錯誤且造成不正確的存儲器狀態(tài),則也會毀損第一位的值。
圖41A顯示當(dāng)各存儲器單元存儲兩個位的數(shù)據(jù)時,4狀態(tài)存儲器陣列的閾值電壓分布。此四個分布代表四個存儲器狀態(tài)“U”、“X”、“Y”及“Z”的總體。在編程存儲器單元之前,會先將其擦除至其“U”或“未寫入”狀態(tài)。在存儲器單元逐漸被編程時,會累進(jìn)達(dá)到存儲器狀態(tài)“X”、“Y”及“Z”。
圖41B顯示現(xiàn)有使用格雷碼(Gray code)的2次編程方案。此四個狀態(tài)可以兩個位表示,即,下頁位及上頁位,如(上頁位,下頁位)。對于要并行編程的單元的頁,實(shí)際上有兩個邏輯頁邏輯下頁及邏輯上頁。第一編程編碼過程只會編程邏輯下頁。通過合適的編碼,不用重設(shè)邏輯下頁,單元相同頁上的后續(xù)第二編程編碼過程會編程邏輯上頁。一般使用的程序代碼是格雷碼,其中只有一個位會在轉(zhuǎn)變至相鄰的狀態(tài)時變更。因此,此程序代碼具有如下優(yōu)點(diǎn)對于錯誤校正的要求較少,因?yàn)槠渲兄簧婕耙粋€位。
一般使用格雷碼的方案是假設(shè)“1”代表“未編程”條件。因此,已擦除的存儲器狀態(tài)“U”可表示為(上頁位,下頁位)=(1,1)。在編程邏輯下頁的第一次編碼過程中,任何存儲數(shù)據(jù)“0”的單元將因此具有其從(x,1)至(x,0)的邏輯狀態(tài)轉(zhuǎn)變,其中“x”代表上方位的“任意(don′t care)”值。然而,由于上方位尚未被編程,因此為了一致,也可將“x”標(biāo)示為“1”。(1,0)邏輯狀態(tài)可通過編程單元為存儲器狀態(tài)“X”來表示。也就是說,在第二次程序編碼過程之前,下方位值“0”可以表示為存儲器狀態(tài)“X”。
執(zhí)行第二次編碼過程編程以存儲邏輯上頁的位。只有這些需要上頁位值為“0”的單元才會被編程。在第一次編碼過程后,頁中的單元的邏輯狀態(tài)為(1,1)或(1,0)。為了保存第二次編碼過程中下頁的值,必須區(qū)分下方位值“0”或“1”。對于從(1,0)至(0,0)的轉(zhuǎn)變,會將所論存儲器單元編程為存儲器狀態(tài)“Y”。對于從(1,1)至(0,1)的轉(zhuǎn)變,會將所論存儲器單元編程為存儲器狀態(tài)“Z”。依此方式,在讀取期間,通過決定在單元中編程的存儲器狀態(tài),即可譯碼下頁位及上頁位。
然而,格雷碼的2次編程方案在第二次編碼過程編程錯誤時會成為問題。例如,在下方位為“1”時將上頁位編程為“0”,將造成(1,1)轉(zhuǎn)變成(0,1)。這需要將存儲器單元累進(jìn)從U編程通過“X”及“Y”而至“Z”。如果在完成編程前發(fā)生電源中斷,則存儲器單元將結(jié)束于轉(zhuǎn)變存儲器狀態(tài)之一,如“X”。在讀取存儲器單元時,會將“X”譯碼為邏輯狀態(tài)(1,0)。這對上方及下方位造成不正確的結(jié)果,因?yàn)槠鋺?yīng)為(0,1)。同樣,如果編程在達(dá)到“Y”時受到中斷,其將對應(yīng)于(0,0)。雖然上方位現(xiàn)在是正確的,但下方位還是錯的。
因此,可以看出上頁編程的問題可毀損已經(jīng)在下頁中的數(shù)據(jù)。尤其當(dāng)?shù)诙尉幋a過程編程涉及在中間存儲器狀態(tài)上通過時,程序中止會使編程結(jié)束于所述存儲器狀態(tài),造成譯碼不正確的下頁位。
圖42顯示通過存儲復(fù)制的各扇區(qū)以防衛(wèi)關(guān)鍵數(shù)據(jù)的方式。例如,可將扇區(qū)A、B、C及D存儲在復(fù)制副本中。如在一個扇區(qū)副本中有數(shù)據(jù)毀損,則可以讀取另一個來取代。
圖43顯示其中通常將復(fù)制扇區(qū)存儲在多狀態(tài)存儲器中的非健全性。如上所述,在范例的4狀態(tài)存儲器中,多狀態(tài)頁實(shí)際上包括分別在兩次中進(jìn)行編程的邏輯下頁及邏輯上頁。在所示的范例中,頁為四個扇區(qū)寬。因此,扇區(qū)A及其復(fù)制會同時被編程在邏輯下頁中,同樣,對于扇區(qū)B及其復(fù)制也是如此。然后在邏輯上頁中后續(xù)編程的第二次編碼過程中,會同時編程扇區(qū)C,C,及對于扇區(qū)D,D也是如此。如果在編程扇區(qū)C,C的中間發(fā)生程序中止,則會毀損下頁中的扇區(qū)A,A。除非,在上頁編程之前先讀取及緩沖下頁扇區(qū),否則如果毀損將無法復(fù)原。因此,同時存儲兩個關(guān)鍵數(shù)據(jù)的副本(如扇區(qū)A,A)無法防止其為其上頁中后續(xù)扇區(qū)C,C的有問題的存儲所毀損。
圖44A顯示將關(guān)鍵數(shù)據(jù)錯開的復(fù)制副本存儲至多狀態(tài)存儲器的一項(xiàng)實(shí)施例。基本上,會以和圖43的相同方式存儲下頁,即,扇區(qū)A,A及扇區(qū)B,B。然而,在上頁編程中,扇區(qū)C及D會和其復(fù)制交錯成C,D,C,D。如果支持局部頁編程,則可同時編程扇區(qū)C的兩個副本,且對于兩個扇區(qū)D的副本也是如此。如果(例如)兩個扇區(qū)C的程序遭到中止,則只會在扇區(qū)A的一個副本及扇區(qū)B的一個副本上毀損下頁。另一個副本將維持不受影響。因此,如果第一次編碼過程中存儲有關(guān)鍵數(shù)據(jù)的兩個副本,則其不將不會受到后續(xù)第二次編碼過程同時編程的影響。
圖44B顯示只將關(guān)鍵數(shù)據(jù)的復(fù)制副本存儲至多狀態(tài)存儲器的邏輯上頁的另一項(xiàng)實(shí)施例。此時,未使用下頁的數(shù)據(jù)。關(guān)鍵數(shù)據(jù)及其復(fù)制,如扇區(qū)A,A及扇區(qū)B,B只會被存儲至邏輯上頁。依此方式,如果有程序中止,則可將關(guān)鍵數(shù)據(jù)再寫入另一個邏輯上頁,而下頁數(shù)據(jù)的任何毀損將無關(guān)緊要。此辦法基本上使用各多狀態(tài)頁一半的存儲容量。
圖44C顯示又一項(xiàng)以多狀態(tài)存儲器的二進(jìn)制模式存儲關(guān)鍵數(shù)據(jù)的復(fù)制副本的實(shí)施例。此時,會依二進(jìn)制模式編程各存儲器單元,其中僅將其閾值范圍分成兩個區(qū)域。因此,其中只有一次編碼過程編程,且在發(fā)生程序中止時可在不同位置中重新啟動編程。此辦法也使用各多狀態(tài)頁一半的存儲容量。美國專利第6,456,528 B1號說明了依二進(jìn)制模式操作多狀態(tài)存儲器,所述專利的整個揭示內(nèi)容在此以參考的方式并入本文中。
圖45顯示同時將關(guān)鍵數(shù)據(jù)的復(fù)制副本存儲至兩個不同元區(qū)塊的又一項(xiàng)實(shí)施例。如果區(qū)塊之一變成不可用,則可從另一個區(qū)塊讀取數(shù)據(jù)。例如,關(guān)鍵數(shù)據(jù)包含在扇區(qū)A、B、C、D及E、F、G、H及I、J、K、L內(nèi)。各扇區(qū)會被存儲在復(fù)制中。這兩個副本將被同時寫入兩個不同的區(qū)塊,區(qū)塊0及區(qū)塊1。如果將一個副本寫入邏輯下頁,則會將另一個副本寫入邏輯上頁。依此方式,永遠(yuǎn)會有編程至邏輯上頁的副本。如果發(fā)生程序中止,則可將其重新編程至另一個邏輯上頁。同時,如果下頁已經(jīng)毀損,則在其它區(qū)塊中永遠(yuǎn)會有另一個上頁副本。
圖46B顯示使用容錯碼同時存儲關(guān)鍵數(shù)據(jù)的復(fù)制副本的又一項(xiàng)實(shí)施例。圖46A和圖41A同樣顯示4狀態(tài)存儲器陣列的閾值電壓分布并顯示作為圖46B的參考。容錯碼實(shí)質(zhì)上可避免在任何中間狀態(tài)中轉(zhuǎn)變的任何上頁編程。因此,在下頁編程的第一次編碼過程中,邏輯狀態(tài)(1,1)轉(zhuǎn)變?yōu)?1,0),如表示為編程已擦除的存儲器狀態(tài)“U”為“Y”。在使上頁位為“0”的第二次編碼過程編程中,如果下頁位為“1”,則邏輯狀態(tài)(1,1)轉(zhuǎn)變?yōu)?0,1),如表示為編程已擦除的存儲器狀態(tài)“U”為“X”。如果下頁位為“0”,則邏輯狀態(tài)(1,0)轉(zhuǎn)變?yōu)?0,0),如表示為編程存儲器狀態(tài)“Y”為“Z”。由于上頁編程僅涉及編程為下一個相鄰的存儲器狀態(tài),因此程序中止不會變更下頁位。
串行寫入關(guān)鍵數(shù)據(jù)的復(fù)制副本優(yōu)選如上述同時寫入。另一種避免同時毀損兩個副本的方式是循序?qū)懭敫北?。此方法較慢,但副本本身指示其在控制器檢查兩個副本時編程是否成功。
圖47為顯示兩個數(shù)據(jù)副本的可能狀態(tài)及數(shù)據(jù)有效性的表格。
如果第一及第二副本沒有ECC錯誤,則可將數(shù)據(jù)的編程視為完全成功。有效數(shù)據(jù)可從任一個副本取得。
如果第一副本沒有ECC錯誤,但第二副本有ECC錯誤,便表示編程在第二副本編程的中間受到中斷。第一副本含有有效數(shù)據(jù)。即使錯誤為可校正,第二副本數(shù)據(jù)已不可靠。
如果第一副本沒有ECC錯誤且第二副本已經(jīng)清空(擦除),便表示編程在第一副本編程結(jié)束后但在第二副本開始前受到中斷。第一副本含有有效數(shù)據(jù)。
如果第一副本有ECC錯誤且第二副本已經(jīng)清空(擦除),便表示編程在第一副本編程的中間受到中斷。即使錯誤為可校正,第一副本仍可能含有無效數(shù)據(jù)。
為了讀取復(fù)制中維持的數(shù)據(jù),以下技術(shù)為優(yōu)選,因?yàn)槠淅脧?fù)制副本的存在。讀取并比較兩個副本。在此情況下,圖47所示兩個副本的狀態(tài)可用來確保沒有任何錯誤誤測。
在另一項(xiàng)實(shí)施例中,控制器只讀取一個副本,為了顧及速度及簡單性,副本讀取優(yōu)選在兩個副本之間輪替。例如,在控制器讀取控制數(shù)據(jù)時,其可讀取如副本1,下一個控制讀取(任何控制讀取)則應(yīng)來自副本2,然后再是副本1等。依此方式,即可讀取并定期檢查兩個副本的完整性(ECC檢查)。其可減少無法在因變質(zhì)的數(shù)據(jù)保留所造成的時間錯誤中進(jìn)行檢測的風(fēng)險。例如,如果通常只讀取副本1,則副本2會逐漸變質(zhì)到錯誤無法為ECC挽救的程度,因而無法再使用第二副本。
先占式數(shù)據(jù)重新定位如結(jié)合圖20所述,區(qū)塊管理系統(tǒng)在其操作期間可在快閃存儲器中維持一組控制數(shù)據(jù)。此組控制數(shù)據(jù)會被存儲在和主機(jī)數(shù)據(jù)相同的元區(qū)塊中。因此,控制數(shù)據(jù)本身會受到區(qū)塊管理,因而會受到更新的影響,并因此也受到垃圾收集操作的影響。
其中還說明存在這樣的控制數(shù)據(jù)層級,其中較低層級中的控制數(shù)據(jù)更新比較高層級中的頻繁。例如,假設(shè)每個控制區(qū)塊有N個要寫入的控制扇區(qū),則通常會發(fā)生以下控制更新及控制區(qū)塊重新定位的序列。再次參考圖20,每N個CBI更新可填滿CBI區(qū)塊并觸發(fā)CBI重新定位(再寫入)及MAP更新。如果混亂區(qū)塊遭受關(guān)閉,則其也會觸發(fā)GAT更新。每個GAT更新可觸發(fā)MAP更新。每N個GAT更新可填滿區(qū)塊并觸發(fā)GAT區(qū)塊重新定位。此外,當(dāng)MAP區(qū)塊變滿時,也會觸發(fā)MAP區(qū)塊重新定位及MAPA區(qū)塊(如果存在的話,否則BOOT區(qū)塊會直接指向MAP)更新。此外,當(dāng)MAPA區(qū)塊變滿時,也會觸發(fā)MAPA區(qū)塊重新定位、BOOT區(qū)塊更新及MAP更新。此外,在BOOT區(qū)塊變滿時,將會觸發(fā)對另一個BOOT區(qū)塊的作用中BOOT區(qū)塊重新定位。
由于層級的形成方式為頂部的BOOT控制數(shù)據(jù),接著是MAPA、MAP、然后GAT,因此,在每N3個GAT更新中,將有“串接控制更新”,其中所有的GAT、MAP、MAPA及BOOT區(qū)塊都會被重新定位。在此情況下,在因主機(jī)寫入導(dǎo)致的混亂或循序更新區(qū)塊關(guān)閉造成GAT更新時,也會有垃圾收集操作(即,重新定位或再寫入)。在混亂更新區(qū)塊垃圾收集的情況下,會更新CBI,而這也會觸發(fā)CBI區(qū)塊重新定位。因此,在此極端的情況中,必須同時收集大量元區(qū)塊的垃圾。
從圖中可見,層級的各控制數(shù)據(jù)區(qū)塊在取得填充及接受重新定位方面有其自己的周期性。如果各控制數(shù)據(jù)區(qū)塊進(jìn)行正常,則將有發(fā)生以下情形的時候大量區(qū)塊的階段進(jìn)行整頓,因而觸發(fā)大量同時涉及所有這些區(qū)塊的重新定位或垃圾收集。許多控制區(qū)塊的重新定位將會花費(fèi)很長的時間,因此應(yīng)加以避免,因?yàn)橛行┲鳈C(jī)不容許因大量控制操作所造成的長時間延遲。
根據(jù)本發(fā)明的另一方面,在具有區(qū)塊管理系統(tǒng)的非易失性存儲器中,可實(shí)施存儲器區(qū)塊的“控制垃圾收集”或先占式重新定位,以避免發(fā)生大量的更新區(qū)塊均恰巧同時需要進(jìn)行重新定位的情形。例如,在更新用于控制區(qū)塊管理系統(tǒng)操作的控制數(shù)據(jù)時會發(fā)生此情況??刂茢?shù)據(jù)類型的層級可和不同程度的更新頻率共存,導(dǎo)致其關(guān)聯(lián)的更新區(qū)塊需要不同速率的垃圾收集或重新定位。有時候會有一個以上控制數(shù)據(jù)類型的垃圾收集操作同時發(fā)生。在極端的情況中,所有控制數(shù)據(jù)類型的更新區(qū)塊的重新定位階段會進(jìn)行整頓,導(dǎo)致所有的更新區(qū)塊都需要同時重新定位。
本發(fā)明可避免這種不想要的情況,其中每當(dāng)目前的存儲器操作可容納自發(fā)性的垃圾收集操作時,更新區(qū)塊的先占式重新定位便預(yù)先在完全填充區(qū)塊前發(fā)生。尤其,會將優(yōu)先權(quán)提供給具有最慢速率的最高層級數(shù)據(jù)類型的區(qū)塊。依此方式,在重新定位最慢速率區(qū)塊后,在相對較長的時間內(nèi)將不再需要另一次垃圾收集。還有,層級中較高的較慢速率區(qū)塊沒有太多要觸發(fā)的重新定位的串接??蓪⒈景l(fā)明方法視為為了避免所論各種區(qū)塊的階段對準(zhǔn),而將某種抖動引入事物的整體混合。因此,只要一有機(jī)會,即可以先占式的方式重新定位有些微不受完全填充的邊限的緩慢填充區(qū)塊。
在具有層級中較低的控制數(shù)據(jù)因串接效應(yīng)而變更快于層級中較高的控制數(shù)據(jù)的控制數(shù)據(jù)層次的系統(tǒng)中,會將優(yōu)先權(quán)提供給層級中較高的控制數(shù)據(jù)的區(qū)塊。一個執(zhí)行自發(fā)性先占式重新定位的機(jī)會的范例是在以下情況時當(dāng)主機(jī)寫入本身無法觸發(fā)重新定位,因此可利用其等待時間中的任何剩余時間來進(jìn)行先占式重新定位操作。一般而言,務(wù)必重新定位的區(qū)塊前的邊限是在區(qū)塊全滿前預(yù)定數(shù)量的未寫入存儲器單元。所考慮的是所述邊限足以促使在區(qū)塊完全填充前但又不會過早地重新定位,以免資源浪費(fèi)。在優(yōu)選實(shí)施例中,預(yù)定數(shù)量的未寫入存儲器單位是在一到六個存儲器單位之間。
圖48顯示先占式重新定位存儲控制數(shù)據(jù)的存儲器區(qū)塊的流程圖。
步驟1202將非易失性存儲器組織成區(qū)塊,各區(qū)塊分割成可一起擦除的存儲器單位。
步驟1204維持不同類型的數(shù)據(jù)。
步驟1206對不同類型的數(shù)據(jù)指派等級。
步驟1208在復(fù)數(shù)個區(qū)塊中存儲所述不同類型數(shù)據(jù)的更新,使得各區(qū)塊實(shí)質(zhì)上存儲相同類型的數(shù)據(jù)。
步驟1210響應(yīng)于具有少于預(yù)定數(shù)量的清空存儲器單位且具有所述復(fù)數(shù)個區(qū)塊中最高等級數(shù)據(jù)類型的區(qū)塊,將所述區(qū)塊的數(shù)據(jù)的目前更新重新定位至另一個區(qū)塊。若未受到中斷,到步驟1208。
實(shí)施圖20所示控制數(shù)據(jù)的先占式重新定位的范例算法如下如果(沒有任何因使用者數(shù)據(jù)所造成的垃圾收集)或(MAP留有6個或更少的未寫入扇區(qū))或(GAT留有3個或更少的未寫入扇區(qū))則如果(BOOT留有1個未寫入扇區(qū))則重新定位BOOT(即,重新定位至區(qū)塊)否則如果(MAPA留有1個未寫入扇區(qū))則重新定位MAPA并更新MAP否則如果(MAP留有1個未寫入扇區(qū))則重新定位MAP否則如果(上一個更新或最大的GAT留有1個未寫入扇區(qū))則重新定位GAT否則如果(CBI留有1個未寫入扇區(qū))則重新定位CBI否則否則離開因此,先占式重新定位通常完成于其中未發(fā)生任何使用者數(shù)據(jù)垃圾收集時。在最糟的情況中,當(dāng)每個主機(jī)寫入觸發(fā)使用者數(shù)據(jù)垃圾收集,但還有足夠的時間進(jìn)行一個區(qū)塊的自發(fā)性重新定位時,一次可執(zhí)行一個控制區(qū)塊的先占式重新定位。
由于使用者數(shù)據(jù)垃圾收集操作及控制更新可能和物理錯誤同時發(fā)生,因此,最好具有較大的安全性邊限,其是通過事先如在區(qū)塊還有2個或更多未寫入的存儲器單位(如,扇區(qū))時,先行進(jìn)行先占式重新定位或有控制的垃圾收集。
雖然已經(jīng)針對特定實(shí)施例說明本發(fā)明的各種方面,但應(yīng)明白,本發(fā)明有權(quán)受到隨附權(quán)利要求范圍的完整范疇的保護(hù)。
權(quán)利要求
1.一種在一被組織成多個區(qū)塊的非易失性存儲器中存儲且更新數(shù)據(jù)的方法,其中每個區(qū)塊均被分割成可一起擦除的多個存儲器單位,每個存儲器單位用于存儲一數(shù)據(jù)邏輯單位,所述方法包括將所述存儲器組織成一連串的頁,具有所有存儲器單位的每一頁均由一組感測電路來并行服務(wù);將數(shù)據(jù)組織成復(fù)數(shù)個邏輯群組,每個邏輯群組均被分割成復(fù)數(shù)個數(shù)據(jù)邏輯單位;依照一第一順序,逐頁地將一邏輯群組的多個邏輯單位的一第一版本存儲于一第一區(qū)塊中,以使每個邏輯單位被存儲于所述頁中具有一給定偏移的一存儲器單位中;及依照不同于所述第一順序的一第二順序,逐頁地將所述邏輯群組的多個邏輯單位的后續(xù)版本存儲于一第二區(qū)塊中,每個后續(xù)版本被存儲于所述頁中具有等同于所述第一版本的偏移的一偏移的下一個可用存儲器單位中,以使一相同的感測電路群組可存取一邏輯單位的所有版本。
2.根據(jù)權(quán)利要求1所述的方法,其進(jìn)一步包括在存儲多個邏輯單位的后續(xù)版本的同時,填補(bǔ)每一頁內(nèi)所述下一個可用存儲器單位前面任何未被使用的存儲器單位,填補(bǔ)方式是依照所述第一順序?qū)⒍鄠€邏輯單位的目前版本復(fù)制至所述存儲器單位。
3.根據(jù)權(quán)利要求1所述的方法,其進(jìn)一步包括利用多個存儲器平面來構(gòu)成所述存儲器,每個平面均被組織成一連串的頁,具有所有存儲器單位的每個頁均由一組感測電路來并行服務(wù);將所述存儲器組織成一連串的元頁,每個元頁均由來自每個平面中的一存儲器頁所構(gòu)成,以使一元頁中的所有存儲器單位均由多個感測電路來并行服務(wù)。
4.根據(jù)權(quán)利要求3所述的方法,其進(jìn)一步包括在存儲多個邏輯單位的后續(xù)版本的同時,填補(bǔ)每一元頁內(nèi)所述下一個可用存儲器單位前面任何未被使用的存儲器單位,填補(bǔ)方式是依照所述第一順序?qū)⑦壿媶挝坏哪壳鞍姹緩?fù)制至所述存儲器單位。
5.根據(jù)權(quán)利要求1至4中任一權(quán)利要求所述的方法,其中每個邏輯單位是一主機(jī)數(shù)據(jù)扇區(qū)。
6.根據(jù)權(quán)利要求1至4中任一權(quán)利要求所述的方法,其中每個頁均存儲一個數(shù)據(jù)邏輯單位。
7.根據(jù)權(quán)利要求1至4中任一權(quán)利要求所述的方法,其中每個頁均存儲一個以上數(shù)據(jù)邏輯單位。
8.根據(jù)權(quán)利要求1至4中任一權(quán)利要求所述的方法,其中所述非易失性存儲器具有多個浮動?xùn)艠O存儲器單元。
9.根據(jù)權(quán)利要求1至4中任一權(quán)利要求所述的方法,其中所述非易失性存儲器是快閃EEPROM。
10.根據(jù)權(quán)利要求1至4中任一權(quán)利要求所述的方法,其中所述非易失性存儲器是NROM。
11.根據(jù)權(quán)利要求1至4中任一權(quán)利要求所述的方法,其中所述非易失性存儲器是在一存儲卡中。
12.根據(jù)權(quán)利要求1至4中任一權(quán)利要求所述的方法,其中所述非易失性存儲器具有可各自存儲一位數(shù)據(jù)的多個存儲器單元。
13.根據(jù)權(quán)利要求1至4中任一權(quán)利要求所述的方法,其中所述非易失性存儲器具有可各自存儲一位以上數(shù)據(jù)的多個存儲器單元。
14.一種非易失性存儲器,其包括一被組織成復(fù)數(shù)個區(qū)塊的存儲器,每個區(qū)塊均為可一起擦除的復(fù)數(shù)個存儲器單位,每個存儲器單位用于存儲一數(shù)據(jù)邏輯單位,而且每個區(qū)塊用于將一邏輯單位的邏輯群組存儲于復(fù)數(shù)個元頁中,每個元頁均由每個平面中的一存儲器頁所構(gòu)成;一控制器,其用來控制所述多個區(qū)塊的操作;所述控制器依照一第一順序?qū)⒍鄠€數(shù)據(jù)邏輯單位的一第一版本存儲于一第一區(qū)塊的多個存儲器單位中,每個第一版本邏輯單位均被存儲于所述存儲器平面之一中;及所述控制器依照不同于所述第一順序的一第二順序?qū)⒍鄠€邏輯單位的后續(xù)版本存儲于一第二區(qū)塊中,每個后續(xù)版本均被存儲于與所述第一版本相同的平面中的下一個可用的存儲器單位中,以便可從所述同一平面中存取一邏輯單位的所有版本。
15.根據(jù)權(quán)利要求14所述的非易失性存儲器,其進(jìn)一步包括在存儲多個邏輯單位的后續(xù)版本的同時,所述控制器依照所述第一順序,使用多個邏輯單位的目前版本逐個元頁地填補(bǔ)位于所述下一個可用存儲器單位前面的任何未被使用的存儲器單位;及其中所述下一個可用存儲器單位在其元頁中具有與所述第一版本的偏移相同的偏移。
16.根據(jù)權(quán)利要求14所述的非易失性存儲器,其中所述非易失性存儲器具有多個浮動?xùn)艠O存儲器單元。
17.根據(jù)權(quán)利要求14所述的非易失性存儲器,其中所述非易失性存儲器是快閃EEPROM。
18.根據(jù)權(quán)利要求14所述的非易失性存儲器,其中所述非易失性存儲器是NROM。
19.根據(jù)權(quán)利要求14所述的非易失性存儲器,其中所述非易失性存儲器是在一存儲卡中。
20.根據(jù)權(quán)利要求14至19中任一權(quán)利要求所述的非易失性存儲器,其中所述非易失性存儲器具有可各自存儲一位數(shù)據(jù)的多個存儲器單元。
21.根據(jù)權(quán)利要求14至19中任一權(quán)利要求所述的非易失性存儲器,其中所述非易失性存儲器具有可各自存儲一位以上數(shù)據(jù)的多個存儲器單元。
22.一種非易失性存儲器,其包括一被組織成復(fù)數(shù)個區(qū)塊的存儲器,每個區(qū)塊均為可一起擦除的復(fù)數(shù)個存儲器單位,每個存儲器單位用于存儲一數(shù)據(jù)邏輯單位,而且每個區(qū)塊用于將一邏輯單位的邏輯群組存儲于復(fù)數(shù)個元頁中,每個元頁均由每個平面中的一存儲器頁所構(gòu)成;存儲構(gòu)件,其用以依照一第一順序?qū)⒍鄠€數(shù)據(jù)邏輯單位的一第一版本存儲于一第一區(qū)塊的多個存儲器單元中,每個第一版本邏輯單位均被存儲于所述存儲器平面之一中;及存儲構(gòu)件,其用以依照不同于所述第一順序的一第二順序?qū)⑦壿媶挝坏暮罄m(xù)版本存儲于一第二區(qū)塊中,每個后續(xù)版本均被存儲于與所述第一版本相同的平面中的下一個可用存儲器單位中,以便可從所述同一平面中存取一邏輯單位的所有版本。
23.根據(jù)權(quán)利要求22所述的非易失性存儲器,其進(jìn)一步包括填補(bǔ)構(gòu)件,其用于依照所述第一順序,使用多個邏輯單位的目前版本逐個元頁地填補(bǔ)位于所述下一個可用存儲器單位前面的任何未被使用的存儲器單位;及其中所述下一個可用存儲器單位在其元頁中具有與所述第一版本的偏移相同的偏移。
全文摘要
本發(fā)明提供一種由一組存儲器平面組成的非易失性存儲器,每個存儲器平面均具有自己的一組讀/寫電路,以使所述存儲器平面能夠并行地運(yùn)作。所述存儲器進(jìn)一步被組織成可擦除區(qū)塊,每個區(qū)塊均用于存儲一具有多個數(shù)據(jù)邏輯單位的邏輯群組。在更新邏輯單位時,邏輯單位的所有版本都會保留在和原始版本相同的平面中。優(yōu)選的,邏輯單位的所有版本均被對準(zhǔn)在一平面中,以使其全部由同一組感測電路來服務(wù)。在后續(xù)的垃圾收集(garbage collection)操作中,并不需要從一不同的平面或不同的一組感測電路中檢索所述邏輯單位的最新版本,否則便會降低性能。在一個實(shí)施例中,在對準(zhǔn)之后所留下的任何間隙均通過復(fù)制其后面的邏輯單位的最新版本來加以填補(bǔ)。
文檔編號G06F11/20GK1922586SQ200480042138
公開日2007年2月28日 申請日期2004年12月21日 優(yōu)先權(quán)日2003年12月30日
發(fā)明者瑟吉·阿納托利耶維奇·戈羅別茨, 彼得·約翰·史密斯, 艾倫·戴維·貝內(nèi)持 申請人:桑迪士克股份有限公司