本文闡述壞塊是如何產(chǎn)生的,SSD又是通過什么樣的手段來發(fā)現(xiàn)和管理壞塊,廠商建議的壞塊管理策略存在什么樣的問題,什么樣的管理方法會更優(yōu),格式化硬盤會不對導(dǎo)致壞塊表丟失,SSD返修后產(chǎn)生哪些安全隱患。壞塊是如何產(chǎn)生的,SSD又是通過什么樣的手段來發(fā)現(xiàn)和管理壞塊,廠商建議的壞塊管理策略存在什么樣的問題,什么樣的管理方法會更優(yōu),格式化硬盤會不對導(dǎo)致壞塊表丟失,SSD返修后產(chǎn)生哪些安全隱患,本文逐一進行闡述。
概述
壞塊管理設(shè)計理念,關(guān)系到SSD可靠性和效率。Nand Flash廠商給出的壞塊管理做法未必非常合理,在進行產(chǎn)品設(shè)計時,如果對一些異常條件考慮的不周的話,常常會導(dǎo)致一些預(yù)料之外的壞塊產(chǎn)生。例如,在測試多家不同主控SSD后發(fā)現(xiàn)因異常掉電而產(chǎn)生新增壞塊的問題非常普遍,用搜索引擎搜索“異常掉電產(chǎn)生壞塊”或者類似的關(guān)鍵詞,會發(fā)現(xiàn)這個問題不僅僅存在于測試過程中,實際發(fā)生在終端用戶身上的問題也非常之多。
誰來管理壞塊
對于沒有專門閃存文件系統(tǒng)的主控來說,壞塊可以通過SSD controller的固件來管理,對于專門的閃存文件系統(tǒng)來說,通過專門的閃存文件系統(tǒng)來或Driver來管理壞塊。
壞塊(Bad Block)分為三種:
1、出廠壞塊,或初始壞塊,即出廠時因不符合廠商標準或廠商抽測過無法達到廠商公布標準的塊,在出廠時已經(jīng)被廠商標識為壞塊;有些出廠壞塊可以被Erase,有些不可以被Erase;
2、使用過程中因為磨損造成的新增壞塊或使用壞塊;
3、因異常掉電等原因被主控誤判的假性壞塊;
新增壞塊并非全部是因磨損造成的,如果SSD沒有異常掉電保護功能,因異常掉電可能會導(dǎo)致主控誤判壞塊或者真正的新增壞塊產(chǎn)生。在沒有異常掉電保護的情況下,如果Lower page已經(jīng)編程成功,而在Upper page編程過程中突然掉電,必然會導(dǎo)致Lower page中的數(shù)據(jù)發(fā)送錯誤,如果數(shù)據(jù)錯誤數(shù)量超過SSD ECC糾錯能力,那么就會在讀取時出現(xiàn)錯誤,Block會被主控判為“Bad Block”并標識到bad block table中。
新增的壞塊有些是可以被Erase的,而且,新增壞塊被Erase后重新進行數(shù)據(jù)讀寫擦操作未必會再次出錯,因為出錯與否與寫入數(shù)據(jù)的pattern也有關(guān)系,使用某種pattern出錯,更換另一種pattern有可能不會出錯。
出廠壞塊在整個Device中所占的比率
咨詢過幾家Nand Flash原廠,給出比較通用的說法是:出廠壞塊的比率不超過2%,并且廠商會留一部分的余量,確保即使在達到廠商承諾的P/E 次數(shù)最大限度時,仍然有不超過2%的壞塊比率,好像保證2%并非一件很容易的事情,拿到某家新樣品時的壞塊比率超過了2%,實際測試為2.55%
壞塊的判定方法
1、出廠壞塊的判斷方法
壞塊的掃描基本都是掃描廠商指定地址所對應(yīng)的byte是否有FFh標志,沒有FFh則為壞塊。壞塊標識的位置每個廠商大致相同,對于SLC和MLC來說,位置不同,以Micron為例:
1.1 對于小頁(528Byte)的SLC來說,每個Block的第一個page的spare area中的第六個Byte是否有FFh標志,如果沒有就是壞塊;
1.2 對于大頁(大于等于2112Byte)的SLC來說,每個Block的第一個page的spare area的第一個和第六個Byte是否有FFh標志,如果沒有就是壞塊;
1.3 對于MLC來說,出廠壞塊是通過掃描每個Block的第一個page和最后一個page的spare area區(qū)域的第一個或第二個Byte是否為0xFF標志,是0xFF,就是好快,沒有0xFF就是壞塊。
借用Hynix datasheet中的一張圖來說明:
壞塊里面是什么數(shù)據(jù)?全0還是全1?測試看到的結(jié)果如下圖示,當(dāng)然,這未必是真相,出廠壞塊可能真實如此,但新增壞塊就未必了,否則通過“壞塊”做數(shù)據(jù)隱藏豈不是無法實現(xiàn):
出廠壞塊能否擦除掉?
有些是“可以”擦除掉,有些則被廠商禁止擦除,所謂的“可以”擦除僅僅是指可以通過發(fā)送擦除命令將壞塊標識改掉,而不是建議可以使用壞塊。
廠商強烈建議是不要擦除壞塊,壞塊標志一旦被擦除,是無法“恢復(fù)”回來的,在壞塊上寫入數(shù)據(jù)是有風(fēng)險的。
2、使用過程中,新增壞塊的判定方法
新增壞塊是通過狀態(tài)寄存器的反饋結(jié)果來判斷對Nand Flash的操作是否成功,當(dāng)Program或者Erase時,如果狀態(tài)寄存器反饋為fail,則SSD主控會將此Block列為壞塊。
具體來說:
2.1、當(dāng)執(zhí)行擦除指令時出錯;
2.2、當(dāng)執(zhí)行寫命令時出錯;
2.3、當(dāng)執(zhí)行讀取命令時出錯;當(dāng)執(zhí)行讀取命令時,如果bit的錯誤數(shù)超過了ECC的糾錯能力,該Block將被判為壞塊。
壞塊管理的方法
壞塊是通過建立和更新壞塊表(Bad Block Table:BBT)來進行管理的。壞塊表的做法并沒有統(tǒng)一的規(guī)范和做法,有些工程師用一個表來管理出廠壞塊和新增壞塊,有些工程師則會把兩個表分開管理,有些工程師則把初始壞塊作為單獨的表,出廠壞塊加新增壞塊作為另外一個表。
對于壞塊表的內(nèi)容,表達方式也不盡一致,有些會表達的比較粗略,例如:使用0表示好快,用1表示壞塊或者反之。而有些工程師則會使用更詳細的描述方式,如:使用00表示出廠壞塊,01表示Program失敗時的壞塊,10表示Read失敗時產(chǎn)生的壞塊,11表示Erase失敗時產(chǎn)生的壞塊。
壞塊表一般會在獨立的區(qū)域進行保存(如:Block0,page0和Block1,page1),每次通電后直接讀取BBT,效率比較高,考慮到Nand Flash本身也會損壞,有可能導(dǎo)致BBT的丟失,因此,通常會將BBT做備份處理,備份多少份每家也不同,有人備份2份,也有人備份8份,通常情況下,可以借助概率論的表決系統(tǒng)進行計算,不管怎樣,最起碼也要2份以上吧。
壞塊管理策略一般包括:壞塊跳過策略和壞塊替換策略;
壞塊跳過策略
1、對于初始壞塊,壞塊跳過會通過BBT將對應(yīng)的壞塊跳過,直接將數(shù)據(jù)存入下一個好塊。
2、對于新增的壞塊,將此壞塊更新到BBT中,將壞塊中的有效數(shù)據(jù)轉(zhuǎn)存到下一個好塊中,以后每次再做相應(yīng)的Read、Program或者Erse時直接跳過此壞塊。
壞塊替換策略(某Nand Flash廠商建議的做法)
壞塊替換,是指使用預(yù)留區(qū)中的好塊來替換使用過程中產(chǎn)生的壞塊。假設(shè),在program時,第n個page出現(xiàn)錯誤,那么在壞塊替換策略下,會將page0到page(n-1)中的數(shù)據(jù)拷貝到預(yù)留區(qū)的空閑Block(例如Block D)的相同位置,然后將數(shù)據(jù)寄存器中第n個page的數(shù)據(jù)寫入Block D中的page n。
廠商的建議的做法是將整個數(shù)據(jù)區(qū)域劃分為兩部分,一部分是用戶可見區(qū)域,用于用戶正常的數(shù)據(jù)操作,另一部分為替換壞塊專門準備的備用區(qū)域,用于存儲替換壞塊的數(shù)據(jù)以及保存壞塊表,備用區(qū)域的比例為整個容量的2%。
當(dāng)有壞塊產(chǎn)生時,F(xiàn)TL會將Bad Block地址重新映射到保留區(qū)好塊地址,而不是直接跳過壞塊到下一個好塊,在每次對邏輯地址寫操作之前,都會先計算哪些物理地址可以寫,哪些地址是壞塊,如果是壞塊,就將數(shù)據(jù)寫入對應(yīng)保留區(qū)的地址。
兵哥沒有看到關(guān)于2%的預(yù)留區(qū)域是否需要包含在OP區(qū)域之內(nèi)還是額外的區(qū)域之類的建議,也沒有看到2%的保留區(qū)域是動態(tài)還是靜態(tài)的描述,加入是獨立的區(qū)域且是靜態(tài)區(qū)域,那么這種做法會有如下弊端:
1、 直接保留2%的區(qū)域留作壞塊替換,會造成可用容量的減少,浪費了空間,同時,由于可用塊數(shù)量少,加快了可用壞的平均磨損次數(shù);2、假設(shè)可用區(qū)域壞塊超過2%時,也就是說預(yù)留替換的區(qū)域全部被替換完,再產(chǎn)生的壞塊將無法處理,SSD將因此而面臨壽命終結(jié)。
壞塊替換策略(部分SSD廠商的做法)
事實上,在真正的產(chǎn)品設(shè)計中,很少見到有單獨預(yù)留2%比率作為壞塊替換區(qū)域的做法,一般情況下,會使用OP(Over Provison)區(qū)free block來替代在使用過程中新增的壞塊,以垃圾回收為例,當(dāng)垃圾回收機制運行時,先將需要回收的Block中的有效page數(shù)據(jù)搬遷到free Block中,然后對此Block進行Erase操作,假設(shè)此時Erase狀態(tài)寄存器反饋Erase失敗,則壞塊管理機制會將此Block地址更新到新增壞塊列表中,同時,將壞塊中的有效數(shù)據(jù)頁寫入到OP區(qū)的Free Block中,更新壞塊管理表,下次寫入數(shù)據(jù)時,直接跳過壞塊到下一個可用塊。
OP大小不同廠商的設(shè)定是不同的,應(yīng)用場景不同,對可靠性要求不同,OP大小也會不同,OP和穩(wěn)定性之間存在取舍關(guān)系,OP越大,在持續(xù)寫入的過程中,垃圾回收可用空間越大,性能就越穩(wěn)定,表現(xiàn)出的性能曲線就越平滑,反之,OP越小,性能穩(wěn)定性就越差,當(dāng)然,用戶可用空間就越大,可用空間大就意味著成本更低。
一般而言,OP可以設(shè)定為5%-50%,7%的OP是常見的比例,與廠商建議的2%固定的區(qū)塊不同的是,7%并不是固定的某些Block做OP,而是動態(tài)分布于所有的Block中,這樣更加有利于磨損平衡策略。
SSD維修的后患
對于大多數(shù)沒有擁有主控技術(shù)的SSD廠商而言,如果產(chǎn)品返修,通常的做法是更換故障器件后進行重新量產(chǎn)操作,此時,新增壞塊列表將會丟失,丟失新增壞塊表就意味著沒有更換的Nand Flash中其實已經(jīng)存在壞塊,操作系統(tǒng)或者敏感數(shù)據(jù)有可能會被寫入到壞塊區(qū)域,很有可能造成用戶操作系統(tǒng)崩潰。即使對于有主控的廠商而言,是否會替用戶保存已經(jīng)存在的壞塊列表,要看廠商面對的用戶的態(tài)度了。
壞塊產(chǎn)是否會影響SSD的讀寫速度和穩(wěn)定性
出廠壞塊在bitline上會被獨立出來,因此不會影響其他Block的擦寫速度,但是,如果整個SSD的新增壞塊足夠多的話,整盤可用Block減少,會導(dǎo)致垃圾回收次數(shù)增加,同時,OP容量減少,會嚴重影響垃圾回收效率,因此,壞塊增加到一定級別會對SSD的性能穩(wěn)定性產(chǎn)生影響,尤其是在持續(xù)對SSD進行寫入操作時,因為系統(tǒng)進行垃圾回收,會導(dǎo)致性能下降,SSD性能曲線會出現(xiàn)較大幅度波動。
fqj
評論