1.
【Flash的硬件實現機制】
Flash全名叫做Flash Memory,屬於非易失性存儲設備(Non-volatile Memory Device),與此相對應的是易失性存儲設備(Volatile Memory Device)。關於什麼是非易失性/易失性,從名字中就可以看出,非易失性就是不容易丟失,數據存儲在這類設備中,即使斷電了,也不會丟失,這類設備,除了Flash,還有其他比較常見的入硬盤,ROM等,與此相對的,易失性就是斷電了,數據就丟失了,比如大家常用的內存,不論是以前的SDRAM,DDR SDRAM,還是現在的DDR2,DDR3等,都是斷電後,數據就沒了。
Flash的內部存儲是MOSFET,裏面有個懸浮門(Floating Gate),是真正存儲數據的單元。
在Flash之前,紫外線可擦除(uv-erasable)的EPROM,就已經採用用Floating Gate存儲數據這一技術了。
圖1.典型的Flash內存單元的物理結構
數據在Flash內存單元中是以電荷(electrical
charge)
【SLC和MLC的實現機制】
Nand Flash按照內部存儲數據單元的電壓的不同層次,也就是單個內存單元中,是存儲1位數據,還是多位數據,可以分爲SLC和MLC:
1.
單個存儲單元,只存儲一位數據,表示成1或0.
就是上面介紹的,對於數據的表示,單個存儲單元中內部所存儲電荷的電壓,和某個特定的閾值電壓Vth,相比,如果大於此Vth值,就是表示1,反之,小於Vth,就表示0.
對於nand Flash的數據的寫入1,就是控制External Gate去充電,使得存儲的電荷夠多,超過閾值Vth,就表示1了。而對於寫入0,就是將其放電,電荷減少到小於Vth,就表示0了。
關於爲何Nand Flash不能從0變成1,我的理解是,物理上來說,是可以實現每一位的,從0變成1的,但是實際上,對於實際的物理實現,出於效率的考慮,如果對於,每一個存儲單元都能單獨控制,即,0變成1就是,對每一個存儲單元單獨去充電,所需要的硬件實現就很複雜和昂貴,同時,所進行對塊擦除的操作,也就無法實現之前的,一閃而過的速度了,也就失去了Flash的衆多特性了。
2.
與SLC相對應,就是單個存儲單元,可以存儲多個位,比如2位,4位等。其實現機制,說起來比較簡單,就是,通過控制內部電荷的多少,分成多個閾值,通過控制裏面的電荷多少,而達到我們所需要的存儲成不同的數據。比如,假設輸入電壓是Vin=4V(實際沒有這樣的電壓,此處只是爲了舉例方便),那麼,可以設計出2的2次方=4個閾值,
對於讀取,則是通過對應的內部的電流(與Vth成反比),然後通過一系列解碼電路完成讀取,解析出所存儲的數據。這些具體的物理實現,都是有足夠精確的設備和技術,才能實現精確的數據寫入和讀出的。
單個存儲單元可以存儲2位數據的,稱作2的2次方=4
Level Cell,而不是2
Level Cell,這點,之前差點搞暈了。。。,同理,對於新出的單個存儲單元可以存儲4位數據的,稱作
【關於如何識別SLC還是MLC】
Nand Flash設計中,有個命令叫做Read ID,讀取ID,意思是讀取芯片的ID,就像大家的身份證一樣,這裏讀取的ID中,是讀取好幾個字節,一般最少是4個,新的芯片,支持5個甚至更多,從這些字節中,可以解析出很多相關的信息,比如此Nand Flash內部是幾個芯片(chip)所組成的,每個chip包含了幾片(Plane),每一片中的頁大小,塊大小,等等。在這些信息中,其中有一個,就是識別此flash是SLC還是MLC。下面這個就是最常見的Nand Flash的datasheet中所規定的,第3個字節,3rd byte,所表示的信息,其中就有SLC/MLC的識別信息:
|
Description |
I/O7 |
I/O6 |
I/O5 I/O4 |
I/O3 I/O2 |
I/O1 I/O0 |
Internal Chip Number |
1 2 4 8 |
|
|
|
|
0
0
1
1 |
Cell Type |
2 Level Cell 4 Level Cell 8 Level Cell 16 Level Cell |
|
|
|
0
0
1
1 |
|
Number of Simultaneously Programmed Pages |
1 2 4 8 |
|
|
0
0
1
1 |
|
|
Interleave Program Between multiple chips |
Not Support Support |
|
0 1 |
|
|
|
Cache Program |
Not Support Support |
0 1 |
|
|
|
|
表1.Nand
Flash
【Nand Flash的物理存儲單元的陣列組織結構】
Nand flash的內部組織結構,此處還是用圖來解釋,比較容易理解:
圖2.Nand Flash物理存儲單元的陣列組織結構
上圖是K9K8G08U0A的datasheet中的描述。
簡單解釋就是:
1.一個nand flash由很多個塊(Block)組成,塊的大小一般是128KB,256KB,512KB,此處是128KB。
2.每個塊裏面又包含了很多頁(page)。每個頁的大小,對於現在常見的nand flash多數是2KB,更新的nand flash是4KB,這類的,頁大小大於2KB的nand flash,被稱作big block,對應的發讀寫命令地址,一共5個週期(cycle),而老的nand flash,頁大小是256B,512B,這類的nand flash被稱作small block,。地址週期只有4個。
而塊,也是Nand Flash的擦除操作的基本/最小單位。
3.每一個頁,對應還有一塊區域,叫做空閒區域(spare
area)/冗餘區域(redundant
area),而Linux系統中,一般叫做OOB(Out
Of Band),這個區域,是最初基於Nand
Flash的硬件特性:數據在讀寫時候相對容易錯誤,所以爲了保證數據的正確性,必須要有對應的檢測和糾錯機制,此機制被叫做EDC(Error
Detection Co
頁是Nand Flash的寫入操作的基本/最小的單位。
【Nand Flash數據存儲單元的整體架構】
簡單說就是,常見的nand flash,內部只有一個chip,每個chip只有一個plane。
而有些複雜的,容量更大的nand flash,內部有多個chip,每個chip有多個plane。這類的nand flash,往往也有更加高級的功能,比如下面要介紹的Multi Plane Program和Interleave Page Program等。
比如,型號爲K9K8G08U0A這個芯片(chip),內部有兩個K9F4G08U0A,每個K9F4G08U0A包含了2個Plane,每個Plane是1Gb,所以K9F4G08U0A的大小是1Gb×2=2Gb=256MB,因此,K9K8G08U0A內部有2個K9F4G08U0A,即4個Plane,總大小是4×256MB=1GB。
而型號是K9WAG08U1A的nand flash,內部包含了2個K9K8G08U0A,所以,總容量是K9K8G08U0A的兩倍=1GB×2=2GB,類似地K9NBG08U5A,內部包含了4個K9K8G08U0A,總大小就是4×1GB=4GB。
【Flash名稱的由來】
Flash的擦除操作是以block塊爲單位的,與此相對應的是其他很多存儲設備,是以bit位爲最小讀取/寫入的單位,Flash是一次性地擦除整個塊:在發送一個擦除命令後,一次性地將一個block,常見的塊的大小是128KB/256KB。。,全部擦除爲1,也就是裏面的內容全部都是0xFF了,由於是一下子就擦除了,相對來說,擦除用的時間很短,可以用一閃而過來形容,所以,叫做Flash
Memory。中文有的翻譯爲
【Flash相對於普通設備的特殊性】
1.
一般設備,比如硬盤/內存,讀取和寫入都是以bit位爲單位,讀取一個bit的值,將某個值寫入對應的地址的位,都是可以按位操作的。
但是Flash由於物理特性,使得內部存儲的數據,只能從1變成0,這點,可以從前面的內部實現機制瞭解到,只是方便統一充電,不方便單獨的存儲單元去放電,所以才說,只能從1變成0,也就是釋放電荷。
所以,總結一下Flash的特殊性如下:
|
普通設備(硬盤/內存等) |
Flash |
讀取/寫入的叫法 |
讀取/寫入 |
讀取/編程(Program)① |
讀取/寫入的最小單位 |
Bit/位 |
Page/頁 |
擦除(Erase)操作的最小單位 |
Bit/位 |
Block/塊 |
擦除操作的含義 |
將數據刪除/全部寫入0 |
將整個塊都擦除成全是1,也就是裏面的數據都是0xFF |
對於寫操作 |
直接寫即可 |
在寫數據之前,要先擦除,然後再寫 |
表2.Flash和普通設備相比所具有的特殊性
注:
①
②
③在寫數據之前,要先擦除,內部就都變成0xFF了,然後才能寫入數據,也就是將對應位由1變成0。