XIP技術與Flash


XIP技術與Flash

參考:

NOR Flash 和 NAND Flash

首先認識下nandflash和norflash。

NOR Flash 和 NAND Flash是現在市場上兩種主要的非易失閃存技術。

Intel於1988年首先開發出NOR Flash 技術,徹底改變了原先由EPROM(Electrically Programmable Read-Only-Memory電可編程序只讀存儲器)和EEPROM(電可擦只讀存儲器Electrically Erasable Programmable Read - Only Memory)一統天下的局面。

緊接着,1989年,東芝公司發表了NAND Flash 結構,強調降低每比特的成本,有更高的性能,並且像磁盤一樣可以通過接口輕松升級。

  • NOR Flash 的特點是芯片內執行(XIP ,eXecute In Place),這樣應用程序可以直接在Flash閃存內運行,不必再把代碼讀到系統RAM中。NOR 的傳輸效率很高,在1~4MB的小容量時具有很高的成本效益,但是很低的寫入和擦除速度大大影響到它的性能。
  • NAND的結構能提供極高的單元密度,可以達到高存儲密度,並且寫入和擦除的速度也很快。應用NAND的困難在於Flash的管理和需要特殊的系統接口。通常讀取NOR的速度比NAND稍快一些,而NAND的寫入速度比NOR快很多。

程序能直接在norlash執行的原因在XIP。

那什么是XIP?工作原理又是怎么樣的?

XIP:eXecute In Place

eXecute In Place,即芯片內執行,指應用程序可以直接在flash閃存內運行,不必再把代碼讀到系統RAM中。

flash內執行是指nor flash 不需要初始化,可以直接在flash內執行代碼。但往往只執行部分代碼,比如初始化RAM.

(注:片內執行不是說程序在存儲器內執行哦,CPU的基本功能就是取指、譯碼和執行。norflash能在芯片內執行,就是指CPU的取指模塊能夠直接從norflash中把指令取出來,供后面的譯碼和執行模塊使用)

Nand-Flash

NandFlash器件使用復雜的I/O口來串行地存取數據,8個引腳用來傳送控制、地址和數據信息。由於時序較為復雜,所以一般CPU最好集成NAND控制器。

另外由於NandFlash沒有掛接在地址總線上,所以如果想用NandFlash作為系統的啟動盤,就需要CPU具備特殊的功能,如s3c2440在被選擇為NandFlash啟動方式時會在上電時自動讀取NandFlash的4k數據到地址0的SRAM中。

如果CPU不具備這種特殊功能,用戶不能直接運行NandFlash上的代碼,那可以采取其他方式,比如好多使用NandFlash的開發板除了使用NandFlash以外,還用上了一塊小的NorFlash來運行啟動代碼。

Nor-Flash

但norflash就不用了,因為它是片內執行的,區別如圖:

為什么nandflash很少用來做XIP?

接着說為什么norflash可以實現XIP,而不是nandflash?

解釋1: 嵌入式系統中代碼的執行方式不同

嵌入式系統中代碼的執行方式主要有3種:

  • 完全映射(fully shadowed):嵌入式系統程序運行時,將所有的代碼從非易失存儲器(Flash、ROM等)復制到RAM中運行。
  • 按需分頁(demand paging):只復制部分代碼到RAM中。這種方法對RAM中的頁進行導入/導出管理,如果訪問位於虛存中但不在物理RAM中會產生頁錯誤,這時才將代碼和數據映射到RAM中。
  • eXecute In Place (XIP):在系統啟動時,不將代碼復制到RAM,而是直接在非易失性存儲位置執行。RAM中只存放需要不斷變化的數據部分,如圖1所示。

如果非易失性存儲器的讀取速度與RAM相近,則XIP可以節省復制和解壓的時間。NOR Flash和ROM的讀取速度比較快(約100 ns),適合XIP;而NAND Flash的讀操作是基於扇區的,速度相對很慢(μs級),因此不宜實現XIP系統。而NAND

閃存寫入速度比NOR快,更適合SND(存儲和下載)系統。

解釋2:各flash芯片結構不同

NOR flash之所以可以片內執行,就是因為他符合CPU去指令譯碼執行的要求。CPU送一個地址出來,NORflash就能給一個數據讓CPU執行,中間不需要額外的處理操作。

NAND flash不一樣是因為nand flash有地址,數據,命令共用IO口的問題,cpu把地址發出來之后,並不能直接得到數據,還需要控制線的操作才能完成。就是他沒有專用的SRAM接口。

解釋3:工藝要求不同

芯片內執行主要是是看芯片可不可以線性存儲代碼(假如硬件支持芯片接口),只要能保證芯片的存儲空間是線性的(也就是無壞塊),都可以片上執行。

在讀取Flash時候,容易出現“位翻轉(bitconvert)。

在Flash的位翻轉(一個bit位發生翻轉)現象上,NAND的出現幾率要比NorFlash大得多。

這個問題在Flash存儲關鍵文件時是致命的,所以在使用NandFlash時建議同時使用EDC/ECC等校驗算法。 ”

凡是NAND型Flash都繞不開壞塊(Bad Block)問題,這也是NAND Flash區別於NOR Flash的一個重要特點。

NAND技術上允許壞塊的存在,這降低了NAND生產工藝要求,因此NAND單位容量價格比NOR低。

NAND內部按粒度從大到小划分依次為Plane、Block、Page、Byte(如下圖所示),因為壞塊導致了一些Block無法有效存儲數據,這些Block會被標記拉黑,所以從主設備訪問角度來看,NAND中的數據並不是按地址連續存儲的,壞塊占據的地址均為無效地址,這就是所謂的非線性存儲,而非線性存儲設備顯然無法作為XiP設備。

非線性存儲器,對於寫入操作,無法保證應用程序一定放在指定鏈接的地址(即在Flash中的對應偏移地址),寫入過程中遇到壞塊,會跳過壞塊,而那些壞塊占據的無效地址極有可能就是應用程序實際鏈接地址。

強行ECC校驗導致的Page Read等待

我們現在假設一種理想情況,NAND中不存在任何壞塊,可以強行把NAND當作線性存儲設備,這種情況下是不是就可以被用作XiP設備了呢?

我們來看串行NAND的完整讀時序,0x13(Page Read)是FLASH控制器發送的第一個命令,用於通知NAND主設備想要訪問Page了,隨后發送列地址,指明要讀的Page位置,此時NAND便會將內部狀態寄存器里Busy位標志起來並進入忙狀態。

在忙狀態時間里,NAND會從內存塊里將指定的Page數據全部拷貝到臨時緩存區(Cache memory),對這一整個Page數據進行ECC校驗,校驗完成后將狀態寄存器里相應ECC標志起來以及將Busy位清除掉,然后結束忙狀態,進入數據輸出准備狀態。

由於不知道NAND什么時候會結束忙狀態,因此FLASH控制器需要不斷發送0x0F(Get Feature命令)去讀取狀態寄存器的值,直到狀態寄存器里Busy位被清零才能去讀取Page數據,這種邏輯判斷行為在lookupTable里無法自動實現(NOR讀時序里無需邏輯判斷)。

如果特意省略讀狀態寄存器的步驟,避免邏輯判斷行為,在lookupTable直接填入Dummy周期來代替行不行呢?理論上倒是可以的。我們來算一下,比如NAND典型的50MHz時鍾頻率,一個Dummy Cycle周期耗時20ns,NAND Page Read等待典型值是45us,即2250個Dummy Cycle,lookupTable有16條Sequence,每個Seqence支持8個instruction,每個instruction如果都設為CMD_SDR,參數設最大255,則9個instruction就能滿足這個等待時間。

但即使這么做能勉強實現NAND Flash的XiP,代碼實際執行效率也是非常低下的,畢竟涉及到跨Page的指令長跳轉(暫不討論Cache因素)就需要等待45us,這在嵌入式世界里是不短的時間,系統實時性無法保證,又有什么意義呢?

結論

所謂XIP,就是CODE是在FLASH上直接運行,NANDFLASH只是不適合做XIP,但並不是不能做XIP。

要一段CODE能夠正確的運行,要保證它的CODE是連續的,正確的。

由於一些電氣特性的原因,NOR FLASH能夠做到這一點,不存在壞道或壞塊,所以能夠做XIP。

而對於NAND FLASH, 它只保證它的BLOCK 0是好的,其他的塊並不保證,雖然出錯的幾率比較低,但還是有出錯的可能,所以CODE可能無法連續正確地執行。

但只要你有額外的保障措施,比如說在執行CODE之前去做一次ECC校驗,來確保CODE是連續正確的,那也可以做XIP。有人這么做了,而且也證明是成功的。但效率很低,無法接受。

個人認為解釋3是主要原因,其他的是次要原因。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM