NAND 壞塊管理

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/253239.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253239.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253239.shtml

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

相關文章

js備忘錄模式——實現分頁點擊已經請求過上一頁的數據(讀js設計模式)

例子:新聞數據實現分頁||點擊下一頁后又點擊上一頁后不用再次請求數據,避免資源浪費,網速不好,用戶體驗效果差 備忘錄模式:在不破壞對象的封裝性的前提下,在對象之外捕獲并保存該對象內部的狀態以方便日后對…

運放的典型電路舉例與計算仿真

運放電路的計算,通過記各種公式很難記住,但是掌握其兩個重要概念,所有計算均可迎刃而解。 那就是運放的兩個重要特性: 虛斷:運放本質特性,輸入阻抗大,兩個輸入端視為等效開路; 虛…

【SPOJ 694】Distinct Substrings (更直接的求法)

【鏈接】h在這里寫鏈接 【題意】 接上一篇文章【題解】 一個字符串所有不同的子串的個數∑(len-sa[i]-height[i])【錯的次數】 0【反思】 在這了寫反思【代碼】 #include<bits/stdc.h> using namespace std;const int N 2e3; const int MAX_CHAR 300;//每個數字的最大…

HTML-錨點

<!DOCTYPE html> <html> <head lang"en"> <meta charset"UTF-8"> <title>錨點</title> <style> .box1,.box2{ height: 600px; border:1px solid; } </style> </head> <body> <a h…

/dev/mtdN和/dev/mtdblockN的區別

1、/dev/mtdn是linux中的MTD架構中&#xff0c;系統自己實現的mtd分區所對應的字符設備&#xff0c;其里面添加了一些ioctl&#xff0c;支持很多命令&#xff0c;如MEMGETINFO&#xff0c;MEMERASE等。 而mtd-util中的flash_eraseall等工具&#xff0c;就是以這些ioctl為基礎而…

#define GPBCON (*(volatile unsigned *)0x56000010) 的理解

2019獨角獸企業重金招聘Python工程師標準>>> 對于不同的計算機體系結構&#xff0c;設備可能是端口映射&#xff0c;也可能是內存映射的。如果系統結構支持獨立的IO地址空間&#xff0c;并且是端口映射&#xff0c;就必須使用匯編語言完成實際對設備的控制&#xff…

三極管基本參數介紹與放大電路分析

全稱為半導體三極管&#xff0c;也稱雙極型晶體管、晶體三極管&#xff0c;是一種電流控制電流的半導器件&#xff0c;作用是把微弱信號放大成幅度值較大的電信號&#xff0c; 也用作無觸點開關。 兩個PN結的排列方式有兩種&#xff1a;PNP和NPN。 三個端點依序稱為射極&#…

Nand分區及nand erase簡解

我的nand flash 32M&#xff0c;kernel 2.6.18, rootfs is emb linux, cramfs.nand flash分區如下&#xff1a;static struct mtd_partition nand_partitions[] {/* bootloader (UBL, U-Boot, BBT) in sectors: 0 - 14 */{.name "bootloader",.offset 0,.size 32…

eclipse啟動了tomcat,但是瀏覽器打不開歡迎頁

tomcat在eclipse中啟動成功&#xff0c;主頁卻打不開 癥狀&#xff1a; tomcat在eclipse里面能正常啟動&#xff0c;而在瀏覽器中訪問http://localhost:8080/不能訪問&#xff0c;且報404錯誤。同時其他項目頁面也不能訪問。 關閉eclipse里面的tomcat&#xff0c;在tomcat安裝目…

洛谷1011 車站

水題。題目描述有坑&#xff0c;可以先根據樣例手算試一試//Serene #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> using namespace std; const int maxn50; int f[50],…

三極管放大電路三種類型

根據三極管三個電極與輸入輸出端子的連接方式&#xff0c;可歸納為三種&#xff1a;共發射極電路、共基極電路和共集電極電路&#xff1b; 三種電路的共同點&#xff1a;各有兩個回路&#xff0c;一個輸入回路一個輸出回路&#xff0c;兩個回路有一個公共 端&#xff0c;而公…

ImportError: No module named 'chardet'

1.使用requsets出現這個錯誤&#xff0c;ImportError: No module named chardet 原因&#xff1a;requests依賴其他一些模塊 解決&#xff1a;依次使用pip安裝即可 pip install certifi pip install chardet pip install idna pip install urllib3轉載于:https://www.cnblogs.c…

各種組件的js 獲取值 / js動態賦值

jQuery獲取Select選擇的Text和Value:語法解釋&#xff1a;1. $("#select_id").change(function(){//code...}); //為Select添加事件&#xff0c;當選擇其中一項時觸發2. var checkText$("#select_id").find("option:selected").text(); //獲取…

Linux下/proc目錄簡介

1. /proc目錄 Linux 內核提供了一種通過 /proc 文件系統&#xff0c;在運行時訪問內核內部數據結構、改變內核設置的機制。proc文件系統是一個偽文件系統&#xff0c;它只存在內存當中&#xff0c;而不占用外存空間。它以文件系統的方式為訪問系統內核數據的操作提供接口。 用戶…

Mysql帶返回值與不帶返回值的2種存儲過程

過程1&#xff1a;帶返回值&#xff1a; 1 drop procedure if exists proc_addNum; 2 create procedure proc_addNum (in x int,in y int,out sum int) 3 BEGIN 4 SET sum x y; 5 end 然后&#xff0c;執行過程&#xff0c;out輸出返回值&#xff1a; 1 call proc_addNum(2,3,…

MOS管的米勒效應簡介

一、米勒平臺介紹 Mos管的三極都會存在以下 的三個電容,分別是:Cgs,Cgd,Cds。 米勒電容指的是Cgd。米勒效應在MOS驅動中臭名昭著,他是由MOS管的米勒電容引發的米勒效應,在MOS管開通過程 中,GS電壓上升到某一電壓值后GS電壓有一段穩定值(圖中t2~t3階段),過后Vgs電壓…

PopupWindow 使用詳解(二) Popwindow 制作常見花哨效果

帝都幾日降溫&#xff0c;終于被撂倒了。but 只要一息尚存就得不斷進步&#xff01;于是&#xff0c;寫出 《PopupWindow 使用詳解》的第二篇 筆記&#xff0c;先奉上 第一篇鏈接: 《PopupWindow 使用詳解&#xff08;一&#xff09; 中文API 文檔 贈送 ListPopupWindow 中文 A…

hbase replication原理分析

本文只是從總體流程來分析replication過程&#xff0c;很多細節沒有提及&#xff0c;下一篇文章準備多分析分析細節。replicationSource啟動過程org.apache.hadoop.hbase.regionserver.HRegionServer#startServiceThreads ->org.apache.hadoop.hbase.replication.regionserv…

8168

http://blog.csdn.net/crushonme/article/details/10287693 http://blog.csdn.net/yangxueble/article/details/10138763

Mysql查詢結果只有一條的情況下把值賦值給變量,再用if else 流程判斷

1 BEGIN 2 set n(SELECT count(day) from log where dayCURDATE()); 3 IF n0 THEN 4 call m_LogInsert(); 5 ELSE 6 call m_LoginCheck(); 7 end if; 8 end 轉載于:https://www.cnblogs.com/mengms/p/7629486.html