
eXecute In Place,即芯片內執行,是指CPU直接從存儲器中讀取程序代碼執行,而不用再讀到內存中。
應用程序可以直接在flash閃存內運行,不必再把代碼讀到系統RAM中。
flash 內執行是指 nor flash 不需要初始化,可以直接在flash內執行代碼。但往往只執行部分代碼,比如初始化RAM。好處即是程序代碼無需占用內存,減少內存的要求。
所謂片內執行不是說程序在存儲器內執行,CPU的基本功能是取指、譯碼、運行。Nor Flash 能在芯片內執行,指的是CPU能夠直接從Nor flash中取指令,供后面的譯碼器和執行器來使用。
為實現就地執行,必須滿足幾個條件:
存儲器必須提供與內存相似的接口給 CPU。
該接口必須提供足夠快的讀取操作,并具有隨機訪問模式。
如有文件系統,則需要提供合適的映射功能。
程序鏈接時需要知道存儲器的地址或地址與位置無關。
程序不能修改已加載映像中的數據。
NOR Flash和 EEPROM 通常能滿足上述要求。
(1) CPU控制器支持:
而按照通常的理解,要能夠實現XIP,Flash 應該是并行總線接口掛在 AMBA 總線上,這個并行總線應有獨立的地址線和數據線,且地址線寬度跟Flash大小相對應,類似于DDR或SRAM總線。
那么SPI NorFlash為什么能實現XIP,答案就是 FlexSPI 外設,也就是說需要CPU具備特殊的SPI控制,該控制器實現了串行flash總線到并行總線的轉換。
為了提升性能控制器內部可以集成類似cache功能的buffer。下圖所示為某款CPU的支持XIP的SPI控制器邏輯拓撲。

(2)SPI Nor Flash支持
以下文字摘自某款芯片手冊:
XIP mode requires only an address (no instruction) to output data, improving random access time and eliminating the need to shadow code onto RAM for fast execution。
大體的意思是:
XIP 模式只需要一個地址(無指令)就可以輸出數據,從而提高了隨機存取時間。
無指令,這是和普通模式的最大區別,XIP 模式下 flash 能賣滿足一個輸入地址一個輸出數據要求。以下是XIP模式下的時序圖。

系統引導時的XIP
通常,第一階段的引導程序是一個XIP程序,它鏈接時指定從flash芯片上電后的映射地址開始運行,設置系統RAM,把第二階段的引導程序或操作系統內核加載進RAM。
在這初始化期間,可寫存儲器可能不可用,所有的計算都必須在處理器寄存器中執行。因此,第一階段的引導程序通常以匯編語言編寫,提供盡量少的功能,只為下一階段程序的提供正常的執行環境。
有些處理器也能通過嵌入少量SRAM或允許將 Cache 用作RAM來允許用高級語言編寫這些程序。
對于內核和引導程序,地址空間通常是內部分配的。為了使用XIP,需要指示鏈接程序將不可修改的數據和可修改數據放在不同的地址區間,并提供將可修改數據復制到可寫內存的機制,使得任何程序正常訪問這些數據。
如果地址空間是外部分配的,比如不提供虛擬內存的系統,編譯器需要通過向數據區域的私有副本的指針添加偏移量來訪問所有可修改的數據。在這種情況下,外部加載程序負責設置實例特定的內存區域。
主內存初始化之前,BIOS 和 UEFI 使用 XIP 技術。
文件系統的XIP
文件系統的XIP通常難以滿足。在沒有頁表的系統中,整個文件必須連續存儲,不能碎片化,而基于閃存的文件系統通常會將數據分配到擦除周期最小,磨損最少的扇區,以延長生命周期。
復雜性和速度的折中意味著XIP通常僅用于第一階段引導程序或RAM極度短缺的情況。例如,第二代至第四代的視頻游戲機如Atari 2600將ROM卡帶的地址和數據總線連接到游戲機的地址和數據總線,從而能在只有128字節的RAM上。
AXFS(高級XIP文件系統,Advanced XIP File System)是Linux系統上一種較新的文件系統,旨在克服與XIP相關的,特別是在 XIP 用戶空間應用程序方面的某些缺點。例如,可以將可執行的二進制文件拆分為“ XIP區域”,從而避免了上面提到的碎片限制。
這兩種種 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快很多。
這樣我們就知道程序能直接在 Nor flash 中執行的原因就是 XIP。
Nand Flash 器件的 IO 口比較少,通過串行地進行讀寫數據,硬件接口少了,勢必會帶來復雜的軟件成本,一般使用8個引腳來進行傳輸控制、地址和數據信息,由于時序非常復雜,所以一般 CPU 最好集成NAND控制器,另外由于Nand flash沒有掛接在地址總線上,所以如果想用Nand flash作為系統的啟動盤,就需要CPU具備特殊的功能,比如s3c2440在被選擇為NandFlash啟動方式時會在上電時自動讀取NandFlash的4k數據到地址0的SRAM中。
如果CPU不具備這種特殊功能,用戶不能直接運行 NandFlash 上的代碼,因為使用 Nand Flash 必須要各種初始化,復雜邏輯。
Nor Flash能夠在片內執行,Nand Flash不能,區別如下圖:

這張圖很直觀,但是需要用心看,左邊是普通的flash,可以理解成是Nand Flash,CPU想要從Nand Flash中讀取數據,必須要先通過在RAM中計算地址,各種時序計算,然后通過MMU轉換地址,然后給Nand flash發送命令,注意是命令,不是地址,Nand Flash根據命令進行相應的操作,如果是讀命令,則返回對應地址的數據到RAM中,如果是寫命令,則進行寫操作。
而右邊的圖,是針對Nor Flash的,這個很明顯,CPU可以像讀內存一樣,直接跟Nor flash交互,即可以直接從Nor Flash中取指令,然后交給譯碼模塊和執行模塊進行執行,可以說,相比較Nand flash,Nor flash的操作對于CPU來說,簡直就像是面對面一樣。
解釋一:嵌入式系統中代碼的執行方式主要有3種:
(1)完全映射:嵌入式系統程序運行時,將所有代碼從非易失存儲器(Flash、ROM等)復制到RAM中運行。
(2)按需分頁:只復制部分代碼到RAM中,這種方法對RAM中的頁進行導入/導出管理,如果訪問位于虛存中但不在物理RAM中會產生頁錯位,這時才將代碼和數據映射到RAM中。
(3)XIP:在系統啟動時,不將代碼復制到RAM,而是直接在非易失性存儲位置執行,RAM中只存放需要不斷變化的數據部分,如下圖所示:

如果非易失性存儲器(Flash)的讀取速度與RAM相近,則XIP可以節省復制和解壓的時間,Nor flash和rom的讀取速度比較看(約100ns),比較適合XIP,而Nand flash的讀取操作是基于扇區的,速度相對很慢(us級),因此不適合實現XIP系統,不過Nand flash的寫速度比Nor的快,更適合做存儲和下載系統。
解釋二:兩種芯片的結構不同
NOR flash之所以可以片內執行,就是因為他符合CPU去指令譯碼執行的要求。CPU送一個地址出來,NORflash就能給一個數據讓CPU執行,中間不需要額外的處理操作。
NAND flash不一樣是因為nand flash有地址,數據,命令共用IO口的問題,cpu把地址發出來之后,并不能直接得到數據,還需要控制線的操作才能完成。就是他沒有專用的SRAM接口。
解釋三:芯片內執行主要是是看芯片可不可以線性存儲代碼(假如硬件支持芯片接口),只要能保證芯片的存儲空間是線性的(也就是無壞塊),都可以片上執行
在讀取Flash時候,容易出現位翻轉(bitconvert):在Flash的位翻轉(一個bit位發生翻轉)現象上,NAND的出現幾率要比NorFlash大得多。
這個問題在Flash存儲關鍵文件時是致命的,所以在使用NandFlash時建議同時使用EDC/ECC等校驗算法。但是,如果能保證不出錯,也還是可以進行XIP,可以在其上執行代碼的:
“所謂XIP,就是CODE是在FLASH上直接運行. NANDFLASH只是不適合做XIP,但并不是不能做XIP“
要一段CODE能夠正確的運行,要保證它的CODE是連續的,正確的。
由于一些電氣特性的原因,NOR FLASH能夠做到這一點,不存在壞道或壞塊,所以能夠做XIP。而對于NAND FLASH, 它只保證它的BLOCK 0是好的,其他的塊并不保證,雖然出錯的幾率比較低,但還是有出錯的可能,所以CODE可能無法連續正確地執行。
文章來源于網絡,版權歸原作者所有,如有侵權,請聯系刪除。

關注【一起學嵌入式】,回復“加群”進技術交流群
覺得文章不錯,點擊“分享”、“贊”、“在看” 唄