為什麼程式不能直接在
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...