輕量級 NAND 壞塊管理方法分析及改進

2021-06-22 22:05:57 字數 2925 閱讀 3022

nand flash 是一種高密度低成本的儲存體,它在各種各樣的嵌入式系統中獲得了廣泛的應用, usb 儲存裝置、sd 卡、手機、相機和固態硬碟等各種裝置中使用的都是 nand 晶元。其內部結構是按照塊/頁進行組織的,乙個 nand 晶元包含若干個塊,而塊內部又是由若干個頁構成的。nand 晶元出廠時就可能包含若干個壞塊,在使用過程中也可能會產生新的壞塊,當乙個塊被標記為壞塊後,不應再對其寫入資料,以免出現資料丟失。由於 nand 擦寫次數是有限的,而且會在使用過程中產生新的壞塊,一般都需要額外的軟體或硬體來配合它進行使用。

目前,nand 壞塊管理方法可分為如下幾類:

圖 1 展示了幾種典型的嵌入式系統中 nand 內部的內容布局。如果需要頻繁地對 nand 寫入各種資料,最好使用 nand 檔案系統或者 nand 管理中介軟體對需要寫入的區域進行管理。而那些很少需要更新的區域,比如 bootloader、vpd 和 kernel,只需進行輕量級的壞塊管理,不需要進行負載平均。很多的嵌入式系統中,需要寫入 nand 的資料量很少,頻度也較低,比如路由器、印表機、plc 等,這些系統完全可以僅使用輕量級的壞塊管理方式。

圖 1.典型嵌入式系統的 nand memory map

nand 壞塊管理都是基於壞塊表(bbt)的,通過這張表來標識系統中的所有壞塊。所以,不同的管理方法之間的差異可以通過以下幾個問題來找到答案。

uboot 是目前使用最為廣泛的 bootloader,它提供了兩種輕量級壞塊管理方法,可稱之為基本型和改進型。通過下表,我們可以看到兩者的差異。

表 1. uboot 的兩種壞塊管理方法對比

基本型改進型初始化、讀取 bbt

系統每次初始化時,掃瞄整個 nand,讀取所有塊的出廠壞塊標誌,建立 bbt,占用較多啟動時間。

系統第一次初始化時,掃瞄整清單 1. bbm 頭信個 nand 建立 bbt。之後每次初始化時,掃瞄 bbt 所在區域,如果發現當前塊的簽名和壞塊表的簽名(乙個特定的字串)相符,就讀取當前塊的資料作為 bbt。

更新 bbt

擦寫操作產生新的壞塊時,更新記憶體中的 bbt,同時將壞塊的出廠壞塊標記從 0xff 改為 0x00。

擦寫出錯後仍然對壞塊進行操作—更改出廠壞塊標記,存在安全風險。而且,也無法區分哪些是出廠壞塊,哪些是使用過程中產生的壞塊。

擦寫操作產生新的壞塊時,更新記憶體中的 bbt,同時將更新後的 bbt 立刻寫入 nand 或其他 nvram 中。

儲存 bbt

不儲存在 nand 或其他 nvram 中儲存乙份,無掉電保護機制。

壞塊替換方法

如果當前塊是壞塊,將資料寫入下乙個塊。

如果當前塊是壞塊,將資料寫入下乙個塊。

雖然 uboot 的改進型壞塊管理方法的做了一些改進,但它仍然有三個主要的缺點。

出現壞塊,則將資料順序寫入下乙個好塊。如果 nand 中存放了多個軟體模組,則每個模組都需要預留乙個較大的空間作為備用的好塊,這會浪費較多的 nand 空間。通常,每個模組預留的備用好塊數為 nand 晶元所允許的最大壞塊數,該值因不同的晶元而有所不同,典型值為 20 或 80。假設 nand 是大頁型別,總共有 n 個模組,則總共需要預留的空間大小為 n*80*128kb。

讀取 bbt 時僅檢查簽名,沒有對 bbt 的資料做校驗。

沒有掉電保護機制。如果在儲存 bbt 時斷電,bbt 將丟失。

針對現有管理方法的缺陷,本文提出了一種更加安全高效的管理方法,將從以下三個方面闡述其實現原理。

首先,使用乙個統一的備用好塊池,為所有存放在 nand 中的模組提供可替換的好塊。這樣,就不需要在每個模組後面放置乙個保留區,提高了 nand 的空間利用率。

圖 2. 共用好塊池示意圖

為了實現共用好塊池,需要建立乙個從壞塊到好塊的對映,所以,除了 bbt 之外,還需定義乙個替換表(sbt)。這樣一來,當讀第 i 個塊的資料時,如果發現 bbt 中記錄該塊為壞塊,就去 sbt 中查詢其替換塊;如果寫第 i 個塊出錯,需要在 bbt 中標記該塊為壞塊,同時從好塊池中獲取乙個新的好塊,假設其序號為 j,然後將此好塊的序號 j 寫入 sbt 中的第 i 個位元組,而且 sbt 的第 j 個位元組寫序號 i。sbt 中的這種雙向對映可確保資料的可靠性。此外,好塊池中的塊也有可能成為壞塊,如果掃瞄時發現是壞塊,則將 sbt 中的對應位置標記為 0x00,如果是在寫的過程中出錯,則除了在 sbt 對應位置標記 0x00 之外,還要更新雙向對映資料。

圖 3. bbt/sbt 對映示意圖

傳統方法僅檢查 bbt 所在塊的簽名,將讀到的前幾個位元組和乙個特徵字串進行比較,如果一致,就認為當前塊的資料為 bbt,然後讀取接下來的 bbt 資料,但並不對 bbt 的資料做校驗。如果 bbt 儲存在 nand 中,資料的有效性是可以得到驗證的,因為 nand 控制器或驅動一般都會對資料做 ecc 校驗。但是,大多數控制器使用的 ecc 演算法也僅僅能糾正乙個 bit、發現 2 兩個 bit 的錯誤。如果 bbt 儲存在其他的沒有 ecc 校驗機制的儲存體中,比如 nor flash,沒有對 bbt 的資料進行校驗顯然是不安全的。

為了更加可靠和靈活地驗證 bbt/sbt 資料,定義下面這個結構體來描述 bbm 資訊。

清單 1. bbm 頭資訊

typedef struct  bbm_head
圖 4. bbt/sbt 的儲存形式

使用三重 crc 校驗機制,無論 bbt 儲存在哪種儲存體中,都可以更加嚴格地驗證資料的有效性。

傳統的方法僅儲存乙份 bbt 資料,如果在寫 bbt 時系統掉電,則 bbt 丟失,系統將可能無法正常啟動或工作。為安全起見,本文所述方法將同時保留三個備份,如果在寫某個備份時掉電,則還有兩個完好的備份。最壞的情況是,如果在寫第乙個備份時掉電,則當前最新的乙個壞塊資訊丟失。

讀取壞塊表時,順序讀取三個備份,如果發現三個備份的資料不一致,用記錄的壞塊數最多的備份為當前的有效備份,同時立刻更新另外兩備份。

本文介紹了幾類 nand 壞塊管理方法,指出了 uboot 的輕量級管理方法的缺陷,提出了一種改進的方法,提高了 nand 的利用率及壞塊管理的安全性,可對嵌入式開發起到有很好的借鑑作用。

NAND 壞塊管理

nand的操作管理方式nand flash的管理方式 以三星flash為例,一片nand flash為乙個裝置 device 1 device x blocks 1 block x pages 1 page 528 bytes 資料塊大小 512bytes oob 塊大小 16bytes,除oob第...

NAND 壞塊管理

nand的操作管理方式nand flash的管理方式 以三星flash為例,一片nand flash為乙個裝置 device 1 device x blocks 1 block x pages 1 page 528 bytes 資料塊大小 512bytes oob 塊大小 16bytes,除oob第...

ipkg 輕量級套件管理系統

pkg是在嵌入式裝置上最常見到的套件管理系統,如ipaq,或 linksys的wrt54g 都 可以看到它的身影,其實這幾年來,隨筆者玩的板子越來越多,也發現很多家公司連實驗板都使用ipkg套件管理系統,這樣的目的其一是為了簡化安裝軟體的手 序,其二是為了讓實驗板安裝不同的ipk而達到不同的功能,如...