一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

NandFlash基礎(chǔ)知識和幾類NAND壞塊管理方法

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2021-01-07 10:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

概述

Flash名稱的由來,F(xiàn)lash的擦除操作是以block塊為單位的,與此相對應(yīng)的是其他很多存儲設(shè)備,是以bit位為最小讀取/寫入的單位,F(xiàn)lash是一次性地擦除整個塊:在發(fā)送一個擦除命令后,一次性地將一個block,常見的塊的大小是128KB/256KB,全部擦除為1,也就是里面的內(nèi)容全部都是0xFF了,由于是一下子就擦除了,相對來說,擦除用的時間很短,可以用一閃而過來形容,所以,叫做Flash Memory。所以一般將Flash翻譯為 (快速)閃存。

NAND Flash 在嵌入式系統(tǒng)中有著廣泛的應(yīng)用,負(fù)載平均和壞塊管理是與之相關(guān)的兩個核心議題。Uboot 和 Linux 系統(tǒng)對 NAND 的操作都封裝了對這兩個問題的處理方法。本文首先講述Nandflash基礎(chǔ)知識,然后介紹現(xiàn)有的幾類壞塊管理(BBM)方法,通過分析典型嵌入式系統(tǒng)的 NAND 存儲表,指出了輕量級管理方法的優(yōu)勢所在,分析了當(dāng)前廣泛使用的輕量級管理方法,指出其缺陷所在并詳細(xì)說明了改進(jìn)方法。

基礎(chǔ)知識

Flash的硬件實(shí)現(xiàn)機(jī)制

Flash的內(nèi)部存儲是MOSFET,里面有個懸浮門(Floating Gate),是真正存儲數(shù)據(jù)的單元。

在Flash之前,紫外線可擦除(uv-erasable)的EPROM,就已經(jīng)采用了Floating Gate存儲數(shù)據(jù)這一技術(shù)了。

典型的Flash內(nèi)存物理結(jié)構(gòu)

f6112d1e-5079-11eb-8b86-12bb97331649.png

數(shù)據(jù)在Flash內(nèi)存單元中是以電荷(electrical charge) 形式存儲的。存儲電荷的多少,取決于圖中的外部門(external gate)所被施加的電壓,其控制了是向存儲單元中沖入電荷還是使其釋放電荷。而數(shù)據(jù)的表示,以所存儲的電荷的電壓是否超過一個特定的閾值Vth來表示,因此,F(xiàn)lash的存儲單元的默認(rèn)值,不是0(其他常見的存儲設(shè)備,比如硬盤燈,默認(rèn)值為0),而是1,而如果將電荷釋放掉,電壓降低到一定程度,表述數(shù)字0。

NandFlash的簡介
Nand flash成本相對低,說白了就是便宜,缺點(diǎn)是使用中數(shù)據(jù)讀寫容易出錯,所以一般都需要有對應(yīng)的軟件或者硬件的數(shù)據(jù)校驗(yàn)算法,統(tǒng)稱為ECC。但優(yōu)點(diǎn)是,相對來說容量比較大,現(xiàn)在常見的Nand Flash都是1GB,2GB,更大的8GB的都有了,相對來說,價格便宜,因此適合用來存儲大量的數(shù)據(jù)。其在嵌入式系統(tǒng)中的作用,相當(dāng)于PC上的硬盤,用于存儲大量數(shù)據(jù)。

SLC和MLC

Nand Flash按照內(nèi)部存儲數(shù)據(jù)單元的電壓的不同層次,也就是單個內(nèi)存單元中,是存儲1位數(shù)據(jù),還是多位數(shù)據(jù),可以分為SLC和MLC。那么軟件如何識別系統(tǒng)上使用過的SLC還是MLC呢?Nand Flash設(shè)計(jì)中,有個命令叫做Read ID,讀取ID,讀取好幾個字節(jié),一般最少是4個,新的芯片,支持5個甚至更多,從這些字節(jié)中,可以解析出很多相關(guān)的信息,比如此Nand Flash內(nèi)部是幾個芯片(chip)所組成的,每個chip包含了幾片(Plane),每一片中的頁大小,塊大小,等等。在這些信息中,其中有一個,就是識別此flash是SLC還是MLC。

oob / Redundant Area / Spare Area

每一個頁,對應(yīng)還有一塊區(qū)域,叫做空閑區(qū)域(spare area)/冗余區(qū)域(redundant area),而Linux系統(tǒng)中,一般叫做OOB(Out Of Band),這個區(qū)域,是最初基于Nand Flash的硬件特性:數(shù)據(jù)在讀寫時候相對容易錯誤,所以為了保證數(shù)據(jù)的正確性,必須要有對應(yīng)的檢測和糾錯機(jī)制,此機(jī)制被叫做EDC(Error Detection Code)/ECC(Error Code Correction, 或者 Error Checking and Correcting),所以設(shè)計(jì)了多余的區(qū)域,用于放置數(shù)據(jù)的校驗(yàn)值。

Oob的讀寫操作,一般是隨著頁的操作一起完成的,即讀寫頁的時候,對應(yīng)地就讀寫了oob。

關(guān)于oob具體用途,總結(jié)起來有:

標(biāo)記是否是壞快

存儲ECC數(shù)據(jù)

存儲一些和文件系統(tǒng)相關(guān)的數(shù)據(jù)。如jffs2就會用到這些空間存儲一些特定信息,而yaffs2文件系統(tǒng),會在oob中,存放很多和自己文件系統(tǒng)相關(guān)的信息。

Bad Block Management壞塊管理

Nand Flash由于其物理特性,只有有限的擦寫次數(shù),超過那個次數(shù),基本上就是壞了。在使用過程中,有些Nand Flash的block會出現(xiàn)被用壞了,當(dāng)發(fā)現(xiàn)了,要及時將此block標(biāo)注為壞塊,不再使用。于此相關(guān)的管理工作,屬于Nand Flash的壞塊管理的一部分工作。

Wear-Leveling負(fù)載平衡

Nand Flash的block管理,還包括負(fù)載平衡。

正是由于Nand Flash的block,都是有一定壽命限制的,所以如果你每次都往同一個block擦除然后寫入數(shù)據(jù),那么那個block就很容易被用壞了,所以我們要去管理一下,將這么多次的對同一個block的操作,平均分布到其他一些block上面,使得在block的使用上,相對較平均,這樣相對來說,可以更能充分利用Nand Flash。

ECC錯誤校驗(yàn)碼

Nand Flash物理特性上使得其數(shù)據(jù)讀寫過程中會發(fā)生一定幾率的錯誤,所以要有個對應(yīng)的錯誤檢測和糾正的機(jī)制,于是才有此ECC,用于數(shù)據(jù)錯誤的檢測與糾正。Nand Flash的ECC,常見的算法有海明碼和BCH,這類算法的實(shí)現(xiàn),可以是軟件也可以是硬件。不同系統(tǒng),根據(jù)自己的需求,采用對應(yīng)的軟件或者是硬件。

相對來說,硬件實(shí)現(xiàn)這類ECC算法,肯定要比軟件速度要快,但是多加了對應(yīng)的硬件部分,所以成本相對要高些。如果系統(tǒng)對于性能要求不是很高,那么可以采用軟件實(shí)現(xiàn)這類ECC算法,但是由于增加了數(shù)據(jù)讀取和寫入前后要做的數(shù)據(jù)錯誤檢測和糾錯,所以性能相對要降低一些,即Nand Flash的讀取和寫入速度相對會有所影響。

其中,Linux中的軟件實(shí)現(xiàn)ECC算法,即NAND_ECC_SOFT模式,就是用的對應(yīng)的海明碼。

而對于目前常見的MLC的Nand Flash來說,由于容量比較大,動輒2GB,4GB,8GB等,常用BCH算法。BCH算法,相對來說,算法比較復(fù)雜。

筆者由于水平有限,目前仍未完全搞懂BCH算法的原理。

BCH算法,通常是由對應(yīng)的Nand Flash的Controller中,包含對應(yīng)的硬件BCH ECC模塊,實(shí)現(xiàn)了BCH算法,而作為軟件方面,需要在讀取數(shù)據(jù)后,寫入數(shù)據(jù)之前,分別操作對應(yīng)BCH相關(guān)的寄存器,設(shè)置成BCH模式,然后讀取對應(yīng)的BCH狀態(tài)寄存器,得知是否有錯誤,和生成的BCH校驗(yàn)碼,用于寫入。

其具體代碼是如何操作這些寄存器的,由于是和具體的硬件,具體的nand flash的controller不同而不同,無法用同一的代碼。如果你是nand flash驅(qū)動開發(fā)者,自然會得到對應(yīng)的起nand flash的controller部分的datasheet,按照手冊說明,去操作即可。

不過,額外說明一下的是,關(guān)于BCH算法,往往是要從專門的做軟件算法的廠家購買的,但是Micron之前在網(wǎng)上放出一個免費(fèi)版本的BCH算法。

位反轉(zhuǎn)

Nand Flash的位反轉(zhuǎn)現(xiàn)象,主要是由以下一些原因/效應(yīng)所導(dǎo)致:

漂移效應(yīng)(Drifting Effects)

漂移效應(yīng)指的是,Nand Flash中cell的電壓值,慢慢地變了,變的和原始值不一樣了。

編程干擾所產(chǎn)生的錯誤(Program-Disturb Errors

此現(xiàn)象有時候也叫做,過度編程效應(yīng)(over-program effect)。

對于某個頁面的編程操作,即寫操作,引起非相關(guān)的其他的頁面的某個位跳變了。

讀操作干擾產(chǎn)生的錯誤(Read-Disturb Errors)

此效應(yīng)是,對一個頁進(jìn)行數(shù)據(jù)讀取操作,卻使得對應(yīng)的某個位的數(shù)據(jù),產(chǎn)生了永久性的變化,即Nand Flash上的該位的值變了。

對應(yīng)位反轉(zhuǎn)的類型,Nand Flash位反轉(zhuǎn)的類型和解決辦法,有兩種:

一種是nand flash物理上的數(shù)據(jù)存儲的單元上的數(shù)據(jù),是正確的,只是在讀取此數(shù)據(jù)出來的數(shù)據(jù)中的某位,發(fā)生變化,出現(xiàn)了位反轉(zhuǎn),即讀取出來的數(shù)據(jù)中,某位錯了,本來是0變成1,或者本來是1變成0了。此處可以成為軟件上位反轉(zhuǎn)。此數(shù)據(jù)位的錯誤,當(dāng)然可以通過一定的校驗(yàn)算法檢測并糾正。

另外一種,就是nand flash中的物理存儲單元中,對應(yīng)的某個位,物理上發(fā)生了變化,原來是1的,變成了0,或原來是0的,變成了1,發(fā)生了物理上的位的數(shù)據(jù)變化。此處可以成為硬件上的位反轉(zhuǎn)。此錯誤,由于是物理上發(fā)生的,雖然讀取出來的數(shù)據(jù)的錯誤,可以通過軟件或硬件去檢測并糾正過來,但是物理上真正發(fā)生的位的變化,則沒辦法改變了。不過個人理解,好像也是可以通過擦除Erase整個數(shù)據(jù)塊Block的方式去擦除此錯誤,不過在之后的Nand Flash的使用過程中,估計(jì)此位還是很可能繼續(xù)發(fā)生同樣的硬件的位反轉(zhuǎn)的錯誤。

以上兩種類型的位反轉(zhuǎn),其實(shí)對于從Nand Flash讀取出來的數(shù)據(jù)來說,解決其中的錯誤的位的方法,都是一樣的,即通過一定的校驗(yàn)算法,常稱為ECC,去檢測出來,或檢測并糾正錯誤。

如果只是單獨(dú)檢測錯誤,那么如果發(fā)現(xiàn)數(shù)據(jù)有誤,那么再重新讀取一次即可。

實(shí)際中更多的做法是,ECC校驗(yàn)發(fā)現(xiàn)有錯誤,會有對應(yīng)的算法去找出哪位錯誤并且糾正過來。

其中對錯誤的檢測和糾正,具體的實(shí)現(xiàn)方式,有軟件算法,也有硬件實(shí)現(xiàn),即硬件Nand Flash的控制器controller本身包含對應(yīng)的硬件模塊以實(shí)現(xiàn)數(shù)據(jù)的校驗(yàn)和糾錯的。

Nand Flash引腳功能的中文說明

引腳名稱 引腳功能
I/O0 ~ I/O7 用于輸入地址/數(shù)據(jù)/命令,輸出數(shù)據(jù)
CLE Command Latch Enable,命令鎖存使能,在輸入命令之前,要先在模式寄存器中,設(shè)置CLE使能
ALE Address Latch Enable,地址鎖存使能,在輸入地址之前,要先在模式寄存器中,設(shè)置ALE使能
CE# Chip Enable,芯片使能,在操作Nand Flash之前,要先選中此芯片,才能操作
RE# Read Enable,讀使能,在讀取數(shù)據(jù)之前,要先使CE#有效。
WE# Write Enable,寫使能, 在寫取數(shù)據(jù)之前,要先使WE#有效
WP# Write Protect,寫保護(hù)
R/B# Ready/Busy Output,就緒/忙,主要用于在發(fā)送完編程/擦除命令后,檢測這些操作是否完成,忙,表示編程/擦除操作仍在進(jìn)行中,就緒表示操作完成
Vcc Power,電源
Vss Ground,接地
N.C Non-Connection,未定義,未連接
在數(shù)據(jù)手冊中,你常會看到,對于一個引腳定義,有些字母上面帶一橫杠的,那是說明此引腳/信號是低電平有效,比如你上面看到的RE頭上有個橫線,就是說明,此RE是低電平有效,此外,為了書寫方便,在字母后面加“?!?,也是表示低電平有效,比如我上面寫的CE#;如果字母頭上啥都沒有,就是默認(rèn)的高電平有效,比如上面的CLE,就是高電平有效。

Nand Flash的一些typical特性

頁擦除時間是200us,有些慢的有800us

塊擦除時間是1.5ms

頁數(shù)據(jù)讀取到數(shù)據(jù)寄存器的時間一般是20us

串行訪問(Serial access)讀取一個數(shù)據(jù)的時間是25ns,而一些舊的Nand Flash是30ns,甚至是50ns

輸入輸出端口是地址和數(shù)據(jù)以及命令一起multiplex復(fù)用的

Nand Flash的編程/擦除的壽命:即,最多允許10萬次的編程/擦除,達(dá)到和接近于之前常見的Nor Flash,幾乎是同樣的使用壽命了。

封裝形式:48引腳的TSOP1封裝 或 52引腳的ULGA封裝

Nand Flash控制器與Nand Flash芯片

我們寫驅(qū)動,是寫Nand Flash 控制器的驅(qū)動,而不是Nand Flash 芯片的驅(qū)動,因?yàn)楠?dú)立的Nand Flash芯片,一般來說,是很少直接拿來用的,多數(shù)都是硬件上有對應(yīng)的硬件的Nand Flash的控制器,去操作和控制Nand Flash,包括提供時鐘信號,提供硬件ECC校驗(yàn)等等功能,我們所寫的驅(qū)動軟件,是去操作Nand Flash的控制器

然后由控制器去操作Nand Flash芯片,實(shí)現(xiàn)我們所要的功能。

由于Nand Flash讀取和編程操作來說,一般最小單位是頁,所以Nand Flash在硬件設(shè)計(jì)時候,就考慮到這一特性,對于每一片(Plane),都有一個對應(yīng)的區(qū)域?qū)iT用于存放,將要寫入到物理存儲單元中去的或者剛從存儲單元中讀取出來的,一頁的數(shù)據(jù),這個數(shù)據(jù)緩存區(qū),本質(zhì)上就是一個緩存buffer,但是只是此處datasheet里面把其叫做頁寄存器page register而已,實(shí)際將其理解為頁緩存,更貼切原意。

而正是因?yàn)橛行┤瞬涣私獯藘?nèi)部結(jié)構(gòu),才容易產(chǎn)生之前遇到的某人的誤解,以為內(nèi)存里面的數(shù)據(jù),通過Nand Flash的FIFO,寫入到Nand Flash里面去,就以為立刻實(shí)現(xiàn)了實(shí)際數(shù)據(jù)寫入到物理存儲單元中了,而實(shí)際上只是寫到了這個頁緩存中,只有當(dāng)你再發(fā)送了對應(yīng)的編程第二階段的確認(rèn)命令,即0x10,之后,實(shí)際的編程動作才開始,才開始把頁緩存中的數(shù)據(jù),一點(diǎn)點(diǎn)寫到物理存儲單元中去。

數(shù)據(jù)的流向如圖

壞塊的標(biāo)記

具體標(biāo)記的地方是,對于現(xiàn)在常見的頁大小為2K的Nand Flash,是塊中第一個頁的oob起始位置的第1個字節(jié)(舊的小頁面,pagesize是512B甚至256B的Nand Flash,壞塊標(biāo)記是第6個字節(jié)),如果不是0xFF,就說明是壞塊。相對應(yīng)的是,所有正常的塊,好的塊,里面所有數(shù)據(jù)都是0xFF的。

對于壞塊的標(biāo)記,本質(zhì)上,也只是對應(yīng)的flash上的某些字節(jié)的數(shù)據(jù)是非0xFF而已,所以,只要是數(shù)據(jù),就是可以讀取和寫入的。也就意味著,可以寫入其他值,也就把這個壞塊標(biāo)記信息破壞了。對于出廠時的壞塊,一般是不建議將標(biāo)記好的信息擦除掉的。

uboot中有個命令是

nand scrub

就可以將塊中所有的內(nèi)容都擦除了,包括壞塊標(biāo)記,不論是出廠時的,還是后來使用過程中出現(xiàn)而新標(biāo)記的。

nand erase

只擦除好的塊,對于已經(jīng)標(biāo)記壞塊的塊,不要輕易擦除掉,否則就很難區(qū)分哪些是出廠時就壞的,哪些是后來使用過程中用壞的了。

NAND 壞塊管理方法分類

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

基于 FTL 芯片的壞塊管理

它使用一個額外的 FTL (Flash Translation Layer)芯片對 NAND 進(jìn)行管理,對外部屏蔽了壞塊信息,U 盤、SD 卡、MMC 卡以及固態(tài)硬盤都使用這種管理方法。這種方式簡化了 NAND 操作,但也使壞塊信息對外部而言不可見,如果系統(tǒng)中出現(xiàn)了可能和壞塊相關(guān)的問題,定位和調(diào)試變得困難,另外,F(xiàn)TL 芯片也需要額外的硬件成本。

基于NAND 文件系統(tǒng)的壞塊管理

JFFS2、 YAFFS2、 FlashFx 這些專門針對 NAND 的文件系統(tǒng)可以對壞塊進(jìn)行管理。

NAND 管理中間件

有一些中間件(Middleware)專門用于 NAND 管理,比如 UBI。

輕量級 NAND 壞塊管理

對 NAND 進(jìn)行管理的硬件或軟件模塊,不僅提供壞塊管理,同時也支持對 NAND 的擦寫操作進(jìn)行負(fù)載平均。而輕量級的壞塊管理只專注于壞塊,并不提供擦寫負(fù)載平均的支持,而且,它也不依賴于任何第三方的庫。因此,輕量級的壞塊管理方式降低了系統(tǒng)的復(fù)雜度,而且免去了加載文件系統(tǒng)或初始化中間件的時間,在嵌入式系統(tǒng)中有著廣泛的應(yīng)用。

圖 1 展示了幾種典型的嵌入式系統(tǒng)中 NAND 內(nèi)部的內(nèi)容布局。如果需要頻繁地對 NAND 寫入各種數(shù)據(jù),最好使用 NAND 文件系統(tǒng)或者 NAND 管理中間件對需要寫入的區(qū)域進(jìn)行管理。而那些很少需要更新的區(qū)域,比如 bootloader、VPD 和 Kernel,只需進(jìn)行輕量級的壞塊管理,不需要進(jìn)行負(fù)載平均。很多的嵌入式系統(tǒng)中,需要寫入 NAND 的數(shù)據(jù)量很少,頻度也較低,比如路由器、打印機(jī)、PLC 等,這些系統(tǒng)完全可以僅使用輕量級的壞塊管理方式。

典型嵌入式系統(tǒng)的 Nand Memory MaP

f63ff2de-5079-11eb-8b86-12bb97331649.png

Uboot 的輕量級壞塊管理方法

NAND 壞塊管理都是基于壞塊表(BBT)的,通過這張表來標(biāo)識系統(tǒng)中的所有壞塊。所以,不同的管理方法之間的差異可以通過以下幾個問題來找到答案。

如何初始化和讀取壞塊表?

產(chǎn)生新的壞塊時,如何標(biāo)記并更新壞塊表?

如何保存壞塊表?是否有保存時斷電保護(hù)機(jī)制?

對 NAND 寫入數(shù)據(jù)時,如果當(dāng)前塊是壞塊,如何找到可替換的好塊?

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

Uboot 的兩種壞塊管理方法對比

基本型 改進(jìn)型
初始化、讀取 BBT 系統(tǒng)每次初始化時,掃描整個 NAND,讀取所有塊的出廠壞塊標(biāo)志,建立 BBT,占用較多啟動時間。 系統(tǒng)第一次初始化時,掃描整清單 1. BBM 頭信個 NAND 建立 BBT。之后每次初始化時,掃描 BBT 所在區(qū)域,如果發(fā)現(xiàn)當(dāng)前塊的簽名和壞塊表的簽名(一個特定的字符串)相符,就讀取當(dāng)前塊的數(shù)據(jù)作為 BBT。
更新 BBT 擦寫操作產(chǎn)生新的壞塊時,更新內(nèi)存中的 BBT,同時將壞塊的出廠壞塊標(biāo)記從 0xFF 改為 0x00。擦寫出錯后仍然對壞塊進(jìn)行操作—更改出廠壞塊標(biāo)記,存在安全風(fēng)險。而且,也無法區(qū)分哪些是出廠壞塊,哪些是使用過程中產(chǎn)生的壞塊。 擦寫操作產(chǎn)生新的壞塊時,更新內(nèi)存中的 BBT,同時將更新后的 BBT 立刻寫入 NAND 或其他 NVRAM 中。
保存 BBT 不保存 在 NAND 或其他 NVRAM 中保存一份,無掉電保護(hù)機(jī)制。
壞塊替換方法 如果當(dāng)前塊是壞塊,將數(shù)據(jù)寫入下一個塊。 如果當(dāng)前塊是壞塊,將數(shù)據(jù)寫入下一個塊。

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

出現(xiàn)壞塊,則將數(shù)據(jù)順序?qū)懭胂乱粋€好塊。如果 NAND 中存放了多個軟件模塊,則每個模塊都需要預(yù)留一個較大的空間作為備用的好塊,這會浪費(fèi)較多的 NAND 空間。通常,每個模塊預(yù)留的備用好塊數(shù)為 NAND 芯片所允許的最大壞塊數(shù),該值因不同的芯片而有所不同,典型值為 20 或 80。假設(shè) NAND 是大頁類型,總共有 N 個模塊,則總共需要預(yù)留的空間大小為 N*80*128KB。

讀取 BBT 時僅檢查簽名,沒有對 BBT 的數(shù)據(jù)做校驗(yàn)。

沒有掉電保護(hù)機(jī)制。如果在保存 BBT 時斷電,BBT 將丟失。

改進(jìn)的輕量級壞塊管理方法

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

共用好塊池機(jī)制

首先,使用一個統(tǒng)一的備用好塊池,為所有存放在 NAND 中的模塊提供可替換的好塊。這樣,就不需要在每個模塊后面放置一個保留區(qū),提高了 NAND 的空間利用率。

共用好塊池示意圖

f671f70c-5079-11eb-8b86-12bb97331649.jpg

為了實(shí)現(xiàn)共用好塊池,需要建立一個從壞塊到好塊的映射,所以,除了 BBT 之外,還需定義一個替換表(SBT)。這樣一來,當(dāng)讀第 i 個塊的數(shù)據(jù)時,如果發(fā)現(xiàn) BBT 中記錄該塊為壞塊,就去 SBT 中查詢其替換塊;如果寫第 i 個塊出錯,需要在 BBT 中標(biāo)記該塊為壞塊,同時從好塊池中獲取一個新的好塊,假設(shè)其序號為 j,然后將此好塊的序號 j 寫入 SBT 中的第 i 個字節(jié),而且 SBT 的第 j 個字節(jié)寫序號 i。SBT 中的這種雙向映射可確保數(shù)據(jù)的可靠性。此外,好塊池中的塊也有可能成為壞塊,如果掃描時發(fā)現(xiàn)是壞塊,則將 SBT 中的對應(yīng)位置標(biāo)記為 0x00,如果是在寫的過程中出錯,則除了在 SBT 對應(yīng)位置標(biāo)記 0x00 之外,還要更新雙向映射數(shù)據(jù)。

BBT/SBT 映射示意圖

f6cc3a50-5079-11eb-8b86-12bb97331649.jpg

安全的 BBT/SBT 數(shù)據(jù)校驗(yàn)機(jī)制

傳統(tǒng)方法僅檢查 BBT 所在塊的簽名,將讀到的前幾個字節(jié)和一個特征字符串進(jìn)行比較,如果一致,就認(rèn)為當(dāng)前塊的數(shù)據(jù)為 BBT,然后讀取接下來的 BBT 數(shù)據(jù),但并不對 BBT 的數(shù)據(jù)做校驗(yàn)。如果 BBT 保存在 NAND 中,數(shù)據(jù)的有效性是可以得到驗(yàn)證的,因?yàn)?NAND 控制器或驅(qū)動一般都會對數(shù)據(jù)做 ECC 校驗(yàn)。但是,大多數(shù)控制器使用的 ECC 算法也僅僅能糾正一個 bit、發(fā)現(xiàn) 2 兩個 bit 的錯誤。如果 BBT 保存在其他的沒有 ECC 校驗(yàn)機(jī)制的存儲體中,比如 NOR Flash,沒有對 BBT 的數(shù)據(jù)進(jìn)行校驗(yàn)顯然是不安全的。

為了更加可靠和靈活地驗(yàn)證 BBT/SBT 數(shù)據(jù),定義下面這個結(jié)構(gòu)體來描述 BBM 信息。

BBM 頭信息

typedef struct { UINT8 acSignature[4];/* BBM 簽名 */ UINT32 ulBBToffset;/* BBT 偏移 */ UINT32 ulSBToffset;/* SBT 偏移 */ UINT16 usBlockNum;/* BBM 管理的 block 數(shù)目 */ UINT16 usSBTstart;/* SBT 所在位置的起始 block 序號 */ UINT16 usSBtop;/* SBT top block */ UINT16 usSBnum;/* SBT number */ UINT32 ulBBTcrc;/* BBT 數(shù)據(jù) CRC 校驗(yàn)碼 */ UINT32 ulSBTcrc;/* SBT 數(shù)據(jù) CRC 校驗(yàn)碼 */ UINT32 ulHeadcrc;/* BBM 頭信息 CRC 校驗(yàn)碼 */ } BBM_HEAD

BBT/SBT 的保存形式

f6edaa46-5079-11eb-8b86-12bb97331649.png

使用三重 CRC 校驗(yàn)機(jī)制,無論 BBT 保存在哪種存儲體中,都可以更加嚴(yán)格地驗(yàn)證數(shù)據(jù)的有效性。

安全的掉電保存機(jī)制

傳統(tǒng)的方法僅保存一份 BBT 數(shù)據(jù),如果在寫 BBT 時系統(tǒng)掉電,則 BBT 丟失,系統(tǒng)將可能無法正常啟動或工作。為安全起見,本文所述方法將同時保留三個備份,如果在寫某個備份時掉電,則還有兩個完好的備份。最壞的情況是,如果在寫第一個備份時掉電,則當(dāng)前最新的一個壞塊信息丟失。

讀取壞塊表時,順序讀取三個備份,如果發(fā)現(xiàn)三個備份的數(shù)據(jù)不一致,用記錄的壞塊數(shù)最多的備份為當(dāng)前的有效備份,同時立刻更新另外兩備份。

總結(jié)

本文介紹了NandFlash基礎(chǔ)知識和幾類 NAND 壞塊管理方法,指出了 uboot 的輕量級管理方法的缺陷,提出了一種改進(jìn)的方法,提高了 NAND 的利用率及壞塊管理的安全性,可對嵌入式開發(fā)起到有很好的借鑒作用。

責(zé)任編輯:Xj

原文標(biāo)題:Nand Flash基礎(chǔ)知識與壞塊管理機(jī)制的研究

文章出處:【微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • NAND
    +關(guān)注

    關(guān)注

    16

    文章

    1722

    瀏覽量

    138136
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1679

    瀏覽量

    151817
  • Uboot
    +關(guān)注

    關(guān)注

    4

    文章

    129

    瀏覽量

    29094

原文標(biāo)題:Nand Flash基礎(chǔ)知識與壞塊管理機(jī)制的研究

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    兆易創(chuàng)新推出GD5F1GM9系列高速Q(mào)SPI NAND Flash

    今日,兆易創(chuàng)新宣布推出GD5F1GM9系列高速Q(mào)SPI NAND Flash,該系列以其突破性的讀取速度和創(chuàng)新的壞塊管理(BBM)功能,可有效解決傳統(tǒng)SPI NAND Flash響應(yīng)速
    的頭像 發(fā)表于 04-16 13:50 ?583次閱讀

    效果器的基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《效果器的基礎(chǔ)知識.doc》資料免費(fèi)下載
    發(fā)表于 03-26 14:30 ?4次下載

    Nand flash 和SD卡(SD NAND)存儲扇區(qū)分配表異同

    : 存儲結(jié)構(gòu)與層次:NAND Flash 通常作為底層存儲介質(zhì),其存儲扇區(qū)分配表相對較為底層和直接,與閃存芯片的物理結(jié)構(gòu)緊密相關(guān)。它需要考慮閃存的擦除、寫入特性,以及壞塊管理等底層操作。而SD卡(米客方
    發(fā)表于 03-13 10:45

    PCB繪制基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《PCB繪制基礎(chǔ)知識.pdf》資料免費(fèi)下載
    發(fā)表于 01-21 15:20 ?6次下載
    PCB繪制<b class='flag-5'>基礎(chǔ)知識</b>

    雷龍SD NAND試用

    了解以便測試與使用。 芯片不用寫驅(qū)動程序自帶壞塊管理NAND Flash(貼片式TF卡),尺寸小巧,簡單易用,兼容性強(qiáng),穩(wěn)定可靠,固件可定制,LGA-8封裝,標(biāo)準(zhǔn)SDIO接口,兼容SPI/SD
    發(fā)表于 01-19 13:26

    EMC基礎(chǔ)知識-華為

    EMC基礎(chǔ)知識-華為
    發(fā)表于 01-06 14:09 ?4次下載

    聲明式資源管理方法

    1、管理k8s核心資源的三種基礎(chǔ)方法 陳述式管理方法:主要依賴命令行CLI工具進(jìn)行管理 聲明式管理方法:主要依賴統(tǒng)一資源配置清單(manif
    的頭像 發(fā)表于 12-31 10:16 ?587次閱讀

    大語言模型優(yōu)化生成管理方法

    大語言模型的優(yōu)化生成管理是一個系統(tǒng)工程,涉及模型架構(gòu)、數(shù)據(jù)處理、內(nèi)容控制、實(shí)時響應(yīng)以及倫理監(jiān)管等多個層面。以下,是對大語言模型優(yōu)化生成管理方法的梳理,由AI部落小編整理。
    的頭像 發(fā)表于 12-02 10:45 ?400次閱讀

    品質(zhì)管理基礎(chǔ)知識

    品質(zhì)管理基礎(chǔ)知識
    的頭像 發(fā)表于 11-01 11:08 ?664次閱讀
    品質(zhì)<b class='flag-5'>管理</b><b class='flag-5'>基礎(chǔ)知識</b>

    Verilog HDL的基礎(chǔ)知識

    本文繼續(xù)介紹Verilog HDL基礎(chǔ)知識,重點(diǎn)介紹賦值語句、阻塞與非阻塞、循環(huán)語句、同步與異步、函數(shù)與任務(wù)語法知識。
    的頭像 發(fā)表于 10-24 15:00 ?1197次閱讀
    Verilog HDL的<b class='flag-5'>基礎(chǔ)知識</b>

    淺談基于物聯(lián)技術(shù)的企業(yè)能效管理方法研究

    聯(lián)網(wǎng)技術(shù)合理應(yīng)用條件下,積極探索電力能效管理方法,深入研究電力能效管理系統(tǒng),進(jìn)一步提升電力能效管理水平,助力國內(nèi)社會主義事業(yè)持續(xù)建設(shè)發(fā)展。 關(guān)鍵詞: 物聯(lián)網(wǎng)技術(shù);電力能效;管理方法;企
    的頭像 發(fā)表于 10-17 13:39 ?649次閱讀
    淺談基于物聯(lián)技術(shù)的企業(yè)能效<b class='flag-5'>管理方法</b>研究

    負(fù)載開關(guān)基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《負(fù)載開關(guān)基礎(chǔ)知識.pdf》資料免費(fèi)下載
    發(fā)表于 10-08 09:56 ?2次下載
    負(fù)載開關(guān)<b class='flag-5'>基礎(chǔ)知識</b>

    全新的半導(dǎo)體基礎(chǔ)知識

    《全新的半導(dǎo)體基礎(chǔ)知識》首先對流行于電子書刊上數(shù)十年之久的經(jīng)典半導(dǎo)體基礎(chǔ)知識中存在的謬誤進(jìn)行了全方位的討論,然后以半導(dǎo)體內(nèi)部結(jié)構(gòu)為抓手,以G型半導(dǎo)體(客供電子型半導(dǎo)體)、H型半導(dǎo)體(主供電子型半導(dǎo)體
    的頭像 發(fā)表于 09-20 11:30 ?2034次閱讀
    全新的半導(dǎo)體<b class='flag-5'>基礎(chǔ)知識</b>

    超聲波傳感基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《超聲波傳感基礎(chǔ)知識.pdf》資料免費(fèi)下載
    發(fā)表于 09-04 10:21 ?0次下載
    超聲波傳感<b class='flag-5'>基礎(chǔ)知識</b>

    C++語言基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《C++語言基礎(chǔ)知識.pdf》資料免費(fèi)下載
    發(fā)表于 07-19 10:58 ?10次下載