關於nand flash的oob區與壞塊

2021-08-17 12:40:03 字數 3037 閱讀 2293

0.nand的操作管理方式

nand flash的管理方式:以三星flash為例,一片nand flash為乙個裝置(device),1 (device) = ***x (blocks),1 (block) = ***x (pages),1(page) =528 (bytes) = 資料塊大小(512bytes) + oob 塊大小(16bytes,除oob第六位元組外,通常至少把oob的前3個位元組存放nand flash硬體ecc碼)。

關於oob區,是每個page都有的。page大小是512位元組的nand每頁分配16位元組的oob;如果nand物理上是2k的page,則每個page分配64位元組的oob(2k的資料區+64bytes的obb區)。如下圖:

以hynix為例,圖中黑體的是實際探測到的nand,是個2g bit(256m)的nand。pgsize是2k位元組,pgspblk表示每個block包含64頁,那麼每個block占用的位元組數是 64x2k=128k位元組;該nand包好2048個block,那麼可以算出nand占用的位元組數是2048x128k=256m,與實際相符。需要注意的是sprsize就是oob大小,也恰好是2k頁所用的64位元組。

1.為什麼會出現壞塊

由於nand flash的工藝不能保證nand的memory array在其生命週期中保持效能的可靠,因此,在nand的生產中及使用過程中會產生壞塊。壞塊的特性是:當程式設計/擦除這個塊時,會造成page program和block erase操作時的錯誤,相應地反映到status register的相應位。

2.壞塊的分類

總體上,壞塊可以分為兩大類:(1)固有壞塊:這是生產過程中產生的壞塊,一般晶元原廠都會在出廠時都會將每個壞塊第乙個page的spare area的第6個byte標記為不等於0xff的 值。(2)

使用壞塊:這是在nand flash使用過程中,

如果block erase或者page program錯誤,就可以簡單地將這個塊作為壞塊來處理,這個時候需要把壞塊標記起來。為了和固有壞塊資訊保持一致,

將新發現的壞塊的第乙個page的 spare area的第6個byte標記為非0xff的值。

3.壞塊管理

根據上面的這些敘述,可以了解nand flash出廠時在spare area中已經反映出了壞塊資訊,因此,

如果在擦除乙個塊之前,一定要先check一下第一頁的spare area的第6個byte是否是0xff,如果是就證明這是乙個好塊,可以擦除;如果是非0xff,那麼就不能擦除,以免將壞塊標記擦掉。

當然,這樣處理可能會犯乙個錯誤―――「錯殺偽壞塊」,因為在晶元操作過程中可能由於 電壓不穩定等偶然因素會造成nand操作的錯誤。但是,為了資料的可靠性及軟體設計的簡單化,還是需要遵照這個標準。

可以用bbt:bad block table,即壞塊表來進行管理。各家對nand的壞塊管理方法都有差異。比如專門用nand做儲存的,會把bbt放到block0,因為第0塊一定是好的塊。但是如果nand本身被用來boot,那麼第0塊就要存放程式,不能放bbt了。

有的把bbt放到最後一塊,當然,這一塊堅決不能為壞塊。

bbt的大小跟nand大小有關,nand越大,需要的bbt也就越大。

需要注意的是:oob是每個頁都有的資料,裡面存的有ecc(當然不僅僅);而bbt是乙個flash才有乙個;針對每個block的壞塊識別則是該塊第一頁spare area的第六個位元組。 

4.壞塊糾正

ecc:

nand flash出錯的時候一般不會造成整個block或是page不能讀取或是全部出錯,而是整個page(例如512bytes)中只有乙個或幾個bit出錯。一般使用一種比較專用的校驗——ecc。ecc能糾正單位元錯誤和檢測雙位元錯誤,而且計算速度很快,但對1位元以上的錯誤無法糾正,對2位元以上的錯誤不保證能檢測。

ecc一般每256位元組原始資料生成3位元組ecc校驗資料,這三位元組共24位元分成兩部分:6位元的列校驗和16位元的行校驗,多餘的兩個位元置1。(512生成兩組ecc,共6位元組) 

當往nand flash的page中寫入資料的時候,每256位元組我們生成乙個ecc校驗和,稱之為原ecc校驗和,儲存到page的oob (out- of-band)資料區中。其位置就是eccpos。校驗的時候,根據上述ecc生成原理不難推斷:將從oob區中讀出的原ecc校驗和新ecc校驗和按位異或,若結果為0,則表示不存在錯(或是出現了ecc無法檢測的錯誤);若3個位元組異或結果中存在11個位元位為1,表示存在乙個位元錯誤,且可糾正;若3個位元組異或結果中只存在1個位元位為1,表示oob區出錯;其他情況均表示出現了無法糾正的錯誤。 

5.補充

(1)需要對前面由於page program錯誤發現的壞塊進行一下特別說明。如果在對乙個塊的某個page進行程式設計的時候發生了錯誤就要把這個塊標記為壞塊,首先就要把塊裡其他好的面的內容備份到另外乙個空的好塊裡面,然後,把這個塊標記為壞塊。當然,這可能會犯「錯殺」之誤,乙個補救的辦法,就是在進行完塊備份之後,再將這個壞塊擦除一遍,如果block erase發生錯誤,那就證明這個塊是個真正的壞塊,那就毫不猶豫地將它打個「戳」吧!

(2)可能有人會問,為什麼要使用每個塊第一頁的spare area的第六個byte作為壞塊標記。這是nand flash生產商的預設約定,你可以看到samsung,toshiba,stmicroelectronics都是使用這個byte作為壞塊標記的。

(3)為什麼好塊用0xff來標記?因為nand flash的擦除即是將相應塊的位全部變為1,寫操作時只能把晶元每一位(bit)只能從1變為0,而不能從0變為1。0xff這個值就是標識擦除成功,是好塊。

(4)nand erase命令 :擦除nand flash,該命令只擦資料區,不擦oob區

nand scrub命令 :格式化nand flash,該命令擦資料區,也擦oob區, 因壞塊標記放在oob區,故該條命令會擦掉壞塊的壞塊標識,這樣導致的結果就是:

nand scrub後就可以使用該壞塊,但是把程式放到該塊上又有使程式紊亂的風險,

之所以是存在風險,是因為程式也可能被放到該塊的其他正常頁上,這樣就不會造成程式的紊亂

但如果這個塊的某一頁是真的壞了,你寫入到該頁後,下次讀出就會ecc校驗出錯

這樣下次就又會把這個塊標記為壞塊了

同時又損壞了寫到該頁資料區的內容

關於從NAND Flash啟動的問題

椐了解 nor flash 是容量小,速度快,穩定性好,適合做程式儲存器。nand flash 總容量大,適合做資料儲存器是不能從nand flash啟動的,nand flash是的讀寫時序是不能直接有arm硬體產生的,要讀寫nand flash是要通過程式來實現的,很明顯能看出來的就是nand f...

關於NandFlash 啟動問題

最初學習嵌入式linux驅動時,按照韋東山老師的移植教程糊里糊塗的完成了2440的norflash和nandflash的啟動,但並不明白所以然,所以就花時間研究一下,解除心中的疑惑。並附上韋東山的講解 如下圖2440的記憶體對映所示 norflash啟動 根據手冊可知,當晶元配置為norflash啟...

關於6410的sd卡和nandflash啟動的區別

今天在公司我們隊長問我個問題,關於cortex的sd啟動流程和nandflash的啟動流程,一下想不起來了,中午閒來無事就整理了整理當初6410的兩種啟動方式的區別。在這裡寫一下。有不對的請指點,我對rom,ram,sram這些實在學不通。1,sd卡啟動6410 首先,sd卡啟動0位址在rom裡面,...