NAND flash 相關知識

目前絕大多數SSD都是以NAND FLASH爲存儲介質的。SSD工作原理很多都是基於NAND FLASH特性的。比如,NAND FLASH在寫之前必須先擦除,而不能覆蓋寫,於是SSD 才需要垃圾回收(Garbage Collection,或者叫 Recycle);NAND FLASH 每個塊(Block)擦寫次數達到一定值,這個塊就不能用了(數據丟失,或者寫入不了),所以SSD 固件必須做 Wear Leveling,讓數據平均寫在所有塊上,而不是盯着幾個塊拼命寫(不然沒幾天SSD就報廢了)。還有類似很多例子,SSD很多實現都是在爲NAND FLASH服務的。所以,欲攻SSD,NAND FLASH首當其衝。 NAND FLASH是一種非易失性存儲器,也就是說,掉電了,數據也不會丟失。NAND FLASH基本存儲單元 (Cell) 是一種類NMOS的雙層浮空柵 (Floating Gate) MOS管組成, 如下圖所示:

在源極(Source)和漏極(Drain)之間電流單向傳導的半導體上形成貯存電子的浮動柵(Floating Gate)。浮動柵包裹着一層硅氧化膜絕緣體。它的上面是在源極和漏極之間控制傳導電流的選擇/控制柵 (Control Gate)。裏面的電子不會因爲掉電而消失,所以NAND FLASH是非易失存儲器。

寫操作是在控制極加正電壓,使電子通過絕緣層進入浮柵極。擦除操作正好相反,是在襯底加正電壓,把電子從浮柵極中吸出來。如下圖所示:

一個存儲單元存儲1bit數據的NAND FLASH,我們叫它爲SLC (Single Level Cell),2bit爲MLC (Multiple Level Cell) ,3bit爲TLC (Triple Level Cell)。

對SLC來說,一個存儲單元存儲兩種狀態,浮柵極裏面的電子多於某個參考值的時候,我們把它採樣爲0,否則,就判爲1.

對MLC來說,一個存儲單元存儲四個狀態,一個存儲單元可以存儲2bit的數據。通俗來說就是把浮柵極裏面的電子個數進行一個劃分,比如低於10個電子,判爲0;11-20個電子,判爲1;21-30,判爲2;多於30個電子,判爲3.

依次類推TLC,它的一個存儲單元有8個狀態,可以存儲3bit的數據,它在MLC的基礎上對浮柵極裏面的電子數又進一步進行了劃分。

同樣面積的一個存儲單元,SLC,MLC和TLC,依次可以存儲1,2,3bit的數據,所以在同樣面積的LUN上,NAND FLASH容量依次變大。

但同時,一個存儲單元電子劃分的越多,那麼在寫入的時候,控制進入浮柵極的電子的個數就要越精細,所以寫耗費的時間就加長;同樣的,讀的時候,需要嘗試用不同的參考電壓去讀取,一定程度上加長讀取時間。所以我們會看到在性能上,TLC不如MLC,MLC不如SLC.

NAND FLASH就是由成千上萬這樣的存儲單元按照一定的組織結構組成的。

上圖是一個FLASH Block的組織架構。一個WordLine對應着一個或若干個Page,取決於SLC,MLC或者TLC。對SLC來說,一個WordLine對應一個Page;MLC則對應2個Page,這兩個Page是一對:Lower Page 和Upper Page;TLC對應3個Page。一個Page有多大,那麼WordLine上面就有多少個存儲單元(Cell),就有多少個Bitline。一個Block當中的所有這些存儲單元(Cell)都是共用一個襯底的。

一個NAND FLASH內部存儲組織結構是這樣的:一個Device有若干個DIE(或者叫LUN),每個DIE有若干個Plane,每個Plane有若干個Block,每個Block有若干個Page。每個Page對應着一個Wordline,由成千上萬個存儲單元構成。

DIE/LUN是接收和執行FLASH命令的基本單元。上圖中,LUN0和LUN1可以同時接收和執行不同的命令。但在一個LUN當中,一次只能執行一個命令,你不能對其中的某個Page寫的同時,又對其他Page進行讀訪問。

一個LUN又分爲若干個Plane,一般爲1個或者2個,現在也有4個Plane的NAND了。每個Plane都有自己獨立的Cache Register或者 Page Register,一般情況下,兩個Register內容都是一樣的,其大小等於一個Page的大小。Host在寫某個Page的時候,它是先把數據從Host傳輸到該Page所對應Plane的Cache Register當中,然後再把整個Cache Register當中的數據寫到NAND FLASH陣列;讀的時候類似,它先把這個Page的數據從FLASH陣列讀取到Page Register,然後再按需傳給host。這裏按需是什麼意思?就是我們讀取數據的時候,沒有必要把整個Page的數據都傳出來給Host,按需選擇數據傳輸。但要記住,無論是從FLASH 陣列讀數據到Page Register,還是把Page Register的數據寫入FLASH陣列,都是以Page爲單位!

我們通常所說的FLASH讀寫時間,是不包含數據從NAND與HOST之間的數據傳輸時間。FLASH寫入時間指是一個Page的數據從Cache Register 當中寫入到FLASH陣列的時間,FLASH讀取時間是指一個Page的數據從FLASH陣列讀取到Page Register的時間。對現在的MLC NAND FLASH來說,寫入時間一般爲幾百個微秒甚至幾毫秒,讀取時間爲幾十微秒。 NAND FLASH一般都支持Multi-Plane或者說Dual-Plane操作。那麼什麼是Dual-Plane操作呢?對寫來說,HOST先把數據寫入到上第一個Plane的Cache Register當中,數據hold在那裏,並不立即寫入到FLASH陣列,等HOST把同一個LUN上的另外一個或者幾個Plane上的數據傳輸到相應的Cache Register當中,再統一一起寫入FLASH陣列。假設寫入一個Page的時間爲1.5ms,一個Page的傳輸時間爲50us:如果按原始的Single Plane操作,寫兩個Page需要至少3ms+20us;但如果按照Dual-Plane操作,由於隱藏了一個Page的寫入時間,寫入兩個Page只要1.5ms+20us,縮減了幾乎一半的時間,寫入速度幾乎翻番。對讀來說,使用Dual-Plane操作,兩個不同Plane上的Page數據會在一個NAND讀取時間加載到各自的Page Register當中,這樣用一個讀取時間讀取到兩個Page的數據,讀取速度加快。考慮讀取時間和數據傳輸時間相當,假設都是50us,Single Plane讀取傳輸兩個Page需要50us*4=200us,Dual-Plane則需要50us*2+50us=150us,時間爲前者的75%,讀取速度也有大的提升。 NAND FLASH的擦除是以Block爲單位的。爲什麼呢?那是因爲在組織結構上,一個Block當中的所有存儲單元(Cell)是共用一個襯底的(Substrate)。當你對某襯底施加強電壓,那麼上面所有浮柵極的電子都被吸出來了。每個NAND Block都有擦寫次數的限制,當超過這個次數時,該Block可能就不能用了:浮柵極充不進電子(寫失敗),或者浮柵極的電子很容易就跑出來(比特翻轉,0->1),或者浮柵極裏面的電子跑不出來(擦除失敗)。這個最大擦寫次數按SLC,MLC,TLC依次遞減:SLC的擦寫次數可達十萬次,MLC一般爲幾千到幾萬,TLC降到幾百到幾千。隨着NAND FLASH工藝的不斷進步(現在已進入1Xnm時代),NAND FLASH容量不斷加大,但性能與可靠性卻在變差。要克服NAND FLASH的這些不利因素,對SSD固件算法帶來了更多更大的挑戰。 FLASH Block不一定要達到壽命纔不能用。一塊FLASH,剛出廠的時候就會有壞塊,這些壞塊叫出廠壞塊。有些廠商會在該Block的某幾個Page當中加入壞塊標記(如下圖所示),用戶在使用前,應該按照FLASH DATASHEET把這些壞塊挑出來建立壞塊表,避免以後使用這些壞塊。

也有一些FLASH廠商會直接告訴你哪些塊是出廠壞塊,這些信息存儲在FLASH的某個地方,用戶只需讀取這些信息即可,無需對整個FLASH的所有Block進行壞塊掃描。

用戶在時候過程中,一個Block,即使未達到最大使用壽命,也有可能變壞。FLASH是允許有一定的壞塊率的。質量好的FLASH,壞塊率是很小的;質量差的FLASH,壞塊產生頻繁。所以在挑選SSD的時候,儘量挑選知名主流的FLASH廠商生產的FLASH,質量有保證。

對MLC來說,擦除一個Block的時間大概是幾個毫秒。 NAND FLASH的讀寫則是以Page爲基本單元的。一個Page大小主要有4KB,8KB,16KB。對MLC或者TLC來說,寫一個Block當中的Page,應該順序寫:Page0,Page1,Page2,Page3,…;禁止隨機寫入,比如:Page2,Page3,Page5,Page0,…,這是不允許的。但對讀來說,沒有這個限制。SLC也沒有這個限制。 HOST是通過一系列FLASH命令與NAND通訊的。每個FLASH,都定義了其支持的命令,以MICRON 某型號的FLASH爲例,它定義瞭如下命令:

 

不同的FLASH,所支持的命令有所差異。用戶應該嚴格按照FLASH DATASHEET與FLASH通訊。 談談NAND FLASH的一些特點,或者說它作爲存儲介質面臨的挑戰。

1.Block具有一定的壽命,不是長生不老的。前面提到,當一個Block接近或者超出其最大擦寫次數時,導致存儲單元的永久性損傷,不能再使用。隨着NAND工藝不斷向前,這個擦寫次數也變得越來越小。

2.在NAND當中的存儲單元中,先天就有一些是壞掉的,或者說不穩定的。並且隨着NAND的不斷使用,壞的存儲單元越來越多。所以,用戶寫入到NAND的數據,必須有ECC保護,這樣即使其中的一些比特發生反轉,讀取的時候也能通過ECC糾正過來。一旦出錯的比特超過糾錯能力範圍,數據就丟失,對這樣的Block,我們應該廢棄不再使用。

3.FLASH先天有壞塊,也就是說有出廠壞塊。並且,用戶在使用的時候,也會新添壞塊,所以用戶在使用FLASH的時候,必須有壞塊管理機制。

4.讀干擾(Read Disturb)。什麼意思?從NAND讀取原理來看,當你讀取一個Page的時候,Block當中未被選取的Page控制極都會加一個正電壓,以保證未被選中的MOS管是導通的。這樣問題就來了,頻繁的在一個MOS管控制極加正電壓,就可能導致電子被吸進浮柵極,形成輕微的Program。從而最終導致比特翻轉。但是,這個不是永久性損傷,重新擦除Block還能正常使用。注意的是,Read Disturb影響的是同一個Block中的其它Page,而非讀取的Page本身。

5.寫干擾(Program Disturb)。除了Read Disturb會導致比特翻轉,Program Disturb也會導致比特翻轉。還是要回到FLASH內部的Program原理上來。

我們寫一個Page的時候,數據0和1混合的。由於對擦除過的Block,其所有的存儲單元初始值就 是1,所以Program的時候,只有寫0的時候才真正需要Program。如上圖所示,綠色的Cell是寫0,需要Program的,紅色的代表寫1,並不需要Program。我們這裏把綠色的Cell稱之爲Programmed Cells,紅色的Cell叫Stressed Cells。寫某個Page的時候,我們是在其 WordLine的控制極加一個正電壓(上圖是20V),對於Programmed Cells所在的String,它是接地的,不需要Program Cell所在的String,它是接一正電壓(上圖爲10V)。這樣最終產生的後果是,Stressed Cell也會被輕微Program。與Read Disturb不同的是,Program Disturb 影響的不僅是同一個Block當中的其它Page,自身Page也受影響。相同的是,都是不期望的輕微 Program導致比特翻轉,都非永久性損傷,經擦除後,Block還能再次使用。

6.電荷泄漏。存儲在NAND FLASH存儲單元的電荷,如果長期不使用,會發生電荷泄漏。不過這個時間比較長,一般十年左右。同樣是非永久性損傷,擦除後Block還能使用。 上面說的這些,是所有NAND面臨的問題,包括SLC,MLC和TLC。對MLC來說,又有其特有的 一些問題。

  1. 正如前面提到的,MLC最大擦寫次數變小。這樣,就更需要Wear Leveling技術來保證整個存儲介質的使用壽命。
  2. 對MLC來說,一個存儲單元存儲了兩個比特的數據,對應着兩個Page:Lower Page和Upper Page。假設Lower Page先寫,然後再寫Upper Page的過程中,由於改變了整個Cell的狀態,如果這個時候掉電,那麼之前寫入的Lower Page數據也丟失。一句話,寫一個Page失敗,可能會導致另外一個Page的數據損壞。
  3. 前面說到,不能隨機寫。不能先Program Upper Page,然後再Program Lower Page,這點就限制了我們不能隨意的寫。
  4. 寫Lower Page時間更短,寫Upper Page時間更長。所以會看到有些Page寫入速度快,有些Page寫入時間慢。讀取時間對Lower Page和Upper Page來說都差不多。

同樣是非永久性損傷,擦除後Block還能使用。 上面說的這些,是所有NAND面臨的問題,包括SLC,MLC和TLC。對MLC來說,又有其特有的 一些問題。

轉載自 http://www.ssdfans.com/?p=45

發佈了29 篇原創文章 · 獲贊 32 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章