壞塊來源主要包括:
出廠壞塊(Factory Bad Block):
閃存從工廠出來,就或多或少的有一些壞塊。
增長壞塊(Grown Bad Block):
隨著閃存的使用,一些初期好塊也會變成壞塊。變壞的原因,主要是擦寫磨損。
閃存廠商在閃存出廠時,會對出廠壞塊做特殊標記。一般來說,剛出廠的閃存都被擦除,里面的數據是全0xFF。但是對壞塊來說,閃存廠商會打上不同的標記。
鎧俠(KIOXIA)會在出廠壞塊的第一個閃存頁和最后一個閃存頁的數據區第一個字節和Spare區第一個字節寫上一個非0xFF的值。
用戶在使用閃存的時候,首先應該按照閃存文檔,掃描所有的閃存塊,把壞塊剔除出來、建立一張壞塊表。
還有些閃存廠商,它會把壞塊信息存儲在閃存內部某個地方(掉電不丟失),用戶在建立壞塊表的時候,沒有必要掃描所有的閃存塊來識別壞塊,只需讀取閃存的那個特定區域。比如Micron,它的閃存內部有個叫OTP(One Time Programming)的區域,出廠壞塊信息可以存在里面。
對增長壞塊而言,它的出現會通過讀寫擦等操作反映出來。比如讀到UECC(Uncorrectable Error Correction Code,數據沒有辦法通過ECC糾錯恢復)、擦除失敗、寫失敗,這都是一個壞塊出現的癥狀。用戶應該把這些壞塊加入壞塊表,不再使用。SSD的存儲空間是閃存陣列,無論是Industrial M.2 SSD還是Industrial mini mSATA SSD一般都有幾個并行通道,每個通道上連接了若干個閃存,看下圖Agrade M.2 SSD,該SSD有四個通道,每個通道上掛了一個閃存Die。
SSD向四個Die 依次寫入。假設 Die 1上有個 Block B是壞塊,若固件采取壞塊略過策略,則寫完 Block A時,接下來便會跨過Block B寫到Die2的Block C上面去。
與略過策略不同,當某個Die上發現壞塊時,它會被該Die上的某個好塊替換。用戶在寫數據的時候,不是跨過這個Die,而是寫到替換塊上面去。采用此策略,除正常用戶使用的閃存塊,還需額外保 留一部分好的閃存塊,用于替換用戶空間的壞塊。整個Die上閃存塊就劃分為兩個區域:用戶空間和預留空間。
還是以上面的情況為例:用戶寫入數據時,當碰到壞塊B,它不會略過 Die1不寫,而是寫到Block B的替換者 Block B’上面去。采用替換策略,SSD內部需維護一張重映射表(Remap Table):壞塊到替換塊的映射,比如B→B’。當SSD需要訪問Block B時,它需要查找重映射表,實際訪問的物理Block應該是B’。
我們看看兩者策略的優劣 。
略過策略的劣勢在于性能不穩定。以4個Die為例,略過策略可能導致Die的并行度在1和4個Die之間,而替換策略并行度總是4個Die,毋庸置疑,前者性能表現不如后者。但替換策略有木桶效應,如果某個Die質量比較差,則整個SSD可用的閃存塊則受限于那個壞的Die。
注:本文來源于聯樂實業官網http://www.a4102.cn/,轉載請標明出處