norflash晶元內執行(XIP)

2022-09-18 11:12:17 字數 4508 閱讀 8053

為什麼程式不能直接在

nandflash

上執行?出於這個疑惑帶來了這篇博文,是我在網上找了很多資料後總結的,假如有誤,希望馬上指出來,免得我誤人子弟。

謝謝! 

首先認識下

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?

工作原理又是怎麼樣的?

xipexecute in place

execute

in place

,即晶元內執行,指應用程式可以直接在

flash

快閃儲存器內執行,不必再把**讀到系統

ram中。

flash

內執行是指

nor flash 

不需要初始化,可以直接在

flash

內執行**。但往往只執行部分**,比如初始化

ram.

(注:片內執行不是說程式在儲存器內執行哦,cpu

的基本功能就是取指、解碼和執行。norflash能在晶元內執行,就是指cpu的取指模組能夠直接從norflash中把指令取出來,供後面的解碼和執行模組使用)  

nandflash

器件使用複雜的

i/o口來序列地訪問資料,

8個引腳用來傳送控制、位址和資料資訊。由於時序較為複雜,所以一般

cpu最好整合

nand

控制器。另外由於

nandflash

沒有掛接在位址匯流排上,所以如果想用

nandflash

作為系統的啟動盤,就需要

cpu具備特殊的功能,如

s3c2440

在被選擇為

nandflash

啟動方式時會在上電時自動讀取

nandflash的4k

資料到位址0的

sram

中。如果

cpu不具備這種特殊功能,使用者不能直接執行

nandflash

上的**,那可以採取其他方式,比如好多使用

nandflash

的開發板除了使用

nandflash

以外,還用上了一塊小的

norflash

來執行啟動**。

但norflash

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

接著說為什麼

norflash

可以實現

xip,而

nandflash

就不可以???

解釋一:嵌入式系統中**的執行方式主要有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(

儲存和系統

解釋二:

兩種晶元的結構不同

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

可能無法連續正確地執行

.但只要你有額外的保障措施

,比如說在執行

code

之前去做一次

ecc校驗

,來確保

code

是連續正確的

.那你也可以做

xip. 

有人這麼做了

,而且也證明是成功的

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

容器 docker 內執行Nginx

容器內執行nginx其實很簡單,但是一開始還是浪費了我很多時間。這裡寫下來給大家省點時間。1 建立nginx資料夾,放置各種配置及日誌等。mkdir docker nginxdocker 資料夾是我存放所有基礎設施容器的地方。2 建立nginx配置檔案 cd docker nginx vim ngi...

執行期調整System property內容

出於一些特殊需求,比如需要執行期修改三方依賴的配置 第三方無法配合,或者拒絕配合 需要一種方案可以在第三方類在其靜態塊載入屬性前修改系統屬性,使得支援執行期動態調整。目前專案基於springboot2.x,但基於的原理1.x也可以支援。細節如下 包括 上下文已載入,未初始化 上下文已建立並準備完成,...

Docker 容器內執行 Dubbo 服務

原文 在使用 docker 容器內執行 dubbo 服務的時候乙個令人很頭痛的問題就是服務位址註冊。docker 容器內有自己的 ip 段,和宿主主機是隔離的,dubbo 會使用容器內的 ip 註冊到 zookeeper 註冊中心上。這樣其他的服務是無法訪問的。乙個很直接的方案就是直接使用 dock...