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