一.基本概念
Flash Memory中文名字叫閃存,是一種長壽命的非易失性(Non-volatile Memory Device,在斷電情況下仍能保持所存儲的數據信息)的存儲器。閃存按功能特性可分為兩種,一種是NOR Flash,以編碼應用為主,其功能多與運算相關;另一種為NAND Flash,主要功能是存儲資料,如固態硬盤中所用的顆粒。
二.存儲結構
NAND Flash由block(中文稱為“塊”)構成,block的基本單元是page(中文成為“頁”)。通常來說,每一個block由多個page組成。NAND Flash每一個page內包含Data area(數據存儲區)。每一個page內包含有一個擴展的Spare area(備用區)。所以每一個page的大小為Data area+Spare area。
NAND Flash結構示意圖
三.讀取和寫入
NAND Flash的讀寫以page為單位,在寫入前(在這里稱之為編程),需要先擦除,擦除以block為單位,這些操作都會減少器件的壽命。由於NAND Flash的這種特性,使得它在編程時帶來了寫放大的副作用,並且管理算法更復雜,例如需要垃圾回收算法。所以一般我們對NAND Flash編程的步驟是,先把其中的有效數據page搬移到內存或者其他block中,然后擦除這個block,再把有效數據和新數據寫回去。這個過程造成了多余的寫入和擦除,這就是所謂的寫放大。
四.壞塊管理
Bad block(中文成為壞塊)指的是這個器件中一些不能正常工作的block,有的是出廠的時候就存在了,有的是使用壽命到了從好塊轉變而來的,成為新增壞塊。由於工藝和成本的限制,標准規范中出廠時器件是允許存在bad block的,只要它的容量小於總容量的2%就是允許的,這些被稱之為原始壞塊。這些原始壞塊會被廠商檢測出來並且做好標記,壞塊數量符合標准的便可以當作good die出售,不符合標准的被標上標記,稱之為ink die。ink die一般不太穩定,一般被買去做低端的產品,如山寨U盤。NAND Flash使用前,會進行全盤掃描,把壞塊檢測出來生成一張表,稱之為壞塊表,用於記錄原始壞塊,后續可以用來記錄新增壞塊。
五.使用壽命
NAND flash的每一次讀寫擦都會對減少自身的壽命。為了提高容量降低成本,NAND Flash從最初的SLC,向MLC,TLC還有QLC演變,單元存儲密度從1bit,向2bit,3bit和nbit遞增,但是擦寫次數卻不斷遞減,從100000次,向5000和1000次遞減。如果一個block壽命到了,寫入這個block的數據就會出現無法處理的bit反轉,這個block就不能再被使用了,需要管理算法使用保留的好塊去把這個新增壞塊替換下來,如果保留的好塊使用完了,那么就不能再往里面寫入數據了。所以管理算法需要具有平衡磨損模塊,用於記錄每個block的擦寫次數,盡量保證每個block的擦寫次數基本持平,從而提高整個器件的使用壽命。順便說一下,當一個器件被使用了很久以后,清空平衡磨損表重新建立,每個block的磨損壽命信息就已經丟失,這時候再使用這個器件就非常危險,因為可能某個block的磨損度已經很高了,但是卻沒有被記錄下來,這個block會突然出現無法處理的數據出錯。
六.產品與量產
NAND Flash一般不單獨使用,需要和專用控制器搭配組成一個系統。目前常見的使用NAND Flash的產品主要有固態硬盤(SSD),eMMC,SD記憶卡,U盤等。其中SSD和eMMC穩定性和性能要求比較高,一般需要使用品質優良的NAND Flash。以SSD來說明生產過程,其他產品流程類似。首先是量產,接着是檢測,合格后便可以作為正式產品出售。量產:①檢測NAND Flash和主控型號,找出對應的固件包和配置信息。②加載代碼到主控,啟動掃描flash流程。掃描完成后讀回壞塊表。③根據配置生成參數,和固件數據一起按照主控要求寫入NAND flash中。④啟動固件,並做基本的量產參數檢測,量產完成。檢測:①讀取設備固件數據信息。②把固件數據和設置的做匹配。