NandFlash詳述
【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) 形式存儲的。存儲電荷的多少,取決於圖中的外部門(external gate)所被施加的電壓,其控制了是向存儲單元中衝入電荷還是使其釋放電荷。而數據的表示,以所存儲的電荷的電壓是否超過一個特定的閾值Vth來表示。
【SLC和MLC的實現機制】
Nand Flash按照內部存儲數據單元的電壓的不同層次,也就是單個內存單元中,是存儲1位數據,還是多位數據,可以分爲SLC和MLC:
1. SLC,Single Level Cell:
單個存儲單元,只存儲一位數據,表示成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. MLC,Multi Level Cell:
與SLC相對應,就是單個存儲單元,可以存儲多個位,比如2位,4位等。其實現機制,說起來比較簡單,就是,通過控制內部電荷的多少,分成多個閾值,通過控制裏面的電荷多少,而達到我們所需要的存儲成不同的數據。比如,假設輸入電壓是Vin=4V(實際沒有這樣的電壓,此處只是爲了舉例方便),那麼,可以設計出2的2次方=4個閾值, 1/4 的Vin=1V,2/4的Vin=2V,3/4的Vin=3V,Vin=4V,分別表示2位數據00,01,10,11,對於寫入數據,就是充電,通過控制內部的電荷的多少,對應表示不同的數據。
對於讀取,則是通過對應的內部的電流(與Vth成反比),然後通過一系列解碼電路完成讀取,解析出所存儲的數據。這些具體的物理實現,都是有足夠精確的設備和技術,才能實現精確的數據寫入和讀出的。
單個存儲單元可以存儲2位數據的,稱作2的2次方=4 Level Cell,而不是2 Level Cell,這點,之前差點搞暈了。。。,同理,對於新出的單個存儲單元可以存儲4位數據的,稱作 2的4次方=16 Level Cell。
【關於如何識別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 0 1 1 0 1 1 |
Cell Type |
2 Level Cell 4 Level Cell 8 Level Cell 16 Level Cell |
|
|
|
0 0 0 1 1 0 1 1 |
|
Number of Simultaneously Programmed Pages |
1 2 4 8 |
|
|
0 0 0 1 1 0 1 1 |
|
|
Interleave Program Between multiple chips |
Not Support Support |
|
0 1 |
|
|
|
Cache Program |
Not Support Support |
0 1 |
|
|
|
|
表1.Nand Flash 第3個ID的含義
【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 Code)/ECC(Error Code Correction, 或者 Error Checking and Correcting),所以設計了多餘的區域,用於放置數據的校驗值。
頁是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.上面提到過的,Flash最小操作單位,有些特殊。
一般設備,比如硬盤/內存,讀取和寫入都是以bit位爲單位,讀取一個bit的值,將某個值寫入對應的地址的位,都是可以按位操作的。
但是Flash由於物理特性,使得內部存儲的數據,只能從1變成0,這點,可以從前面的內部實現機制瞭解到,只是方便統一充電,不方便單獨的存儲單元去放電,所以才說,只能從1變成0,也就是釋放電荷。
所以,總結一下Flash的特殊性如下:
|
普通設備(硬盤/內存等) |
Flash |
讀取/寫入的叫法 |
讀取/寫入 |
讀取/編程(Program)① |
讀取/寫入的最小單位 |
Bit/位 |
Page/頁 |
擦除(Erase)操作的最小單位 |
Bit/位 |
Block/塊 ② |
擦除操作的含義 |
將數據刪除/全部寫入0 |
將整個塊都擦除成全是1,也就是裏面的數據都是0xFF ③ |
對於寫操作 |
直接寫即可 |
在寫數據之前,要先擦除,然後再寫 |
表2.Flash和普通設備相比所具有的特殊性
注:
① 之所以將寫操作叫做編程,是因爲,flash 和之前的EPROM,EEPROM繼承發展而來,而之前的EEPROM(Electrically Erasable Programmable Read-Only Memory),往裏面寫入數據,就叫做編程Program,之所以這麼稱呼,是因爲其對數據的寫入,是需要用電去擦除/寫入的,就叫做編程。
② 對於目前常見的頁大小是2K/4K的Nand Flash,其塊的大小有128KB/256KB/512KB等。而對於Nor Flash,常見的塊大小有64K/32K等。
③在寫數據之前,要先擦除,內部就都變成0xFF了,然後才能寫入數據,也就是將對應位由1變成0。
源自:http://blog.sina.com.cn/s/blog_76b0cde40102uwj1.html
相關文章:
NandFlash詳述 http://blog.163.com/starjj_embeded/blog/static/20450005120122170425898/
Nand Flash 關於Plane的補充http://blog.163.com/jiangh_1982/blog/static/1219505200901345759483/
NandFlash 壞塊 http://blog.chinaunix.net/uid-22597935-id-1772446.html
三星,海力士,鎂光nand flash命名規則http://blog.csdn.net/zjjyliuweijie/article/details/6409397
【詳解】如何編寫Linux下Nand Flash驅動
http://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html#nand_flash
(以上整理來源互聯網)