天天看點

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管組成, 如下圖所示:

NAND flash 相關知識

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

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

NAND flash 相關知識

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

對SLC來說,一個存儲單元存儲兩種狀态,浮栅極裡面的電子多于某個參考值的時候,我們把它采樣為0,否則,就判為1.

NAND flash 相關知識

對MLC來說,一個存儲單元存儲四個狀态,一個存儲單元可以存儲2bit的資料。通俗來說就是把浮栅極裡面的電子個數進行一個劃分,比如低于10個電子,判為0;11-20個電子,判為1;21-30,判為2;多于30個電子,判為3.

NAND flash 相關知識

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

NAND flash 相關知識

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

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

NAND flash 相關知識

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

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,由成千上萬個存儲單元構成。

NAND flash 相關知識

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為機關!

NAND flash 相關知識

我們通常所說的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把這些壞塊挑出來建立壞塊表,避免以後使用這些壞塊。

NAND flash 相關知識

也有一些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為例,它定義了如下指令:

NAND flash 相關知識
NAND flash 相關知識

不同的FLASH,所支援的指令有所差異。使用者應該嚴格按照FLASH DATASHEET與FLASH通訊。 談談NAND FLASH的一些特點,或者說它作為存儲媒體面臨的挑戰。

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

NAND flash 相關知識

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

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

NAND flash 相關知識

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

NAND flash 相關知識

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

繼續閱讀