nand flash壞塊管理OOB,BBT,ECC

0.NAND的操作管理方式

???? NAND FLASH的管理方式:以三星FLASH為例,一片Nand flash為一個設備(device),1 (Device) = xxxx (Blocks),1 (Block) = xxxx (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這個值就是標識擦除成功,是好塊。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253783.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253783.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253783.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小白學git2

你已經在本地創建了一個Git倉庫后,又想在GitHub創建一個Git倉庫,并且讓這兩個倉庫進行遠程同步,這樣,GitHub上的倉庫既可以作為備份,又可以讓其他人通過該倉庫來協作,真是一舉多得。 首先,登陸G…

[LeetCode_5] Longest Palindromic Substring

LeetCode: 5. Longest Palindromic Substring class Solution { public: //動態規劃算法string longestPalindrome(string s) {int n s.length();int longestBegin 0;int maxLen 1;bool table[1000][1000] {false};for (int i 0; i < n; i) {table[i][i] true;}//對角…

冒泡排序java

一、最簡單粗暴的排序 思想為&#xff1a;讓每一個關鍵字都和它后邊的每一個關鍵字比較&#xff0c; 如果大則交換&#xff0c;這樣第一個位置的關鍵字在一次循環后一定變為最小值。 1 package demo01;2 3 class BubbleSort01 {4 public static void main(String[] args) {…

CMOS圖像傳感器——工作原理

一、像素陣列結構 一般像素陣列是由水平方向的行( Row ) 和垂直方向的列(Column)正交排列構成的。像素排列的最基本設計原則是:攝像器件像素排列的坐標,必須在顯示的時候能夠準確地還原在圖像原來的相對位置上。在大多數情況下,每個像素中心線在行的方向和列的方向,即…

追尋終極數據庫 - 事務/分析混合處理系統的交付挑戰 (3)

挑戰&#xff1a;支持多個存儲引擎 以下內容并不是新發現&#xff1a;行優化存儲適用于OLTP和運營工作負載&#xff0c;而列存儲適用于BI和分析工作負載。頻繁寫入的工作負載適用于行式存儲。對Hadoop而言&#xff0c;Hbase適合低延遲工作負載&#xff0c;列式ORC文件或Parquet…

hibernate快速入門

第一步:下載Hibernate的開發包:  http://sourceforge.net/projects/hibernate/files/hibernate3 第二步:Hibernate框架目錄結構:  documentation :Hibernate文檔  lib :Hibernate開發jar包    bytecode :操作字節碼jar包.    jpa :Hibernate的實現jpa規范.   …

U-boot給kernel傳參數和kernel讀取參數—struct tag

U-boot 會給 Linux Kernel 傳遞很多參數&#xff0c;如&#xff1a;串口&#xff0c; RAM &#xff0c; videofb 等。 而 Linux kernel 也會讀取和處理這些參數。兩者之間 通過 struct tag 來傳遞參數。 U-boot 把要傳遞給 kernel 的東西保存在 struct tag 數據結構中&#xf…

異步FIFO設計(Verilog)

FIFO&#xff08;First In First Out&#xff09;是異步數據傳輸時經常使用的存儲器。該存儲器的特點是數據先進先出&#xff08;后進后出&#xff09;。其實&#xff0c;多位寬數據的異步傳輸問題&#xff0c;無論是從快時鐘到慢時鐘域&#xff0c;還是從慢時鐘到快時鐘域&…

python中RabbitMQ的使用(路由鍵模糊匹配)

路由鍵模糊匹配 使用正則表達式進行匹配。其中“#”表示所有、全部的意思&#xff1b;“*”只匹配到一個詞。 匹配規則&#xff1a; 路由鍵&#xff1a;routings [ happy.work, happy.life , happy.work.teacher, sad.work, sad.life, sad.work.teacher ] "#"&am…

數據倉庫事實表分類[轉]

1&#xff09;在數據倉庫領域有一個概念叫Transaction fact table&#xff0c;中文一般翻譯為“事務事實表”。 事務事實表是維度建模的數據倉庫中三種基本類型事實表中的一種&#xff0c;另外兩種分別是周期快照事實表和累積快照事實表。 事務事實表與周期快照事實表、累積快…

嵌入式系統文件系統比較 jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs

Linux支持多種文件系統&#xff0c;包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等&#xff0c;為了對各類文件系統 進行統一管理&#xff0c;Linux引入了虛擬文件系統VFS(Virtual File System)&#xff0c;為各類文件系統提供一個統一的操作界面和應用編程接口。 …

Codeforces Beta Round #17 C. Balance DP

C. Balance題目鏈接 http://codeforces.com/contest/17/problem/C 題面 Nick likes strings very much, he likes to rotate them, sort them, rearrange characters within a string... Once he wrote a random string of characters a, b, c on a piece of paper and began t…

時鐘切換處理(Verilog)

隨著各種應用場景的限制&#xff0c;芯片在運行時往往需要在不同的應用下切換不同的時鐘源&#xff0c;例如低功耗和高性能模式就分別需要低頻率和高頻率的時鐘。兩個時鐘源有可能是同源且同步的&#xff0c;也有可能是不相關的。直接使用選擇邏輯進行時鐘切換大概率會導致分頻…

SSH整合中,使用父action重構子類action類.(在父類中獲取子類中的泛型對象)

import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type;import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven;/*** 文件名 : BaseAction.java* 提取SSH中的action類* 由于SSH的action中采用模型驅動的方法,使用泛…

用BusyBox制作Linux根文件系統

STEP 1&#xff1a;構建目錄結構 創建根文件系統目錄&#xff0c;主要包括以下目錄 /dev /etc /lib /usr /var /proc /tmp /home /root /mnt /bin /sbin /sys #mkdir /home/rootfs #cd /home/rootfs #mkdir dev etc lib usr var proc tmp home roo…

Angular Elements 組件在非angular 頁面中使用的DEMO

2019獨角獸企業重金招聘Python工程師標準>>> 一、Angular Elements 介紹 Angular Elements 是伴隨Angular6.0一起推出的新技術。它借助Chrome瀏覽器的ShadowDom API&#xff0c;實現一種自定義組件。 這種組件可以用Angular普通組件的開發技術進行編寫&#xff0c;…

(轉) android里,addContentView()動態增加view控件,并實現控件的頂部,中間,底部布局...

http://blog.csdn.net/bfboys/article/details/52563089轉載于:https://www.cnblogs.com/zhangminghan/p/6182909.html

verilog仿真——$test$plusargs 和 $value$plusargs

VERILOG的參數可以用define和parameter的方式定義&#xff0c;這種方法要求我們在編譯前將變量必須定義好&#xff0c;編譯完成之后再也不能修改&#xff1b; 然而&#xff0c;有時候我們在進行仿真時&#xff0c;需要從外部傳遞參數&#xff0c;這個要求怎么滿足呢&#xff1…

盧卡斯定理

盧卡斯定理:解決一類組合數取模問題 A、B是非負整數&#xff0c;p是質數。AB寫成p進制&#xff1a;Aa[n]a[n-1]...a[0]&#xff0c;Bb[n]b[n-1]...b[0]。 則組合數C(A,B)與C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0]) modp同余 即&#xff1a;Lucas(n,m,p)c(n%p,m%p)*Luc…

內核理解

在純技術方面&#xff0c;內核是硬件與軟件之間的一個中間層。其作用是將應用程序的請求傳遞給硬件&#xff0c;并充當底層的驅動程序&#xff0c;對系統中的各種設備和組件。內核啟動init程序作為第一個進程&#xff0c;該進程負責進一步的系統初始化操作&#xff0c;并顯示登…