本發(fā)明涉及通信技術(shù)領(lǐng)域,尤其涉及一種存儲系統(tǒng)掉電保護方法、存儲控制器及電子設(shè)備。
背景技術(shù):
隨著閃存技術(shù)的普及,基于flash(中文:閃存)的存儲設(shè)備(如SSD,Solid State Drive,中文:固態(tài)硬盤)在開發(fā)、測試,以及用戶使用過程中,可能由于終端產(chǎn)生異常掉電而造成閃存狀態(tài)異常,從而導致數(shù)據(jù)被破壞,最終造成設(shè)備開機失敗。
目前,為了實現(xiàn)終端產(chǎn)生異常掉電時的掉電保護,在寫數(shù)據(jù)時,元數(shù)據(jù)存儲模塊,通常在每個塊的每一頁的OOB(英文:Out Of Band,中文:帶外空間)區(qū)域,或是在最后一頁的OOB區(qū)域記錄數(shù)據(jù)的信息摘要,其中,信息摘要包括塊上所有頁的邏輯地址和物理地址的映射關(guān)系;由于在屬于非易失性介質(zhì)的SSD中的數(shù)據(jù)進行改寫時,并不是在原有數(shù)據(jù)所存儲的位置進行改寫,而是將改寫的內(nèi)容存儲在SSD中的其他位置,且當需要存儲至SSD中的映射關(guān)系達到一定數(shù)量時,才能夠下寫至SSD中,因此,在發(fā)生掉電時,新的映射關(guān)系雖然已經(jīng)生成,但考慮到SSD是以數(shù)據(jù)塊為單位進行存儲的,這樣可能會導致新的映射關(guān)系還未下寫到SSD中,及新的映射關(guān)系不能被及時存儲在SSD中;當存儲系統(tǒng)上電時,存儲陣列掃描模塊通過對整個SSD掃描每一頁的OOB區(qū)域,或是掃描最后一頁的OOB區(qū)域,來獲取所有數(shù)據(jù)頁的映射關(guān)系,之后根據(jù)所獲取的所有數(shù)據(jù)頁的映射關(guān)系的新舊程度,確定同一邏輯地址對應(yīng)的最新的物理地址,從而確定最新的映射關(guān)系,以實現(xiàn)掉電保護。
但是,由于SSD的容量很大,對SSD進行全盤掃描會耗費大量的時間。因此,采用上述方法來實現(xiàn)掉電保護,對于大容量的SSD,存儲系統(tǒng)需要耗費大量時間進行映射關(guān)系的恢復(fù)。
技術(shù)實現(xiàn)要素:
本發(fā)明提供一種存儲系統(tǒng)掉電保護方法、存儲控制器及電子設(shè)備,能夠解決存儲系統(tǒng)需要耗費大量時間進行映射關(guān)系恢復(fù)的問題。
為達到上述目的,本發(fā)明實施例采用如下技術(shù)方案:
一方面,本發(fā)明提供一種存儲系統(tǒng)掉電保護方法,該方法用于一種電子設(shè)備,電子設(shè)備中包括:中央處理器(英文:,簡稱:CPU)、存儲控制器、flash、高速非易失性存儲器和動態(tài)隨機存取存儲器(英文:,簡稱:DRAM),高速非易失性存儲器中保存有一級映射表和日志緩存區(qū),flash中保存有二級映射表、三級映射表和日志區(qū),其中,
日志緩存區(qū)用于保存在電子設(shè)備正常工作時,CPU在將數(shù)據(jù)的映射關(guān)系寫到DRAM的同時,通過存儲控制器寫到日志緩存區(qū)中數(shù)據(jù)的映射關(guān)系;
日志區(qū)用于在若日志緩存區(qū)中的存儲空間達到第一閾值后,保存存儲控制器從日志緩存區(qū)中讀取的數(shù)據(jù)的映射關(guān)系;
三級映射表的索引信息為數(shù)據(jù)的映射關(guān)系,三級映射表用于在日志區(qū)中的數(shù)據(jù)達到第二閾值時,三級映射表被刷新并保存日志區(qū)中數(shù)據(jù)的映射關(guān)系;
一級映射表的索引信息為二級映射表的映射關(guān)系;
二級映射表的索引信息為三級映射表的映射關(guān)系;
映射關(guān)系為邏輯地址與物理地址的對應(yīng)關(guān)系;
該方法包括:
當CPU前次下電屬于異常下電后,存儲控制器根據(jù)一級映射表的索引信息確定二級映射表的物理地址,并根據(jù)二級映射表的物理地址找到二級映射表,通過訪問二級映射表的索引信息來確定三級映射表的物理地址,之后根據(jù)三級映射表的物理地址找到三級映射表,確定三級映射表的索引信息;
存儲控制器讀取日志緩存區(qū)中所有數(shù)據(jù)的映射關(guān)系,以及日志區(qū)中所有數(shù)據(jù)的映射關(guān)系;
存儲控制器向CPU發(fā)送三級映射表的索引信息、日志緩存區(qū)中所有數(shù)據(jù)的映射關(guān)系,以及日志區(qū)中所有數(shù)據(jù)的映射關(guān)系;
當存儲控制器在CPU根據(jù)三級映射表的索引信息、日志緩存區(qū)中所有數(shù)據(jù)的映射關(guān)系判斷有至少一個數(shù)據(jù)在日志緩存區(qū)的映射關(guān)系或者在日志區(qū)中的映射關(guān)系與在三級映射表中的映射關(guān)系不一致時,使用至少一個數(shù)據(jù)在日志緩存區(qū)的映射關(guān)系或者在日志區(qū)中的映射關(guān)系替換掉在三級映射表中的映射關(guān)系,其中,在替換時,優(yōu)先使用至少一個數(shù)據(jù)在日志緩存區(qū)的映射關(guān)系進行替換;
存儲控制器根據(jù)刷新后的三級映射表更新二級映射表的索引信息,之后根據(jù)更新后的二級映射表更新一級映射表的索引信息,且將更新后的二級映射表中在更新前后發(fā)生改變的映射關(guān)系保存至DRAM。
其中,本發(fā)明實施例中,高速非易失性存儲器是指讀寫速度比flash更快,同時,每次可直接操作數(shù)據(jù)的粒度更小(例如,按字節(jié)進行操作而不像flash一樣按塊進行操作)的存儲器,例如,MRAM(英文:Magnetic Random Access Memory,中文:磁性隨機存取存儲器)或者PCM(英文:Phase-change memory,中文:相變存儲器)。但高速非易失性存儲器通常成本比flash高,容量也比flash小,無法適合大規(guī)模使用。
本實施例中,設(shè)置了各級映射表以及日志緩存區(qū)、日志區(qū)等多個位置來保存數(shù)據(jù)的映射關(guān)系,使得CPU斷電后,存儲控制器能夠根據(jù)保存的各個映射關(guān)系進行恢復(fù),在這過程中,由于是通過各級映射表一級一級地查找,而不是使用現(xiàn)有技術(shù)全盤掃描的方式,因此,在查找數(shù)據(jù)的映射關(guān)系的過程中提升了速度。
另一方面,在保存各個映射關(guān)系時,還充分利用了高速非易失性存儲器以及flash的特點。具體的,以高速非易失性存儲器為MRAM為例,由于MRAM速度快的特性,可以將日志緩存區(qū)放在MRAM中,由于CPU在將數(shù)據(jù)映射關(guān)系寫到DRAM時,也會寫到MRAM,這是個使用頻率很高的操作,如果速度慢,會對整個系統(tǒng)造成影響,因此,這里使用MRAM來保存日志緩存區(qū)的數(shù)據(jù),能夠最大程度保證系統(tǒng)的性能。
同時,本實施例還將一級映射表也放置在MRAM中,由于一級映射表是用于查找二、三級映射表的,所以必須先知道一級映射表的地址,且這個地址需要固定。如果將一級映射表放置在flash一片固定地址中,由于flash本身的特性,不斷讀寫這一塊區(qū)域時,會產(chǎn)生過多磨損,最終導致flash發(fā)生故障。而MRAM并不存在這個問題,因此,可以在MRAM中專門開辟一塊區(qū)域來進行一級映射表的放置。同時,由于一級映射表的容量也不會很大(僅保存二級表的索引信息),因此,也適合使用MRAM來保存映射表。而其他表(例如,二級映射表、三級映射表)占用空間相對較大,可以利用flash大容量的特性放置在flash當中,從而達到最優(yōu)配置。
在一種可能的設(shè)計中,在CPU上電之后,存儲控制器需要向CPU上報用于反應(yīng)異常下電的標志位,該標志位位于存儲控制器的寄存器,使得CPU根據(jù)標志位判斷前次下電是否屬于異常下電。
由此可見,采用上述上報標志位的方式,能夠使CPU快速且有效區(qū)分前次下電是否屬于異常下電,若屬于正常下電,則觸發(fā)正常上電流程,否則,則觸發(fā)上述異常上電流程。
在一種可能的設(shè)計中,日志緩存區(qū)被劃分為n個隊列,n個隊列用Q1至Qn表示,其中,n為大于或等于1的正整數(shù),日志區(qū)包括至少兩個區(qū)塊,且每個區(qū)塊對應(yīng)日志緩存區(qū)中的一個隊列;在日志緩存區(qū)中的存儲空間達到第一閾值后,存儲控制器從日志緩存區(qū)中讀取日志緩存區(qū)中的數(shù)據(jù)的映射關(guān)系,并保存到日志區(qū),具體包括:在日志緩存區(qū)中目標列的存儲空間達到第一閾值后,存儲控制器將目標列中數(shù)據(jù)的映射關(guān)系存儲至日志區(qū)中目標區(qū)塊對應(yīng)的位置,目標區(qū)塊為目標列對應(yīng)的區(qū)塊。
考慮到日志緩存區(qū)中的存儲空間有限,這樣一來不僅可以保證日志緩存區(qū)中存在足夠的空閑存儲資源,同時還可以保證,批量將數(shù)據(jù)的映射關(guān)系寫到flash的日志區(qū)中,即滿足了日志區(qū)對于數(shù)據(jù)的映射關(guān)系的存儲要求。
在一種可能的設(shè)計中,在電子設(shè)備正常工作時,若三級映射表在刷新后被修改條目的數(shù)量達到第三閾值,則存儲控制器根據(jù)刷新后的三級映射表刷新二級映射表的索引信息;若二級映射表在刷新后被修改條目的數(shù)量達到第四閾值,則存儲控制器根據(jù)刷新后的二級映射表更新一級映射表的索引信息。
在本發(fā)明中,索引信息是逐級刷新的,且根據(jù)三級映射表刷新二級映射表,以及根據(jù)二級映射表刷新一級映射表的過程,均是在映射表中被修改條目的數(shù)量達到一定閾值時,才進行刷新的。由此可見,采用上述批量刷新的方式,能夠在盡可能確保映射表處于較新狀態(tài)的前提條件下,減少映射表的刷新頻次,同時,滿足映射表對于刷新操作的需求。
另一方面,本發(fā)明提供一種存儲控制器,該存儲控制器可以實現(xiàn)上述方法示例中存儲控制器所執(zhí)行的功能,所述功能可以通過硬件實現(xiàn),也可以通過硬件執(zhí)行相應(yīng)的軟件實現(xiàn)。所述硬件或軟件包括一個或多個上述功能相應(yīng)的模塊。
又一方面,本發(fā)明提供一種電子設(shè)備,該電子設(shè)備中包括:CPU、上述存儲控制器、flash、高速非易失性存儲器和動態(tài)隨機存取存儲器(英文:Dynamic Random Access Memory,簡稱:DRAM),該存儲控制器用于執(zhí)行上述方法中存儲控制器的相應(yīng)功能。該電子設(shè)備中還可以包括通信接口,用于與其他設(shè)備之間進行通信。
又一方面,本發(fā)明提供了一種計算機存儲介質(zhì),用于儲存為上述存儲控制器所用的計算機軟件指令,其包含用于執(zhí)行上述方面所設(shè)計的程序。
本發(fā)明提供的存儲系統(tǒng)掉電保護方法、存儲控制器及電子設(shè)備,高速非易失性存儲器是指讀寫速度比flash更快,同時,每次可直接操作數(shù)據(jù)的粒度更小的存儲器,例如,MRAM或者PCM。但高速非易失性存儲器通常成本比flash高,容量也比flash小,無法適合大規(guī)模使用。在本發(fā)明中,設(shè)置了各級映射表以及日志緩存區(qū)、日志區(qū)等多個位置來保存數(shù)據(jù)的映射關(guān)系,使得CPU斷電后,存儲控制器能夠根據(jù)保存的各個映射關(guān)系進行恢復(fù),在這過程中,由于是通過各級映射表逐級地查找,而不是使用現(xiàn)有技術(shù)全盤掃描的方式,因此,在查找數(shù)據(jù)的映射關(guān)系的過程中提升了速度。并且,在保存各個映射關(guān)系時,還充分利用了高速非易失性存儲器以及flash的特點。具體的,以高速非易失性存儲器為MRAM為例,由于MRAM速度快的特性,可以將日志緩存區(qū)放在MRAM中,由于CPU在將數(shù)據(jù)映射關(guān)系寫到DRAM時,也會寫到MRAM,這是個使用頻率很高的操作,如果速度慢,會對整個系統(tǒng)造成影響,因此,這里使用MRAM來保存日志緩存區(qū)的數(shù)據(jù),能夠最大程度保證系統(tǒng)的性能。同時,本發(fā)明還將一級映射表也放置在MRAM中,由于一級映射表是用于查找二、三級映射表的,所以必須先知道一級映射表的地址,且這個地址需要固定。如果將一級映射表放置在flash一片固定地址中,由于flash本身的特性,不斷讀寫這一塊區(qū)域時,會產(chǎn)生過多磨損,最終導致flash發(fā)生故障。而MRAM并不存在這個問題,因此,可以在MRAM中專門開辟一塊區(qū)域來進行一級映射表的放置。同時,由于一級映射表的容量也不會很大,因此,也適合使用MRAM來保存映射表。而其他表占用空間相對較大,可以利用flash大容量的特性放置在flash當中,從而達到最優(yōu)配置。
附圖說明
為了更清楚地說明本發(fā)明實施例中的技術(shù)方案,下面將對實施例中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其它的附圖。
圖1為本發(fā)明實施例提供的一種電子設(shè)備的結(jié)構(gòu)示意圖;
圖2為本發(fā)明實施例提供的一種存儲系統(tǒng)掉電保護方法流程圖;
圖3至圖6為本發(fā)明實施例提供的另一種MRAM的結(jié)構(gòu)示意圖;
圖7為本發(fā)明實施例提供的另一種存儲系統(tǒng)掉電保護方法流程圖;
圖8為本發(fā)明實施例提供的一種存儲控制器的結(jié)構(gòu)示意圖;
圖9為本發(fā)明實施例提供的另一種存儲控制器的結(jié)構(gòu)示意圖。
具體實施方式
下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其它實施例,都屬于本發(fā)明保護的范圍。
參見圖1,本發(fā)明適用于一種電子設(shè)備,該電子設(shè)備中包括CPU、存儲控制器、flash、高速非易失性存儲器和DRAM。其中,DRAM具體可以為內(nèi)存,高速非易失性存儲器具體可以為MRAM,存儲控制器可以用FPGA來實現(xiàn)。
在本發(fā)明中,高速非易失性存儲器中保存有一級映射表和日志緩存區(qū),flash中保存有二級映射表、三級映射表和日志區(qū),其中,日志緩存區(qū)用于保存在電子設(shè)備正常工作時,CPU在將數(shù)據(jù)的映射關(guān)系寫到DRAM的同時,通過存儲控制器寫到日志緩存區(qū)中數(shù)據(jù)的映射關(guān)系;日志區(qū)用于在若日志緩存區(qū)中的存儲空間達到第一閾值后,保存存儲控制器從日志緩存區(qū)中讀取的數(shù)據(jù)的映射關(guān)系;三級映射表的索引信息為數(shù)據(jù)的映射關(guān)系,三級映射表用于在日志區(qū)中的數(shù)據(jù)達到第二閾值時,三級映射表被刷新并保存日志區(qū)中數(shù)據(jù)的映射關(guān)系;一級映射表的索引信息為二級映射表的映射關(guān)系;二級映射表的索引信息為三級映射表的映射關(guān)系;映射關(guān)系為邏輯地址與物理地址的對應(yīng)關(guān)系。
需要說明的是,上述第一閾值,以及后文所提及的第二至第四閾值,在設(shè)定時,均可以依據(jù)經(jīng)驗值或是具體的應(yīng)用場景來預(yù)先設(shè)定。其中,第一閾值的作用在于判別日志緩存區(qū)中存儲的數(shù)據(jù)的映射關(guān)系是否需要寫到flash的日志區(qū)中;第二閾值的作用在于判別日志區(qū)中存儲的數(shù)據(jù)的映射關(guān)系是否需要寫到flash的三級映射表中;第三閾值的作用在于判別刷新后的三級映射表中被修改的條目是否需要刷新到二級映射表中;第四閾值的作用在于判別刷新后的二級映射表中被修改的條目是否需要刷新到一級映射表中。還需要說明的是,第一、第二閾值均作為存儲空間占用情況的參考值,比如,該第一閾值和/或該第二閾值可以被設(shè)置為100%,90%等用于表示存儲空間占用情況的參數(shù),其中,若將該第一閾值設(shè)置為100%,則表明在日志緩存區(qū)中的存儲空間已滿后,存儲控制器將日志緩存區(qū)中的數(shù)據(jù)的映射關(guān)系寫到flash的日志區(qū)中;第三、第四閾值均作為被修改條目的數(shù)量的參考值,比如,該第三閾值和/或該第四閾值可以被設(shè)置為50條,100條等用于表示修改條目的數(shù)量的參數(shù),其中,若將該第三閾值設(shè)置為50條,則表明三級表在刷新后被修改的條目達到50條后,則存儲控制器會根據(jù)刷新后的三級映射表刷新二級映射表的索引信息。另外,在本發(fā)明中,第一閾值與第二閾值的取值可以相同或不同,第三閾值與第四閾值的取值也可以相同或不同,在此不做限定,且上述閾值的設(shè)置方式以及參數(shù)類型也不做限制,比如,參數(shù)類型可以為百分數(shù)、整數(shù)等其他類型。
另外,若日志緩存區(qū)中的數(shù)據(jù)的映射關(guān)系已經(jīng)寫到flash的日志區(qū)中,那么為了節(jié)省存儲空間,存儲控制器可以直接將日志緩存區(qū)中已經(jīng)寫到日志區(qū)的內(nèi)容刪除,同時釋放已刪除內(nèi)容所占用的空間,以確保黨日志緩存區(qū)需要存儲新的數(shù)據(jù)的映射關(guān)系時,該日志緩存區(qū)仍然能夠為緩存過程提供足夠的存儲空間,即存儲資源。或者,存儲控制器不對日志緩存區(qū)中的內(nèi)容進行刪除,而是對該部分內(nèi)容進行標記,并當新的數(shù)據(jù)的映射關(guān)系寫到日志緩存區(qū)時,直接覆蓋已被標記的那部分內(nèi)容,這樣一來,同樣可以達到空間充分利用的效果。對于三級映射表而言,若日志區(qū)所存儲的數(shù)據(jù)達到第二閾值后,存儲控制器同樣需要將日志區(qū)中的內(nèi)容按區(qū)塊寫到三級映射表中,并且,為了節(jié)省flash的存儲空間,也需要將日志區(qū)的內(nèi)容進行刪除。
本發(fā)明實施例提供一種存儲系統(tǒng)掉電保護方法,如圖2所示,該方法均可以由上述存儲控制器來執(zhí)行。
需要說明的是,該存儲控制器具體可以包括MRAM控制器和SSD控制器,其中,MRAM控制器可以用于監(jiān)控MRAM中一級映射表和日志緩存區(qū)的狀態(tài),例如,判斷日志緩存區(qū)的存儲空間是否達到一定閾值,此外,MRAM控制器還可以根據(jù)MRAM的狀態(tài),通知SSD控制器執(zhí)行相應(yīng)操作;同理,SSD控制器可以用于監(jiān)控flash中二級映射表、三級映射表和日志區(qū)的狀態(tài),例如,判斷當前三級映射表中的數(shù)據(jù)的映射關(guān)系是否需要逐級刷新到二級映射表和一級映射表中,此外,SSD控制器還可以根據(jù)flash的狀態(tài),通知MRAM控制器執(zhí)行相應(yīng)操作。
另外,上述存儲控制器的具體實現(xiàn)過程會在下文提出,在此不做贅述,且上述SSD控制器與MRAM控制器僅作為存儲控制器的一種具體的實現(xiàn)方式,但并不僅限于上述實現(xiàn)方式。
該方法流程包括:
101、當CPU前次下電屬于異常下電后,存儲控制器根據(jù)一級映射表的索引信息確定二級映射表的物理地址,并根據(jù)二級映射表的物理地址找到二級映射表,通過訪問二級映射表的索引信息來確定三級映射表的物理地址,之后根據(jù)三級映射表的物理地址找到三級映射表,確定三級映射表的索引信息。
102、存儲控制器讀取日志緩存區(qū)中所有數(shù)據(jù)的映射關(guān)系,以及日志區(qū)中所有數(shù)據(jù)的映射關(guān)系。
103、存儲控制器向CPU發(fā)送三級映射表的索引信息、日志緩存區(qū)中所有數(shù)據(jù)的映射關(guān)系,以及日志區(qū)中所有數(shù)據(jù)的映射關(guān)系。
104、當存儲控制器在CPU根據(jù)三級映射表的索引信息、日志緩存區(qū)中所有數(shù)據(jù)的映射關(guān)系判斷有至少一個數(shù)據(jù)在日志緩存區(qū)的映射關(guān)系或者在日志區(qū)中的映射關(guān)系與在三級映射表中的映射關(guān)系不一致時,使用至少一個數(shù)據(jù)在日志緩存區(qū)的映射關(guān)系或者在日志區(qū)中的映射關(guān)系替換掉在三級映射表中的映射關(guān)系。
其中,在替換時,優(yōu)先使用至少一個數(shù)據(jù)在日志緩存區(qū)的映射關(guān)系進行替換。
105、存儲控制器根據(jù)刷新后的三級映射表更新二級映射表的索引信息,之后根據(jù)更新后的二級映射表更新一級映射表的索引信息,且將更新后的二級映射表中在更新前后發(fā)生改變的映射關(guān)系保存至DRAM。
在本發(fā)明中,為了節(jié)省flash的存儲資源,可以在DRAM保存了更新后的二級映射表之后,將flash中的二級映射表清空。
需要說明的是,當CPU正常下電時,在軟件層面,存儲控制器的一些程序模塊(例如,驅(qū)動)可以調(diào)用算法下電接口,通知算法進行正常下電操作;算法調(diào)用saveMap3inSSD函數(shù),并通過驅(qū)動邏輯將DRAM中所有更新的三級映射表下寫到flash中,并返回新寫入flash中三級映射表的物理地址;根據(jù)返回的flash中新寫入的三級映射表的物理地址來更新DRAM中二級映射表的內(nèi)容;將更新后的DRAM中所有的有更新的二級映射表寫到flash中,并返回新寫入二級映射表的物理地址;將返回的二級映射表的物理地址保存到MRAM的一級映射表中;將flash中當前的日志區(qū)內(nèi)所有塊全部設(shè)置為垃圾塊,并向驅(qū)動返回算法下電操作完成,同時驅(qū)動可以將存儲控制器的寄存器中用于反應(yīng)前次下電過程是否屬于異常下電的標志位flag設(shè)置為1,即表示前次下電過程屬于正常下電。
在本發(fā)明中,高速非易失性存儲器是指讀寫速度比flash更快,同時,每次可直接操作數(shù)據(jù)的粒度更小(例如,按字節(jié)進行操作而不像flash一樣按塊進行操作)的存儲器,例如,MRAM或者PCM。但高速非易失性存儲器通常成本比flash高,容量也比flash小,無法適合大規(guī)模使用。
本實施例中,設(shè)置了各級映射表以及日志緩存區(qū)、日志區(qū)等多個位置來保存數(shù)據(jù)的映射關(guān)系,使得CPU斷電后,存儲控制器能夠根據(jù)保存的各個映射關(guān)系進行恢復(fù),在這過程中,由于是通過各級映射表一級一級地查找,而不是使用現(xiàn)有技術(shù)全盤掃描的方式,因此,在查找數(shù)據(jù)的映射關(guān)系的過程中提升了速度。
另一方面,在保存各個映射關(guān)系時,還充分利用了高速非易失性存儲器以及flash的特點。具體的,以高速非易失性存儲器為MRAM為例,由于MRAM速度快的特性,可以將日志緩存區(qū)放在MRAM中,由于CPU在將數(shù)據(jù)映射關(guān)系寫到DRAM時,也會寫到MRAM,這是個使用頻率很高的操作,如果速度慢,會對整個系統(tǒng)造成影響,因此,這里使用MRAM來保存日志緩存區(qū)的數(shù)據(jù),能夠最大程度保證系統(tǒng)的性能。
同時,本實施例還將一級映射表也放置在MRAM中,由于一級映射表是用于查找二、三級映射表的,所以必須先知道一級映射表的地址,且這個地址需要固定。如果將一級映射表放置在flash一片固定地址中,由于flash本身的特性,不斷讀寫這一塊區(qū)域時,會產(chǎn)生過多磨損,最終導致flash發(fā)生故障。而MRAM并不存在這個問題,因此,可以在MRAM中專門開辟一塊區(qū)域來進行一級映射表的放置。同時,由于一級映射表的容量也不會很大(僅保存二級表的索引信息),因此,也適合使用MRAM來保存映射表。而其他表(例如,二級映射表、三級映射表)占用空間相對較大,可以利用flash大容量的特性放置在flash當中,從而達到最優(yōu)配置。
由于在CPU這一次上電之前,CPU可能為正常下電或是異常下電,而不同的下電狀態(tài),會使CPU再一次上電時觸發(fā)不同的處理流程,因此,在本發(fā)明實施例的一個實現(xiàn)方式中,當CPU上電時,可以通過讀取存儲控制器發(fā)送的標志位來確定此前的下電過程屬于正常下電或是異常下電操作,之后根據(jù)下電狀態(tài)來選擇不同的處理流程。因此,在CPU上電之后,存儲控制器向CPU上報用于反映異常下電的標志位。
具體的,標志位可以位于存儲控制器中的寄存器,在CPU正常下電時,存儲控制器中的驅(qū)動可以對標志位進行設(shè)置,比如將標志位flag設(shè)置為1;而在CPU異常下電時,由于存儲控制器斷電,因此無法完成對標志位進行設(shè)置的操作,因此,當CPU再次上電時所讀取到的flag值為在正常工作時的一個值(如0),而不是1時,表明上次CPU下電是異常下電。需要說明的是,對于區(qū)分CPU是否為正常下電的方式不僅限于上述設(shè)置標志位的實現(xiàn)方式,還可以為其他可以用于區(qū)分CPU下電狀態(tài)的其他操作,在此不做贅述。
在本實施中,采用上述讀取標志位的方式,能夠使存儲控制器快速且有效的區(qū)分前次下電是否屬于異常下電,若屬于正常下電,則觸發(fā)CPU的正常上電流程,否則,則觸發(fā)上述異常上電流程。
本實施例中,CPU正常上電流程為:CPU接收到存儲控制器的驅(qū)動讀取到標志位,調(diào)用算法初始化接口,傳輸標志位。當標志位flag=1時,算法正常調(diào)用上電流程。即算法通過驅(qū)動邏輯,讀取高速非易失性存儲器中一級映射表的內(nèi)容,并根據(jù)一級映射表中記載的二級映射表的物理地址,找到flash中二級映射表的位置,訪問二級映射表的內(nèi)容,將讀取到的二級映射表的內(nèi)容保存在主存中,即保存在DRAM中,并給驅(qū)動返回確定信息。
當CPU為正常上電時,CPU可以直接根據(jù)高速非易失性存儲器中存儲的一級映射表中的映射關(guān)系找到存儲在SSD的二級映射表的物理地址,之后訪問二級映射表,并將二級映射表中的映射關(guān)系同步至DRAM中,以便于后續(xù)讀取數(shù)據(jù)時,能夠根據(jù)DRAM中的二級映射表,來確定三級映射表在flash中存儲的物理地址,并通過訪問三級映射表來確定數(shù)據(jù)的存儲地址。
當CPU為異常上電時,即CPU的前次下電屬于異常下電,存儲介質(zhì)還來不及執(zhí)行任何操作就已經(jīng)掉電了。這就意味著,存儲在DRAM中的映射關(guān)系因異常下電而丟失,僅有具有非易失性特性的高速非易失性存儲器和flash中存儲的數(shù)據(jù)仍然保留。因此,存儲控制器可以根據(jù)一級映射表中的映射關(guān)系找到存儲在flash的二級映射表的物理地址,之后訪問二級映射表,并根據(jù)二級映射表中的映射關(guān)系找到存儲在flash的三級映射表的物理地址,并讀取三級映射表中存儲的數(shù)據(jù)的映射關(guān)系。
在另一實施例中,為了方便將日志緩存區(qū)中的內(nèi)容批量下寫到flash的日志區(qū)中,日志緩存區(qū)可以被劃分為n個隊列,其中,n個隊列可以用Q0至Qn來表示,n為大于或等于1的正整數(shù),日志區(qū)包括至少兩個區(qū)塊,且每個區(qū)塊對應(yīng)日志緩存區(qū)中的一列。在本發(fā)明實施例中,當滿足一定條件時,存儲控制器可以將日志緩存區(qū)中存儲的內(nèi)容按隊列寫到日志區(qū)。因此,在日志緩存區(qū)中的存儲空間達到第一閾值后,存儲控制器從日志緩存區(qū)中讀取日志緩存區(qū)中的數(shù)據(jù)的映射關(guān)系,并保存到日志區(qū),具體可以實現(xiàn)為:
在日志緩存區(qū)中目標列的存儲空間達到第一閾值后,存儲控制器將目標列中數(shù)據(jù)的映射關(guān)系存儲至日志區(qū)中目標區(qū)塊對應(yīng)的位置,目標區(qū)塊為目標列對應(yīng)的區(qū)塊。
需要說明的是,區(qū)塊可以被視為與隊列對應(yīng)的一塊區(qū)域。區(qū)塊的構(gòu)成與隊列是相同的,均是由多個表項構(gòu)成的一塊區(qū)域。
例如:在MRAM處于如圖3所示的狀態(tài)時,若CPU正常下電,則存儲控制器可以將日志緩存區(qū)的Q0至Qn隊列中的映射關(guān)系寫到flash的日志區(qū),并在日志緩存區(qū)中的存儲空間達到第一閾值后,將日志區(qū)中的內(nèi)容刷新到三級映射表,以及二級映射表和一級映射表,即最終刷新MRAM中的映射表索引區(qū)。其中,將三級映射表中的內(nèi)容逐級刷新到二級映射表和一級映射表的過程,會在后文提出,在此不做贅述。需要說明的是,圖中狀態(tài)表區(qū)對應(yīng)flash的日志區(qū)中的各個區(qū)塊,因此,當三級映射表更新時,位于MRAM中的狀態(tài)表區(qū)也會更新。
如圖4所示,為將已經(jīng)產(chǎn)生的映射關(guān)系寫到MRAM中對應(yīng)隊列之后,MRAM中的日志緩存區(qū)的存儲狀態(tài)。
如圖5所示,當Q0至Qn隊列中存在至少一個隊列的存儲空間達到所述第一閾值后,則將該至少一個隊列所存儲的數(shù)據(jù)的映射關(guān)系寫到flash的日志區(qū)中,之后根據(jù)已寫到flash的日志區(qū)的映射關(guān)系更新狀態(tài)表區(qū)。
在CPU進行正常下電之后,高速非易失性存儲器的存儲狀態(tài)如圖6所示,即日志緩存區(qū)的Q0至Qn隊列中的數(shù)據(jù)已寫到flash的日志區(qū),并在完成寫操作之后,清除日志緩存區(qū)的所有內(nèi)容。
當CPU在某個時刻異常下電時,也就是CPU發(fā)生異常掉電時,存儲介質(zhì)還來不及執(zhí)行任何操作就已經(jīng)掉電了,則MRAM的存儲狀態(tài)為如圖3至5所示的任意一種狀態(tài)。此時,MRAM中的內(nèi)容沒有執(zhí)行任何操作,標志位也未被更改,即為CPU異常下電。
當CPU再次上電時,存儲控制器先讀取標志位并上報給CPU,這樣可以確定CPU為異常上電。此時,Q0至Qn隊列、日志區(qū)中均存儲著最新或是較新的映射信息,各級映射表中的部分內(nèi)容為非最新的映射信息。存儲控制器可以分區(qū)塊讀取Q0至Qn隊列、日志區(qū)以及三級映射表所存儲的內(nèi)容,并進行比較。其中,映射關(guān)系的新舊程度依次為Q0至Qn隊列、日志區(qū)、三級映射表。通過比較后,存儲控制器可以根據(jù)最新的映射信息刷新三級映射表,從而在滿足一定刷新條件之后逐級更新二級映射表和一級映射表,之后清空Q0至Qn隊列,以及日志區(qū),從而完成映射關(guān)系的恢復(fù)。
在本發(fā)明中,考慮到日志緩存區(qū)中的存儲空間有限,這樣一來不僅可以保證日志緩存區(qū)中存在足夠的空閑存儲資源,同時還可以保證,批量將數(shù)據(jù)的映射關(guān)系寫到flash的日志區(qū)中,即滿足了日志區(qū)對于數(shù)據(jù)的映射關(guān)系的存儲要求。
在本發(fā)明實施例的一個實現(xiàn)方式中,在電子設(shè)備正常工作時,從三級映射表逐級刷新二級映射表與一級映射表的過程,可以實現(xiàn)為如圖7所示的實現(xiàn)方式:
201、若三級映射表在刷新后被修改條目的數(shù)量達到第三閾值,則存儲控制器根據(jù)刷新后的三級映射表刷新二級映射表的索引信息。
202、若二級映射表在刷新后被修改條目的數(shù)量達到第四閾值,則存儲控制器根據(jù)刷新后的二級映射表更新一級映射表的索引信息。
由此可見,從三級映射表逐級刷新二級映射表與一級映射表的過程中,是依據(jù)映射表在刷新后被修改條目的數(shù)量來確定是否需要刷新到下一級映射表。采取上述刷新過程,不僅能夠滿足flash對于寫操作的需求,同時,也能夠減少為了刷新而進行寫操作的次數(shù)。
上述主要從電子設(shè)備中存儲控制器的角度對本發(fā)明實施例提供的方案進行了介紹??梢岳斫獾氖牵鎯刂破鳛榱藢崿F(xiàn)上述功能,其包含了執(zhí)行各個功能相應(yīng)的硬件結(jié)構(gòu)和/或軟件模塊。本領(lǐng)域技術(shù)人員應(yīng)該很容易意識到,結(jié)合本文中所公開的實施例描述的各示例的單元及算法步驟,本發(fā)明能夠以硬件或硬件和計算機軟件的結(jié)合形式來實現(xiàn)。某個功能究竟以硬件還是計算機軟件驅(qū)動硬件的方式來執(zhí)行,取決于技術(shù)方案的特定應(yīng)用和設(shè)計約束條件。專業(yè)技術(shù)人員可以對每個特定的應(yīng)用來使用不同方法來實現(xiàn)所描述的功能,但是這種實現(xiàn)不應(yīng)認為超出本發(fā)明的范圍。
本發(fā)明實施例可以根據(jù)上述方法示例對存儲控制器等進行功能模塊的劃分,例如,可以對應(yīng)各個功能劃分各個功能模塊,也可以將兩個或兩個以上的功能集成在一個處理模塊中。上述集成的模塊既可以采用硬件的形式實現(xiàn),也可以采用軟件功能模塊的形式實現(xiàn)。需要說明的是,本發(fā)明實施例中對模塊的劃分是示意性的,僅僅為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式。
在采用對應(yīng)各個功能劃分各個功能模塊的情況下,或是采用集成的單元的情況下,圖8示出了上述實施例中所涉及的存儲控制器的一種可能的結(jié)構(gòu)示意圖。存儲控制器30包括:確定模塊31、獲取模塊32、發(fā)送模塊33、處理模塊34和存儲模塊35。例如,確定模塊31,用于執(zhí)行圖2的過程101;獲取模塊32,用于執(zhí)行圖2的過程102;發(fā)送模塊33,用于執(zhí)行圖2的過程103;處理模塊34,用于執(zhí)行圖2的過程104和過程105,以及圖4的過程201和過程202;存儲模塊35,用于保存存儲控制器的程序代碼和數(shù)據(jù)。其中,上述方法實施例涉及的各步驟的所有相關(guān)內(nèi)容均可以援引到對應(yīng)功能模塊的功能描述,在此不再贅述。
上述確定模塊31和處理模塊34可以集成在處理器上,該處理器可以為中央處理器(英文:Central Processing Unit,簡稱:CPU),通用處理器,數(shù)字信號處理器(英文:Digital Signal Processor,簡稱:DSP),專用集成電路(英文:Application-Specific Integrated Circuit,簡稱:ASIC),現(xiàn)場可編程門陣列(英文:Field Programmable Gate Array,簡稱:FPGA)或者其他可編程邏輯器件、晶體管邏輯器件、硬件部件或者其任意組合。其可以實現(xiàn)或執(zhí)行結(jié)合本發(fā)明公開內(nèi)容所描述的各種示例性的邏輯方框,模塊和電路。所述處理器也可以是實現(xiàn)計算功能的組合,例如包含一個或多個微處理器組合,DSP和微處理器的組合等等。獲取模塊32與發(fā)送模塊33具體可以為收發(fā)器、收發(fā)電路或通信接口等。存儲模塊35可以是存儲器。
當確定模塊31和處理模塊34為處理器,獲取模塊32和發(fā)送模塊33為通信接口,存儲模塊35為存儲器時,本發(fā)明實施例所涉及的存儲控制器可以為圖9所示的存儲控制器40。
參閱圖9所示,該存儲控制器40包括:處理器41、通信接口42、存儲器43以及總線44。其中,處理器41、通信接口42和存儲器43通過總線44相互連接;總線44可以是外設(shè)部件互連標準(英文:Peripheral Component Interconnect,簡稱:PCI)總線或擴展工業(yè)標準結(jié)構(gòu)(英文:Extended Industry Standard Architecture,簡稱:EISA)總線等。所述總線可以分為地址總線、數(shù)據(jù)總線、控制總線等。為便于表示,圖9中僅用一條粗線表示,但并不表示僅有一根總線或一種類型的總線。
結(jié)合本發(fā)明公開內(nèi)容所描述的方法或者算法的步驟可以硬件的方式來實現(xiàn),也可以是由處理器執(zhí)行軟件指令的方式來實現(xiàn)。軟件指令可以由相應(yīng)的軟件模塊組成,軟件模塊可以被存放于隨機存取存儲器(英文:Random Access Memory,簡稱:RAM)、閃存、只讀存儲器(英文:Read Only Memory,簡稱:ROM)、可擦除可編程只讀存儲器(英文:Erasable Programmable ROM,簡稱:EPROM)、電可擦可編程只讀存儲器(英文:Electrically EPROM,簡稱:EEPROM)、寄存器、硬盤、移動硬盤、只讀光盤(簡稱:CD-ROM)或者本領(lǐng)域熟知的任何其它形式的存儲介質(zhì)中。一種示例性的存儲介質(zhì)耦合至處理器,從而使處理器能夠從該存儲介質(zhì)讀取信息,且可向該存儲介質(zhì)寫入信息。當然,存儲介質(zhì)也可以是處理器的組成部分。處理器和存儲介質(zhì)可以位于ASIC中。
本領(lǐng)域技術(shù)人員應(yīng)該可以意識到,在上述一個或多個示例中,本發(fā)明所描述的功能可以用硬件、軟件、固件或它們的任意組合來實現(xiàn)。當使用軟件實現(xiàn)時,可以將這些功能存儲在計算機可讀介質(zhì)中或者作為計算機可讀介質(zhì)上的一個或多個指令或代碼進行傳輸。計算機可讀介質(zhì)包括計算機存儲介質(zhì)和通信介質(zhì),其中通信介質(zhì)包括便于從一個地方向另一個地方傳送計算機程序的任何介質(zhì)。存儲介質(zhì)可以是通用或?qū)S糜嬎銠C能夠存取的任何可用介質(zhì)。
以上所述的具體實施方式,對本發(fā)明的目的、技術(shù)方案和有益效果進行了進一步詳細說明,所應(yīng)理解的是,以上所述僅為本發(fā)明的具體實施方式而已,并不用于限定本發(fā)明的保護范圍,凡在本發(fā)明的技術(shù)方案的基礎(chǔ)之上,所做的任何修改、等同替換、改進等,均應(yīng)包括在本發(fā)明的保護范圍之內(nèi)。