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。如下圖:
以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這個值就是標識擦除成功,是好塊。
nand flash壞塊管理OOB,BBT,ECC
0.nand的操作管理方式 nand flash的管理方式 以三星flahs為例,一片nand flash為乙個裝置 device 1 device x blocks 1 block x pages 1 page 528 bytes 資料塊大小 512bytes oob 塊大小 16bytes,除o...
nand flash壞塊管理OOB,BBT,ECC
nand flash壞塊管理oob,bbt,ecc 0.nand的操作管理方式 nand flash的管理方式 以三星flahs為例,一片nand flash為乙個裝置 device 1 device x blocks 1 block x pages 1 page 528 bytes 資料塊大小 5...
nand flash壞塊管理OOB,BBT,ECC
nand flash壞塊管理oob,bbt,ecc 0.nand的操作管理方式 nand flash的管理方式 以三星flahs為例,一片nand flash為乙個裝置 device 1 device x blocks 1 block x pages 1 page 528 bytes 資料塊大小 5...