欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種更新錯誤檢測和糾正ECC碼的方法及裝置與流程

文檔序號:12550483閱讀:1071來源:國知局
一種更新錯誤檢測和糾正ECC碼的方法及裝置與流程

本發(fā)明涉及計算機技術領域,尤其涉及一種更新錯誤檢測和糾正ECC碼的方法及裝置。



背景技術:

在計算機領域中,目前主流的兩種閃存是NAND Flash(內(nèi)部存儲單元采用與非門相連的閃存)和NOR Flash(內(nèi)部存儲單元采用或非門相連的閃存)。其中,NAND Flash容易出現(xiàn)比特反轉(zhuǎn)的問題,若NADN Flash中的重要程序代碼或關鍵數(shù)據(jù)出現(xiàn)比特反轉(zhuǎn),則可能會導致計算機系統(tǒng)不能正常運行,因此,為了提高可靠性,NAND Flash應用時需要進行ECC(Error Checking and Correction,錯誤檢測和糾正)校驗。

ECC校驗是指,在讀寫數(shù)據(jù)的時候以數(shù)據(jù)塊(如將256字節(jié)或512字節(jié)的數(shù)據(jù)作為一個數(shù)據(jù)塊)的方式計算ECC碼,通過比較寫入數(shù)據(jù)的ECC碼與讀取數(shù)據(jù)的ECC碼是否一致,確定數(shù)據(jù)是否發(fā)生比特反轉(zhuǎn)。由于NAND Flash本身是以數(shù)據(jù)塊方式讀寫數(shù)據(jù)的,因此ECC校驗完美適用于NAND Flash。

進一步地,隨著內(nèi)存工藝尺寸的不斷縮小,NOR Flash也越來越容易出現(xiàn)比特反轉(zhuǎn)的問題,目前考慮的是向NOR Flash引入ECC校驗。然而,不同于NAND Flash的讀寫方式,NOR Flash是隨機讀寫方式,即讀寫數(shù)據(jù)的大小是隨機的,若向NOR Flash直接引入ECC校驗,將使其局限于以數(shù)據(jù)塊的方式讀寫數(shù)據(jù),破壞了NOR Flash的隨機讀寫性。



技術實現(xiàn)要素:

本發(fā)明實施例提供了一種更新錯誤檢測和糾正ECC碼的方法及裝置,可以實現(xiàn)在進行ECC校驗時,不破壞存儲介質(zhì)的隨機讀寫性。

本發(fā)明實施例第一方面提供了一種更新ECC碼的方法,所述方法應用于存儲介質(zhì)的數(shù)據(jù)寫入過程,所述存儲介質(zhì)包括多個存儲塊,所述方法包括:

獲取每個所述存儲塊中總數(shù)據(jù)的ECC碼,所述ECC碼包括列校驗碼和行校 驗碼;

當向所述存儲介質(zhì)隨機寫入一字節(jié)的數(shù)據(jù)時,獲取寫入的數(shù)據(jù)、所述數(shù)據(jù)被寫入的存儲空間的位置以及所述存儲空間在寫入所述數(shù)據(jù)之前所存儲的原始數(shù)據(jù),其中,所述存儲空間的位置用以確定所述存儲空間所屬的存儲塊;

通過對所述寫入的數(shù)據(jù)的ECC碼的列校驗碼、所述原始數(shù)據(jù)的ECC碼的列校驗碼和所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼進行邏輯運算,得到寫入一字節(jié)的數(shù)據(jù)后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼,以及根據(jù)所述寫入的數(shù)據(jù)和所述原始數(shù)據(jù),修改所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的行校驗碼;

根據(jù)所述寫入一字節(jié)的數(shù)據(jù)后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼和修改后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的行校驗碼,得到更新后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼。

在第一方面的第一種可能實現(xiàn)方式中,所述通過對所述寫入的數(shù)據(jù)的ECC碼的列校驗碼、所述原始數(shù)據(jù)的ECC碼的列校驗碼和所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼進行邏輯運算,得到寫入一字節(jié)的數(shù)據(jù)后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼,包括:

計算所述寫入的數(shù)據(jù)的ECC碼的列校驗碼,以及所述原始數(shù)據(jù)的ECC碼的列校驗碼;根據(jù)公式計算寫入一字節(jié)的數(shù)據(jù)后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼,其中,所述表示計算后的所述總數(shù)據(jù)的ECC碼的列校驗碼,所述ECC_CP表示計算前的所述總數(shù)據(jù)的ECC碼的列校驗碼,所述Data_ECC_CP表示所述寫入的數(shù)據(jù)的ECC碼的列校驗碼,所述Buf_ECC_CP表示所述原始數(shù)據(jù)的ECC碼的列校驗碼。其中,公式的原理是,由于在異或的運算法則中^既代表增加也代表去除,因此該公式相當于在ECC_CP中增加了Data_ECC_CP,以及去除了Buf_ECC_CP。

結合第一方面的第一種可能實現(xiàn)方式,在第二種可能實現(xiàn)方式中,所述根據(jù)所述寫入的數(shù)據(jù)和所述原始數(shù)據(jù),修改所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的行校驗碼,包括:

確定所述寫入的數(shù)據(jù)的奇偶性,以及所述原始數(shù)據(jù)的奇偶性;判斷所述寫入的數(shù)據(jù)的奇偶性與所述原始數(shù)據(jù)的奇偶性是否相同;若是,則不修改所述總 數(shù)據(jù)的ECC碼的行校驗碼;若否,則確定在所述總數(shù)據(jù)的ECC碼的行校驗碼中,與所述被寫入的存儲空間中數(shù)據(jù)關聯(lián)的比特位,并對其進行反轉(zhuǎn),其中,所述反轉(zhuǎn)是指將數(shù)據(jù)0變?yōu)閿?shù)據(jù)1,或?qū)?shù)據(jù)1變?yōu)閿?shù)據(jù)0。

結合第一方面以及第一方面的第一或第二種可能實現(xiàn)方式,在第三種可能實現(xiàn)方式中,所述存儲塊為256個字節(jié)的存儲空間。一方面,存儲塊的字節(jié)數(shù)越少,存儲介質(zhì)中存儲塊的個數(shù)越多,所要記錄的ECC碼就會越多,另一方面,存儲塊的字節(jié)數(shù)越多,存儲塊中總數(shù)據(jù)就越大,所要記錄的ECC碼越復雜,綜合上述兩方面的因素,設定256個字節(jié)最為適中。

本發(fā)明實施例第二方面提供了一種校驗ECC碼的方法,所述方法應用于存儲介質(zhì)的數(shù)據(jù)寫入過程,所述存儲介質(zhì)包括多個存儲塊,所述方法包括:

當向所述存儲介質(zhì)隨機讀取數(shù)據(jù)時,對讀取的數(shù)據(jù)進行奇偶校驗;判斷所述奇偶校驗是否出錯;若是,則對所述讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊中總數(shù)據(jù)進行ECC碼校驗。

在第二方面的第一種可能實現(xiàn)方式中,所述對讀取的數(shù)據(jù)所在存儲空間的數(shù)據(jù)進行奇偶校驗,包括:

計算所述讀取的數(shù)據(jù)的奇偶校驗碼;查詢所述讀取的數(shù)據(jù)所在存儲空間在寫入數(shù)據(jù)時保存的奇偶校驗碼;判斷計算的奇偶校驗碼是否與所述保存的奇偶校驗碼相同;若否,則所述奇偶校驗出錯;若是,則所述奇偶校驗未出錯。通過該技術方案,可以先判定讀取的數(shù)據(jù)是否出錯。

在第二方面的第二種可能實現(xiàn)方式中,所述對所述讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊中總數(shù)據(jù)進行ECC碼校驗,包括:

計算所述讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼;查詢所述讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊在寫入數(shù)據(jù)時保存的奇偶校驗碼;通過將計算的所述ECC碼與所述保存的ECC碼進行比較,確定所述讀取的數(shù)據(jù)中發(fā)生比特反轉(zhuǎn)的比特位,并對其進行反轉(zhuǎn),其中,所述反轉(zhuǎn)是指將數(shù)據(jù)0變?yōu)閿?shù)據(jù)1,或?qū)?shù)據(jù)1變?yōu)閿?shù)據(jù)0。通過該技術方案,可以確定讀取的數(shù)據(jù)中出錯的比特位,并將其糾正。

結合第一方面以及第一方面的第一或第二種可能實現(xiàn)方式,在第三種可能實現(xiàn)方式中,所述存儲塊為256個字節(jié)的存儲空間。一方面,存儲塊的字節(jié)數(shù) 越少,存儲介質(zhì)中存儲塊的個數(shù)越多,所要記錄的ECC碼就會越多,另一方面,存儲塊的字節(jié)數(shù)越多,存儲塊中總數(shù)據(jù)就越大,所要記錄的ECC碼越復雜,綜合上述兩方面的因素,設定256個字節(jié)最為適中。

本發(fā)明實施例第三方面提供了一種更新ECC碼的裝置,該裝置具有實現(xiàn)上述第一方面提供的方法的行為功能,所述功能可以通過硬件實現(xiàn),也可以通過硬件執(zhí)行相應的軟件實現(xiàn)。所述硬件或軟件包括一個或多個與上述功能相對應的模塊。

本發(fā)明實施例第四方面提供了一種校驗ECC碼的裝置,該裝置具有實現(xiàn)上述第二方面提供的方法的行為功能,所述功能可以通過硬件實現(xiàn),也可以通過硬件執(zhí)行相應的軟件實現(xiàn)。所述硬件或軟件包括一個或多個與上述功能相對應的模塊。

本發(fā)明實施例第五方面提供了一種存儲設備,包括處理器、通信總線、存儲介質(zhì)、存儲器以及輸入輸出接口。其中,所述通信總線用于實現(xiàn)這些組件之間的連接通信;存儲介質(zhì)包括多個虛擬的存儲塊,用于存儲外部設備寫入的數(shù)據(jù),或送出外部數(shù)據(jù)讀取的數(shù)據(jù);所述輸入輸出接口用于向外部設備提供訪問的接口,以讀寫數(shù)據(jù);存儲器中存儲有程序代碼。

一方面,當存儲設備處于數(shù)據(jù)寫入過程時,處理器用于調(diào)用存儲器中存儲的程序代碼,執(zhí)行以下操作:

獲取每個所述存儲塊中總數(shù)據(jù)的ECC碼,所述ECC碼包括列校驗碼和行校驗碼;當向所述存儲介質(zhì)隨機寫入一字節(jié)的數(shù)據(jù)時,獲取寫入的數(shù)據(jù)、所述數(shù)據(jù)被寫入的存儲空間的位置以及所述存儲空間在寫入所述數(shù)據(jù)之前所存儲的原始數(shù)據(jù),其中,所述存儲空間的位置用以確定所述存儲空間所屬的存儲塊;通過對所述寫入的數(shù)據(jù)的ECC碼的列校驗碼、所述原始數(shù)據(jù)的ECC碼的列校驗碼和所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼進行邏輯運算,得到寫入一字節(jié)的數(shù)據(jù)后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼,以及根據(jù)所述寫入的數(shù)據(jù)和所述原始數(shù)據(jù),修改所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的行校驗碼;根據(jù)所述寫入一字節(jié)的數(shù)據(jù)后的所述存儲 空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼和修改后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的行校驗碼,得到更新后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼。

可選的,處理器通過對所述寫入的數(shù)據(jù)的ECC碼的列校驗碼、所述原始數(shù)據(jù)的ECC碼的列校驗碼和所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼進行邏輯運算,得到寫入一字節(jié)的數(shù)據(jù)后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼的具體操作為:計算所述寫入的數(shù)據(jù)的ECC碼的列校驗碼,以及所述原始數(shù)據(jù)的ECC碼的列校驗碼;根據(jù)公式計算寫入一字節(jié)的數(shù)據(jù)后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼,其中,所述表示計算后的所述總數(shù)據(jù)的ECC碼的列校驗碼,所述ECC_CP表示計算前的所述總數(shù)據(jù)的ECC碼的列校驗碼,所述Data_ECC_CP表示所述寫入的數(shù)據(jù)的ECC碼的列校驗碼,所述Buf_ECC_CP表示所述原始數(shù)據(jù)的ECC碼的列校驗碼,所述^表示按位異或的運算。

又可選的,處理器根據(jù)所述寫入的數(shù)據(jù)和所述原始數(shù)據(jù),修改所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的行校驗碼的具體操作為:確定所述寫入的數(shù)據(jù)的奇偶性,以及所述原始數(shù)據(jù)的奇偶性;判斷所述寫入的數(shù)據(jù)的奇偶性與所述原始數(shù)據(jù)的奇偶性是否相同;若是,則不修改所述總數(shù)據(jù)的ECC碼的行校驗碼;若否,則確定在所述總數(shù)據(jù)的ECC碼的行校驗碼中,與所述被寫入的存儲空間中數(shù)據(jù)關聯(lián)的比特位,并對其進行反轉(zhuǎn),其中,所述反轉(zhuǎn)是指將數(shù)據(jù)0變?yōu)閿?shù)據(jù)1,或?qū)?shù)據(jù)1變?yōu)閿?shù)據(jù)0。

另一方面,當存儲設備處于數(shù)據(jù)讀取過程時,處理器用于調(diào)用存儲器中存儲的程序代碼,執(zhí)行以下操作:

當通過輸入輸出接口向所述存儲介質(zhì)隨機讀取數(shù)據(jù)時,對讀取的數(shù)據(jù)進行奇偶校驗;判斷所述奇偶校驗是否出錯;若是,則對所述讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊中總數(shù)據(jù)進行ECC碼校驗。

可選的,處理器對讀取的數(shù)據(jù)所在存儲空間的數(shù)據(jù)進行奇偶校驗的具體操作為:計算所述讀取的數(shù)據(jù)的奇偶校驗碼;查詢所述讀取的數(shù)據(jù)所在存儲空間在寫入數(shù)據(jù)時保存的奇偶校驗碼;判斷計算的奇偶校驗碼是否與所述保存的奇偶校驗碼相同;若否,則所述奇偶校驗出錯;若是,則所述奇偶校驗未出錯。

又可選的,處理器對所述讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊中總數(shù)據(jù)進行ECC碼校驗的具體操作為:計算所述讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼;查詢所述讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊在寫入數(shù)據(jù)時保存的奇偶校驗碼;通過將計算的所述ECC碼與所述保存的ECC碼進行比較,確定所述讀取的數(shù)據(jù)中發(fā)生比特反轉(zhuǎn)的比特位,并對其進行反轉(zhuǎn),其中,所述反轉(zhuǎn)是指將數(shù)據(jù)0變?yōu)閿?shù)據(jù)1,或?qū)?shù)據(jù)1變?yōu)閿?shù)據(jù)0。

由上可見,本發(fā)明實施例在向存儲介質(zhì)隨機寫入數(shù)據(jù)時,只需根據(jù)寫入的數(shù)據(jù)和寫入前的原始數(shù)據(jù)修改存儲塊中總數(shù)據(jù)的ECC碼即可,可以解決現(xiàn)有技術中必須完整寫入一個存儲塊的數(shù)據(jù)后才能計算ECC碼的問題,從而不會破壞存儲介質(zhì)的隨機寫入性;本發(fā)明實施例在向存儲介質(zhì)隨機讀取數(shù)據(jù)時,先對讀取的數(shù)據(jù)進行奇偶校驗,只有在奇偶校驗出錯時才進行ECC校驗,可以解決現(xiàn)有技術中每次讀取數(shù)據(jù)時都要完整讀取一個存儲塊的數(shù)據(jù)后才能進行ECC校驗的問題,從而減少對存儲介質(zhì)的隨機讀取性的破壞。

附圖說明

為了更清楚地說明本發(fā)明實施例,下面將對實施例或現(xiàn)有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領域普通技術人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。

圖1是本發(fā)明實施例提供的一種更新ECC碼的方法的流程示意圖;

圖2是本發(fā)明實施例提供的一種校驗ECC碼的方法的流程示意圖;

圖3是本發(fā)明實施例提供的一種更新ECC碼的裝置的結構示意圖;

圖4是本發(fā)明實施例提供的一種行列碼修改模塊的結構示意圖;

圖5是本發(fā)明實施例提供的一種校驗ECC碼的裝置的結構示意圖;

圖6是本發(fā)明實施例提供的一種奇偶校驗模塊的結構示意圖;

圖7是本發(fā)明實施例提供的一種ECC碼校驗模塊的結構示意圖;

圖8是本發(fā)明實施例提供的一種存儲設備的結構示意圖。

具體實施方式

下面將結合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領域普通技術人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。

為了便于理解本發(fā)明的實施例,這里先介紹下ECC碼的計算方法。ECC碼包括列校驗碼與行校驗碼,其計算對象是數(shù)據(jù)塊,下面以256字節(jié)的數(shù)據(jù)作為一個數(shù)據(jù)塊為例進行說明:

第一,計算ECC碼的列校驗碼。

應理解地,1字節(jié)(Byte)包括8位(Bit),那么將256字節(jié)按位的方式展開可得到表1。

表1

CP0表示第0列、第2列、第4列和第6列的列極性;

CP1表示第1列、第3列、第5列和第7列的列極性;

CP2表示第0列、第1列、第4列和第5列的列極性;

CP3表示第2列、第3列、第6列和第7列的列極性;

CP4表示第0列、第1列、第2列和第3列的列極性;

CP5表示第4列、第5列、第6列和第7列的列極性。

其中,CP0=[Bit0]^[Bit2]^[Bit4]^[Bit6],^表示按位異或的運算,[Bit0]表示第 0列的256個Bit0異或的結果,[Bit2]表示第2列的256個Bit2異或的結果,[Bit4]表示第4列的256個Bit4異或的結果,[Bit6]表示第6列的256個Bit6異或的結果。

以此類推,可以求得CP1~CP5。假設ECC_CP表示ECC碼的列校驗碼,則ECC_CP={CP5,CP4,CP3,CP2,CP1,CP0}。

第二,計算ECC碼的行校驗碼。

同理,將256字節(jié)按位的方式展開可得到表2。

RP0為第0、2、4、6、……252、254行的行極性;

RP1為第1、3、5、7、……253、255行的行極性;

RP2為第0、1、4、5、……252、254行(處理兩行,跳過兩行)的行極性;

RP3為第2、3、6、7、……254、255行(跳過兩行,處理兩行)的行極性;

RP4為……行(處理四行,跳過四行)的行極性;

RP5為……行(跳過四行,處理四行)的行極性;

RP6為……行(處理八行,跳過八行)的行極性;

RP7為……行(跳過八行,處理八行)的行極性;

RP8為……行(處理十六行,跳過十六行)的行極性;

RP9為……行(跳過十六行,處理十六行)的行極性;

RP10為……行(處理三十二行,跳過三十二行)的行極性;

RP11為……行(跳過三十二行,處理三十二行)的行極性;

RP12為……行(處理六十四行,跳過六十四行)的行極性;

RP13為……行(跳過六十四行,處理六十四行)的行極性;

RP14為……行(處理一百二十八行,跳過一百二十八行)的行極性;

RP15為……行(跳過一百二十八行,處理一百二十八行)的行極性;

其中,RP0=[Byte0]^[Byte2]^[Byte4]^[Byte6]^......^[Byte252]^[Byte254],^表示異或的運算,[Byte0]表示第0行的8個Bit異或的結果,[Byte2]表示第2行的8個Bit異或的結果,等等。

以此類推,可以求得RP1~RP15。假設ECC_RP表示ECC碼的行校驗碼,則ECC_RP={RP15,RP14,……,RP3,RP2,RP1,RP0}。

綜上所述,ECC碼包括列校驗碼ECC_CP與行校驗碼ECC_RP,在存儲介質(zhì)的ECC校驗過程中,在寫數(shù)據(jù)時需要以256字節(jié)的數(shù)據(jù)塊為單位寫入數(shù)據(jù),即每寫入256字節(jié)的數(shù)據(jù)便計算一個ECC碼,同理在讀數(shù)據(jù)時需要以256字節(jié)的數(shù)據(jù)塊為單位讀取數(shù)據(jù),即每讀取256字節(jié)的數(shù)據(jù)便計算一個ECC碼。然而,如NOR Flash等隨機讀寫方式的存儲介質(zhì),在讀寫數(shù)據(jù)的時候是以1字節(jié)為單位進行隨機讀寫的,其中一個優(yōu)點是可以對256字節(jié)以下的小數(shù)據(jù)進行隨意讀寫,若直接向隨機讀寫方式的存儲介質(zhì)引入ECC校驗,那么該優(yōu)點將不復存在。

圖1是本發(fā)明實施例中一種更新ECC碼的方法的流程示意圖,該方法應用于存儲介質(zhì)的數(shù)據(jù)寫入過程,所述存儲介質(zhì)包括多個存儲塊,可選的,本發(fā)明實施例中,設定存儲塊為256個字節(jié)的存儲空間。如圖所示本實施例中的更新ECC碼的方法的流程可以包括:

S101,獲取每個存儲塊中總數(shù)據(jù)的ECC碼。

具體的,可以通過上文介紹的ECC碼的計算方法,計算出每個存儲塊中256字節(jié)的數(shù)據(jù)對應的ECC碼。可選的,若本地已記錄有最近一次寫入數(shù)據(jù)后計算得到的ECC碼,或者其它情況下最新計算得到的ECC碼,則直接查找到該ECC碼,而不必再次計算。需要指出的是,獲取每個存儲塊中總數(shù)據(jù)的ECC碼的目的在于,后續(xù)向存儲介質(zhì)隨機寫入數(shù)據(jù)時,可以通過修改該ECC碼來得到新的ECC碼。

S102,當向所述存儲介質(zhì)隨機寫入一字節(jié)的數(shù)據(jù)時,獲取寫入的數(shù)據(jù)、所述數(shù)據(jù)被寫入的存儲空間的位置以及所述存儲空間在寫入所述數(shù)據(jù)之前所存儲的原始數(shù)據(jù)。

需要指出的是,這里只介紹了寫入一字節(jié)的數(shù)據(jù)的情況,但應理解在數(shù)據(jù)寫入過程,一般是寫入多個字節(jié)的數(shù)據(jù)的情況,針對這種情況,只需以一字節(jié)的方式分別執(zhí)行多次即可。

具體的,當向存儲介質(zhì)隨機寫入一字節(jié)的數(shù)據(jù)時,獲取寫入的數(shù)據(jù)、數(shù)據(jù)被寫入的存儲空間的位置以及該存儲空間在寫入數(shù)據(jù)之前所存儲的原始數(shù)據(jù)。其中,所述存儲空間的位置用以確定存儲空間所屬的存儲塊,可選的,所述存儲空間的位置可以是存儲地址,也可以是字節(jié)的序號。以存儲空間的位置是字節(jié)的序號為例:假設向存儲介質(zhì)隨機寫入的數(shù)據(jù)為0xF0,數(shù)據(jù)被寫入的存儲空間對應的字節(jié)的序號為Byte9,且該存儲空間在寫入數(shù)據(jù)前所存儲的原始數(shù)據(jù)為0x31,則獲取的信息為0xF0、Byte9和0x31,進一步的,假設Byte 0~Byte 255屬于第一存儲塊,由于Byte9落在Byte 0~Byte 255這個區(qū)間,則可以確定數(shù)據(jù)被寫入的存儲空間屬于第一存儲塊。

S103,通過對所述寫入的數(shù)據(jù)的ECC碼的列校驗碼、所述原始數(shù)據(jù)的ECC碼的列校驗碼和所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼進行邏輯運算,得到寫入一字節(jié)的數(shù)據(jù)后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼,以及根據(jù)所述寫入的數(shù)據(jù)和所述原始數(shù)據(jù),修改所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的行校驗碼。

具體的,由上文可知ECC碼包括列校驗碼和行校驗碼,因此需根據(jù)寫入的數(shù)據(jù)和原始數(shù)據(jù),分別修改被寫入的字節(jié)所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼和ECC碼的行校驗碼。

首先,修改ECC碼的列校驗碼的方法可以是:通過對寫入的數(shù)據(jù)的ECC碼的列校驗碼、原始數(shù)據(jù)的ECC碼的列校驗碼和存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼進行邏輯運算,得到寫入一字節(jié)的數(shù)據(jù)后的存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼。具體實現(xiàn)流程為:

步驟1,計算寫入的數(shù)據(jù)的ECC碼的列校驗碼,以及原始數(shù)據(jù)的ECC碼的列校驗碼。

例如:假設寫入的數(shù)據(jù)為0xF0,原始數(shù)據(jù)為0x31,Data_ECC_CP表示寫入的數(shù)據(jù)的ECC碼的列校驗碼,Buf_ECC_CP表示原始數(shù)據(jù)的ECC碼的列校驗碼,則通過上述ECC碼的計算方法,可計算得Data_ECC_CP={0,0,0,0,0},Buf_ECC_CP={0,1,0,1,1,0}。

步驟2,根據(jù)公式計算寫入一字節(jié)的數(shù)據(jù)后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼。

其中,表示修改后的總數(shù)據(jù)的ECC碼的列校驗碼,ECC_CP表示修改前的總數(shù)據(jù)的ECC碼的列校驗碼,^表示按位異或的運算。

例如:假設Data_ECC_CP={0,0,0,0,0},Buf_ECC_CP={0,1,0,1,1,0},則

這里簡單介紹下上述公式的原理:通過分析ECC碼的計算方法可知,ECC_CP可以表示成ECC_CP=Byte0_ECC_CP^Byte1_ECC_CP^......^Byte255_ECC_CP的形式,將其簡化為ECC_CP=X^Byte9_ECC_CP=X^Buf_ECC_CP(假設Byte9為被寫入的存儲空間),又由于ECC_CP^Buf_ECC_CP=X^Buf_ECC_CP^Buf_ECC_CP=X,則可見,中已經(jīng)更新了Byte9在寫入前和寫入后的數(shù)據(jù)。

其次,修改ECC碼的行校驗碼的方法可以是:根據(jù)寫入的數(shù)據(jù)和原始數(shù)據(jù),修改存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的行校驗碼。具體實現(xiàn)流程為:

步驟1,確定寫入的數(shù)據(jù)的奇偶性,以及原始數(shù)據(jù)的奇偶性。

具體實現(xiàn)過程中,分別對兩個數(shù)據(jù)的各Bit位進行異或,若異或結果為0,則奇偶性為偶,若異或結果為1,則為奇偶性為奇。例如:假設寫入的數(shù)據(jù)為0xF0(={1,1,1,1,0,0,0,0}),原始數(shù)據(jù)為0x31(={0,0,1,1,0,0,0,1}),則對于0xF0,異或結果為1^1^1^1^0^0^0^0=0,其奇偶性為偶,對于0x31,異或結果為0^0^1^1^0^0^0^1=1,其奇偶性為奇。

步驟2,判斷寫入的數(shù)據(jù)的奇偶性與原始數(shù)據(jù)的奇偶性是否相同。

步驟3,若相同,則不修改總數(shù)據(jù)的ECC碼的行校驗碼;若不同,則確定在總數(shù)據(jù)的ECC碼的行校驗碼中,與被寫入的字節(jié)中數(shù)據(jù)關聯(lián)的比特位,并對其進行反轉(zhuǎn)。

一方面,若寫入的數(shù)據(jù)的奇偶性與原始數(shù)據(jù)奇偶性相同,通過分析ECC碼的計算方法可知,寫入的數(shù)據(jù)和原始數(shù)據(jù)的變化不會對ECC碼的行校驗碼產(chǎn)生影響,故不用修改ECC碼的行校驗碼。

另一方面,若寫入的數(shù)據(jù)的奇偶性與原始數(shù)據(jù)奇偶性不相同,則寫入的數(shù)據(jù)和原始數(shù)據(jù)的變化會對ECC碼的行校驗碼產(chǎn)生影響,故要修改ECC碼的行校驗碼。具體實現(xiàn)過程中,先確定在256個字節(jié)的數(shù)據(jù)對應的ECC碼的行校驗碼 中,與被寫入的存儲空間中數(shù)據(jù)關聯(lián)的比特位,其中,關聯(lián)關系可以通過查閱表2得知,例如ECC碼的行校驗碼中與Byte0關聯(lián)的比特位為RP0、RP2、RP4、RP6、RP8、RP10、RP12、RP14和RP16;接著對確定的比特位進行反轉(zhuǎn),其中,反轉(zhuǎn)是指將數(shù)據(jù)0變?yōu)閿?shù)據(jù)1,或?qū)?shù)據(jù)1變?yōu)閿?shù)據(jù)0,例如:假設ECC_RP表示修改前的ECC碼的行校驗碼,ECC_RP={RP15,RP14,……,RP3,RP2,RP1,RP0}={1,0,0,0,1,1,0,1,1,1,0,0,1,1,0,1},表示修改后的ECC碼的行校驗碼,關聯(lián)的比特位為RP0、RP2、RP4、RP6、RP8、RP10、RP12和RP14,則

S104,根據(jù)所述寫入一字節(jié)的數(shù)據(jù)后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼和修改后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的行校驗碼,得到更新后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼。

具體的,由于ECC碼包括列校驗碼和行校驗碼,因而根據(jù)寫入一字節(jié)的數(shù)據(jù)后的存儲塊中總數(shù)據(jù)的ECC碼和修改后的存儲塊中總數(shù)據(jù)的ECC碼的行校驗碼,可以得到存儲塊中總數(shù)據(jù)的ECC碼,該ECC碼即為更新后的ECC碼。

由上可見,本發(fā)明實施例在向存儲介質(zhì)隨機寫入數(shù)據(jù)時,只需對原有的ECC碼進行修改即可,解決了現(xiàn)有技術中必須寫入256字節(jié)的數(shù)據(jù)到存儲塊后才能計算ECC碼的問題,從而不會破壞存儲介質(zhì)的隨機寫入性。另外,本發(fā)明實施例無需重新計算ECC碼,提高了運算效率。

圖2是本發(fā)明實施例中一種校驗ECC碼的方法的流程示意圖,該方法應用于存儲介質(zhì)的數(shù)據(jù)讀取過程,所述存儲介質(zhì)包括多個存儲塊,所述存儲塊為多個字節(jié)組成的存儲空間,可選的,本發(fā)明實施例中,設定存儲塊為256個字節(jié)組成的存儲空間。如圖所示本實施例中的校驗ECC碼的方法的流程可以包括:

S201,當向所述存儲介質(zhì)隨機讀取數(shù)據(jù)時,對讀取的數(shù)據(jù)進行奇偶校驗。

具體的,對讀取的數(shù)據(jù)進行奇偶校驗的方法流程為:

步驟1,計算讀取的數(shù)據(jù)的奇偶校驗碼。

具體實現(xiàn)過程中,計算奇偶校驗碼的方法是對讀取的數(shù)據(jù)的各Bit位求取異或結果。例如:假設讀取的數(shù)據(jù)為0xF0(={1,1,1,1,0,0,0,0}),則0xF0的奇偶校驗碼為1^1^1^1^0^0^0^0=0。

步驟2,查詢讀取的數(shù)據(jù)所在存儲空間在寫入數(shù)據(jù)時保存的奇偶校驗碼。

需要指出的是,存儲介質(zhì)中的每個字節(jié)在寫入數(shù)據(jù)時,都會計算該字節(jié)對應的存儲空間中數(shù)據(jù)對應的奇偶校驗碼,并將其保存。具體實現(xiàn)過程中,在讀取數(shù)據(jù)之后,查詢讀取的數(shù)據(jù)所在存儲空間所保存的奇偶校驗碼。

步驟3,判斷計算的奇偶校驗碼是否與保存的奇偶校驗碼相同。

步驟4,若步驟3判斷結果為不相同,則奇偶校驗出錯;若步驟3判斷結果為相同,則奇偶校驗未出錯。

一方面,若計算的奇偶校驗碼與保存的奇偶校驗碼不相同,則說明存儲的數(shù)據(jù)發(fā)生了比特反轉(zhuǎn),導致寫入的是一個數(shù)據(jù),讀出的是另一個數(shù)據(jù),此時執(zhí)行步驟S202,以進行ECC校驗。

另一方面,若計算的奇偶校驗碼與保存的奇偶校驗碼相同,則說明存儲的數(shù)據(jù)未出現(xiàn)異常,此時校驗結束,無需再執(zhí)行步驟S202。ECC校驗需要讀取整個存儲塊中256個字節(jié)的數(shù)據(jù)以計算ECC碼,使得校驗效率低下,由此可見,本發(fā)明實施例可以避免每次讀取數(shù)據(jù)都要進行ECC校驗,保證了校驗可靠性的同時提高了校驗效率。

作為一種另可選的實施方式,預先將存儲塊劃分為多個子存儲塊,如將256字節(jié)的存儲塊劃分為8個32字節(jié)的存儲塊,當向存儲介質(zhì)隨機讀取數(shù)據(jù)時,對讀取的數(shù)據(jù)所在子存儲塊中的數(shù)據(jù)進行奇偶校驗,奇偶校驗的方式與上述方式相似,唯一區(qū)別是不用保存每個字節(jié)中數(shù)據(jù)的奇偶校驗碼,轉(zhuǎn)而保存32個字節(jié)中數(shù)據(jù)的奇偶校驗碼,減少了需要保存的奇偶校驗碼的數(shù)量。

S202,判斷所述奇偶校驗是否出錯。

具體的,若奇偶校驗出錯,則執(zhí)行步驟S203。

S203,對所述讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊中總數(shù)據(jù)進行ECC碼校驗。

具體的,對讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊中總數(shù)據(jù)進行ECC碼校驗的方法流程為:

步驟1,計算讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼。

具體實現(xiàn)過程中,確定讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊,再讀取該存儲塊中256字節(jié)的數(shù)據(jù),計算256字節(jié)的數(shù)據(jù)對應的ECC碼。

步驟2,查詢讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊在寫入數(shù)據(jù)時保存的奇偶校驗碼。

需要指出的是,存儲介質(zhì)中的每個存儲塊在寫入數(shù)據(jù)時,都會計算該存儲塊中256字節(jié)的數(shù)據(jù)對應的奇偶校驗碼,并將其保存。具體實現(xiàn)過程中,在讀取數(shù)據(jù)之后,查詢讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊對應保存的奇偶校驗碼。

步驟3,通過將計算的ECC碼與保存的ECC碼進行比較,確定讀取的數(shù)據(jù)中發(fā)生比特反轉(zhuǎn)的比特位,并對其進行反轉(zhuǎn),其中,所述反轉(zhuǎn)是指將數(shù)據(jù)0變?yōu)閿?shù)據(jù)1,或?qū)?shù)據(jù)1變?yōu)閿?shù)據(jù)0。

應理解的,ECC校驗可以確定出錯的比特位,具體確定方法這里不做贅述。例如:假設讀取的數(shù)據(jù)為0xF0(={1,1,1,1,0,0,0,0}),確定發(fā)生比特反轉(zhuǎn)的比特位為Bit0,則糾正后的數(shù)據(jù)為0xF1(={1,1,1,1,0,0,0,1})。

由上可見,本發(fā)明實施例在向存儲介質(zhì)隨機讀取數(shù)據(jù)時,先對讀取的數(shù)據(jù)進行奇偶校驗,只有在奇偶校驗出錯時才進一步進行ECC校驗,避免了每次讀取數(shù)據(jù)都要進行ECC校驗,保證了校驗可靠性的同時提高了校驗效率。

圖3是本發(fā)明實施例中一種更新ECC碼的裝置的結構示意圖。本發(fā)明裝置用于實現(xiàn)圖1提供的更新ECC碼的方法。如圖所示本發(fā)明實施例中的更新ECC碼的裝置至少可以包括ECC碼獲取模塊310、數(shù)據(jù)獲取模塊320、行列碼修改模塊330以及ECC碼更新模塊340,其中:

ECC碼獲取模塊310,用于獲取每個所述存儲塊中總數(shù)據(jù)的ECC碼,所述ECC碼包括列校驗碼和行校驗碼。

具體的,可以通過上文介紹的ECC碼的計算方法,計算出每個存儲塊中256字節(jié)的數(shù)據(jù)對應的ECC碼??蛇x的,若本地已記錄有最近一次寫入數(shù)據(jù)后計算得到的ECC碼,或者其它情況下最新計算得到的ECC碼,則直接查找到該ECC碼,而不必再次計算。需要指出的是,獲取每個存儲塊中總數(shù)據(jù)的ECC碼的目的在于,后續(xù)向存儲介質(zhì)隨機寫入數(shù)據(jù)時,可以通過修改該ECC碼來得到新的ECC碼。

數(shù)據(jù)獲取模塊320,用于當向所述存儲介質(zhì)隨機寫入一字節(jié)的數(shù)據(jù)時,獲取寫入的數(shù)據(jù)、所述數(shù)據(jù)被寫入的存儲空間的位置以及所述存儲空間在寫入所述數(shù)據(jù)之前所存儲的原始數(shù)據(jù)。

其中,所述存儲空間的位置用以確定所述存儲空間所屬的存儲塊,可選的, 所述存儲空間的位置可以是存儲地址,也可以是字節(jié)的序號。以存儲空間的位置是字節(jié)的序號為例:假設向存儲介質(zhì)隨機寫入的數(shù)據(jù)為0xF0,數(shù)據(jù)被寫入的存儲空間對應的字節(jié)的序號為Byte9,且該存儲空間在寫入數(shù)據(jù)前所存儲的原始數(shù)據(jù)為0x31,則獲取的信息為0xF0、Byte9和0x31,進一步的,假設Byte 0~Byte255屬于第一存儲塊,由于Byte9落在Byte 0~Byte 255這個區(qū)間,則可以確定數(shù)據(jù)被寫入的存儲空間屬于第一存儲塊。

行列碼修改模塊330,用于通過對所述寫入的數(shù)據(jù)的ECC碼的列校驗碼、所述原始數(shù)據(jù)的ECC碼的列校驗碼和所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼進行邏輯運算,得到寫入一字節(jié)的數(shù)據(jù)后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼,以及根據(jù)所述寫入的數(shù)據(jù)和所述原始數(shù)據(jù),修改所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的行校驗碼。具體實現(xiàn)中,行列碼修改模塊330可以如圖4所示進一步包括列碼計算單元331、列碼修改單元332、奇偶性確定單元333以及行碼修改單元334,其中:

列碼計算單元331,用于計算所述寫入的數(shù)據(jù)的ECC碼的列校驗碼,以及所述原始數(shù)據(jù)的ECC碼的列校驗碼。

具體實現(xiàn)過程中,計算寫入的數(shù)據(jù)的ECC碼的列校驗碼,以及原始數(shù)據(jù)的ECC碼的列校驗碼;根據(jù)公式計算寫入一字節(jié)的數(shù)據(jù)后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼。

其中,表示修改后的總數(shù)據(jù)的ECC碼的列校驗碼,ECC_CP表示修改前的總數(shù)據(jù)的ECC碼的列校驗碼,^表示按位異或的運算。

列碼修改單元332,用于根據(jù)計算寫入一字節(jié)的數(shù)據(jù)后的所述字節(jié)對應的存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼,其中,所述表示計算后的所述總數(shù)據(jù)的ECC碼的列校驗碼,所述ECC_CP表示計算前的所述總數(shù)據(jù)的ECC碼的列校驗碼,所述Data_ECC_CP表示所述寫入的數(shù)據(jù)的ECC碼的列校驗碼,所述Buf_ECC_CP表示所述原始數(shù)據(jù)的ECC碼的列校驗碼,所述^表示按位異或的運算。

奇偶性確定單元333,用于確定所述寫入的數(shù)據(jù)的奇偶性,以及所述原始數(shù)據(jù)的奇偶性。

具體實現(xiàn)過程中,分別對兩個數(shù)據(jù)的各Bit位進行異或,若異或結果為0, 則奇偶性為偶,若異或結果為1,則為奇偶性為奇。

行碼修改單元334,用于判斷所述寫入的數(shù)據(jù)的奇偶性與所述原始數(shù)據(jù)的奇偶性是否相同,若是,則不修改所述總數(shù)據(jù)的ECC碼的行校驗碼;若否,則確定在所述總數(shù)據(jù)的ECC碼的行校驗碼中,與所述被寫入的字節(jié)中數(shù)據(jù)關聯(lián)的比特位,并對其進行反轉(zhuǎn),其中,所述反轉(zhuǎn)是指將數(shù)據(jù)0變?yōu)閿?shù)據(jù)1,或?qū)?shù)據(jù)1變?yōu)閿?shù)據(jù)0。

一方面,若寫入的數(shù)據(jù)的奇偶性與原始數(shù)據(jù)奇偶性相同,通過分析ECC碼的計算方法可知,寫入的數(shù)據(jù)和原始數(shù)據(jù)的變化不會對ECC碼的行校驗碼產(chǎn)生影響,故不用修改ECC碼的行校驗碼。

另一方面,若寫入的數(shù)據(jù)的奇偶性與原始數(shù)據(jù)奇偶性不相同,則寫入的數(shù)據(jù)和原始數(shù)據(jù)的變化會對ECC碼的行校驗碼產(chǎn)生影響,故要修改ECC碼的行校驗碼。具體實現(xiàn)過程中,先確定在256個字節(jié)的數(shù)據(jù)對應的ECC碼的行校驗碼中,與被寫入的存儲空間中數(shù)據(jù)關聯(lián)的比特位,其中,關聯(lián)關系可以通過查閱表2得知,例如ECC碼的行校驗碼中與Byte0關聯(lián)的比特位為RP0、RP2、RP4、RP6、RP8、RP10、RP12、RP14和RP16;接著對確定的比特位進行反轉(zhuǎn),其中,反轉(zhuǎn)是指將數(shù)據(jù)0變?yōu)閿?shù)據(jù)1,或?qū)?shù)據(jù)1變?yōu)閿?shù)據(jù)0。

ECC碼更新模塊340,用于根據(jù)所述寫入一字節(jié)的數(shù)據(jù)后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼和修改后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的行校驗碼,得到更新后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼。

具體的,由于ECC碼包括列校驗碼和行校驗碼,因而根據(jù)寫入一字節(jié)的數(shù)據(jù)后的存儲塊中總數(shù)據(jù)的ECC碼和修改后的存儲塊中總數(shù)據(jù)的ECC碼的行校驗碼,可以得到存儲塊中總數(shù)據(jù)的ECC碼,該ECC碼即為更新后的ECC碼。

圖5是本發(fā)明實施例中一種校驗ECC碼的裝置的結構示意圖。本發(fā)明裝置用于實現(xiàn)圖2提供的校驗ECC碼的方法。如圖所示本發(fā)明實施例中的校驗ECC碼的裝置至少可以包括奇偶校驗模塊510、校驗判斷模塊520以及ECC碼校驗模塊530,其中:

奇偶校驗模塊510,用于當向所述存儲介質(zhì)隨機讀取數(shù)據(jù)時,對讀取的數(shù)據(jù)進行奇偶校驗。具體實現(xiàn)中,奇偶校驗模塊510可以如圖6所示進一步包括第 一計算單元511、第一查詢單元512和碼值判斷單元513,其中:

第一計算單元511,用于計算所述讀取的數(shù)據(jù)的奇偶校驗碼。

具體實現(xiàn)過程中,計算奇偶校驗碼的方法是對讀取的數(shù)據(jù)的各Bit位求取異或結果。

第一查詢單元512,用于查詢所述讀取的數(shù)據(jù)所在存儲空間在寫入數(shù)據(jù)時保存的奇偶校驗碼。

需要指出的是,存儲介質(zhì)中的每個存儲空間在寫入數(shù)據(jù)時,都會計算該存儲空間中數(shù)據(jù)對應的奇偶校驗碼,并將其保存。具體實現(xiàn)過程中,在讀取數(shù)據(jù)之后,查詢讀取的數(shù)據(jù)所在存儲空間對應保存的奇偶校驗碼。

碼值判斷單元513,用于判斷計算的奇偶校驗碼是否與所述保存的奇偶校驗碼相同;若否,則所述奇偶校驗出錯;若是,則所述奇偶校驗未出錯。

一方面,若計算的奇偶校驗碼與保存的奇偶校驗碼不相同,則說明存儲的數(shù)據(jù)發(fā)生了比特反轉(zhuǎn),導致寫入的是一個數(shù)據(jù),讀出的是另一個數(shù)據(jù),此時觸發(fā)ECC碼校驗模塊530,以進行ECC校驗。

另一方面,若計算的奇偶校驗碼與保存的奇偶校驗碼相同,則說明存儲的數(shù)據(jù)未出現(xiàn)異常,此時校驗結束,無需再觸發(fā)ECC碼校驗模塊530。ECC校驗需要讀取整個存儲塊中256個字節(jié)的數(shù)據(jù)以計算ECC碼,使得校驗效率低下,由此可見,本發(fā)明實施例可以避免每次讀取數(shù)據(jù)都要進行ECC校驗,保證了校驗可靠性的同時提高了校驗效率。

校驗判斷模塊520,用于判斷所述奇偶校驗是否出錯。

ECC碼校驗模塊530,用于當所述校驗判斷模塊判定所述奇偶校驗出錯時,對所述讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊中總數(shù)據(jù)進行ECC碼校驗。具體實現(xiàn)中,ECC碼校驗模塊530可以如圖7所示進一步包括第二計算單元531、第二查詢單元532和比特反轉(zhuǎn)單元533,其中:

第二計算單元531,用于計算所述讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼。

具體實現(xiàn)過程中,確定讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊,再讀取該存儲塊中256字節(jié)的數(shù)據(jù),計算256字節(jié)的數(shù)據(jù)對應的ECC碼。

第二查詢單元532,用于查詢所述讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊在寫入數(shù)據(jù)時保存的奇偶校驗碼。

需要指出的是,存儲介質(zhì)中的每個存儲塊在寫入數(shù)據(jù)時,都會計算該存儲塊中256字節(jié)的數(shù)據(jù)對應的奇偶校驗碼,并將其保存。具體實現(xiàn)過程中,在讀取數(shù)據(jù)之后,查詢讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊對應保存的奇偶校驗碼。

比特反轉(zhuǎn)單元533,用于通過將計算的所述ECC碼與所述保存的ECC碼進行比較,確定所述讀取的數(shù)據(jù)中發(fā)生比特反轉(zhuǎn)的比特位,并對其進行反轉(zhuǎn),其中,所述反轉(zhuǎn)是指將數(shù)據(jù)0變?yōu)閿?shù)據(jù)1,或?qū)?shù)據(jù)1變?yōu)閿?shù)據(jù)0。

圖8是本發(fā)明實施例中的一種存儲設備的結構示意圖,如圖8所示,存儲設備可以包括:至少一個處理器801,例如CPU,至少一個通信總線802,至少一個存儲介質(zhì)803,存儲器804,輸入輸出接口805。其中,通信總線802用于實現(xiàn)這些組件之間的連接通信。存儲介質(zhì)803包括多個虛擬的存儲塊,存儲塊為多個字節(jié)的存儲空間。存儲器804可以是高速RAM存儲器,也可以是非易失的存儲器(non-volatile memory),例如至少一個磁盤存儲器。輸入輸出接口805用于向外部設備提供訪問的接口,以讀寫數(shù)據(jù)。可選的,存儲器804還可以是至少一個位于遠離前述處理器801的存儲裝置。存儲器804中存儲一組程序代碼。

其中,在存儲介質(zhì)803的數(shù)據(jù)寫入過程,處理器801用于調(diào)用存儲器804中存儲的程序代碼,執(zhí)行以下操作:

獲取每個所述存儲塊中總數(shù)據(jù)的ECC碼,所述ECC碼包括列校驗碼和行校驗碼;

當向所述存儲介質(zhì)隨機寫入一字節(jié)的數(shù)據(jù)時,獲取寫入的數(shù)據(jù)、所述數(shù)據(jù)被寫入的存儲空間的位置以及所述存儲空間在寫入所述數(shù)據(jù)之前所存儲的原始數(shù)據(jù),其中,所述存儲空間的位置用以確定存儲空間所屬的存儲塊;

通過對所述寫入的數(shù)據(jù)的ECC碼的列校驗碼、所述原始數(shù)據(jù)的ECC碼的列校驗碼和所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼進行邏輯運算,得到寫入一字節(jié)的數(shù)據(jù)后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼,以及根據(jù)所述寫入的數(shù)據(jù)和所述原始數(shù)據(jù),修改所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的行校驗碼;

根據(jù)所述寫入一字節(jié)的數(shù)據(jù)后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的 ECC碼的列校驗碼和修改后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的行校驗碼,得到更新后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼。

可選的,處理器801通過對所述寫入的數(shù)據(jù)的ECC碼的列校驗碼、所述原始數(shù)據(jù)的ECC碼的列校驗碼和所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼進行邏輯運算,得到寫入一字節(jié)的數(shù)據(jù)后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼的具體操作為:

計算所述寫入的數(shù)據(jù)的ECC碼的列校驗碼,以及所述原始數(shù)據(jù)的ECC碼的列校驗碼;

根據(jù)公式計算寫入一字節(jié)的數(shù)據(jù)后的所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的列校驗碼,其中,所述表示計算后的所述總數(shù)據(jù)的ECC碼的列校驗碼,所述ECC_CP表示計算前的所述總數(shù)據(jù)的ECC碼的列校驗碼,所述Data_ECC_CP表示所述寫入的數(shù)據(jù)的ECC碼的列校驗碼,所述Buf_ECC_CP表示所述原始數(shù)據(jù)的ECC碼的列校驗碼,所述^表示按位異或的運算。

進一步的,處理器801根據(jù)所述寫入的數(shù)據(jù)和所述原始數(shù)據(jù),修改所述存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼的行校驗碼的具體操作為:

確定所述寫入的數(shù)據(jù)的奇偶性,以及所述原始數(shù)據(jù)的奇偶性;

判斷所述寫入的數(shù)據(jù)的奇偶性與所述原始數(shù)據(jù)的奇偶性是否相同;

若是,則不修改所述總數(shù)據(jù)的ECC碼的行校驗碼;

若否,則確定在所述總數(shù)據(jù)的ECC碼的行校驗碼中,與所述被寫入的存儲空間中數(shù)據(jù)關聯(lián)的比特位,并對其進行反轉(zhuǎn),其中,所述反轉(zhuǎn)是指將數(shù)據(jù)0變?yōu)閿?shù)據(jù)1,或?qū)?shù)據(jù)1變?yōu)閿?shù)據(jù)0。

可選的,所述存儲塊為256個字節(jié)的存儲空間。

另外,在存儲介質(zhì)803的數(shù)據(jù)讀取過程,處理器801用于調(diào)用存儲器804中存儲的程序代碼,執(zhí)行以下操作:

當通過輸入輸出接口向所述存儲介質(zhì)隨機讀取數(shù)據(jù)時,對讀取的數(shù)據(jù)進行奇偶校驗;

判斷所述奇偶校驗是否出錯;

若是,則對所述讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊中總數(shù)據(jù)進行ECC碼校驗。

可選的,處理器801對讀取的數(shù)據(jù)所在存儲空間的數(shù)據(jù)進行奇偶校驗的具體操作為:

計算所述讀取的數(shù)據(jù)的奇偶校驗碼;

查詢所述讀取的數(shù)據(jù)所在存儲空間在寫入數(shù)據(jù)時保存的奇偶校驗碼;

判斷計算的奇偶校驗碼是否與所述保存的奇偶校驗碼相同;

若否,則所述奇偶校驗出錯;若是,則所述奇偶校驗未出錯。

又可選的,處理器801對所述讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊中總數(shù)據(jù)進行ECC碼校驗的具體操作為:

計算所述讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊中總數(shù)據(jù)的ECC碼;

查詢所述讀取的數(shù)據(jù)所在存儲空間所屬的存儲塊在寫入數(shù)據(jù)時保存的奇偶校驗碼;

通過將計算的所述ECC碼與所述保存的ECC碼進行比較,確定所述讀取的數(shù)據(jù)中發(fā)生比特反轉(zhuǎn)的比特位,并對其進行反轉(zhuǎn),其中,所述反轉(zhuǎn)是指將數(shù)據(jù)0變?yōu)閿?shù)據(jù)1,或?qū)?shù)據(jù)1變?yōu)閿?shù)據(jù)0。

又可選的,所述存儲塊為256個字節(jié)的存儲空間。

由上可見,本發(fā)明實施例在向存儲介質(zhì)隨機寫入數(shù)據(jù)時,只需根據(jù)寫入的數(shù)據(jù)和寫入前的原始數(shù)據(jù)修改存儲塊中總數(shù)據(jù)的ECC碼即可,可以解決現(xiàn)有技術中必須完整寫入一個存儲塊的數(shù)據(jù)后才能計算ECC碼的問題,從而不會破壞存儲介質(zhì)的隨機寫入性;本發(fā)明實施例在向存儲介質(zhì)隨機讀取數(shù)據(jù)時,先對讀取的數(shù)據(jù)進行奇偶校驗,只有在奇偶校驗出錯時才進行ECC校驗,可以解決現(xiàn)有技術中每次讀取數(shù)據(jù)時都要完整讀取一個存儲塊的數(shù)據(jù)后才能進行ECC校驗的問題,從而減少對存儲介質(zhì)的隨機讀取性的破壞。

本領域普通技術人員可以理解實現(xiàn)上述實施例方法中的全部或部分流程,是可以通過計算機程序來指令相關的硬件來完成,所述的程序可存儲于一計算機可讀取存儲介質(zhì)中,該程序在執(zhí)行時,可包括如上述各方法的實施例的流程。其中,所述的存儲介質(zhì)可為磁碟、光盤、只讀存儲記憶體(Read-Only Memory,ROM)或隨機存儲記憶體(Random Access Memory,RAM)等。

以上所揭露的僅為本發(fā)明較佳實施例而已,當然不能以此來限定本發(fā)明之權利范圍,因此依本發(fā)明權利要求所作的等同變化,仍屬本發(fā)明所涵蓋的范圍。

當前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
绍兴市| 报价| 衡山县| 剑阁县| 东城区| 松原市| 嘉善县| 盐边县| 温泉县| 三门县| 安仁县| 巴彦淖尔市| 绥化市| 湖南省| 泌阳县| 余干县| 建始县| 三亚市| 石门县| 迁安市| 信丰县| 平乡县| 临武县| 玛沁县| 曲阜市| 登封市| 延安市| 安仁县| 炎陵县| 鹤峰县| 苍山县| 麻江县| 石首市| 莱西市| 长乐市| 温宿县| 青海省| 通辽市| 宜都市| 阿勒泰市| 福贡县|