天天看點

Flash原理介紹

硬體特性:

【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

1
Cache Program

Not Support

Support

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。