這個(gè)概念在大概14年前第一次接觸,當(dāng)時(shí)本科的專業(yè)并不是計(jì)算機(jī),記得當(dāng)時(shí)坐在圖書館里抱著一本書硬啃,一直想把這個(gè)概念弄清楚。
費(fèi)盡力氣卻仍然似是而非,似懂非懂,因此挫敗感很大;后來讀研后,方向一直不在這里,也沒有再去看,但是當(dāng)時(shí)抱著一本書“深入理解計(jì)算機(jī)系統(tǒng)”看了好多年,斷斷續(xù)續(xù),仍然覺得沒有真正理解。
后來工作后,一頭扎在了各種小型芯片的設(shè)計(jì)中,各種ip的設(shè)計(jì),各種SoC層面的調(diào)度調(diào)式,CPU性能加速優(yōu)化,和模擬的各種掰扯,和軟件一起定位各種奇怪的問題,因?yàn)閿?shù)字系統(tǒng)比較小,距離“虛擬存儲(chǔ)器”更加遙遠(yuǎn)了;后來又做了一個(gè)中型的系統(tǒng),說是中型,也就是大幾百萬門的系統(tǒng),但是在和軟件的各種扯皮中,確實(shí)看到了復(fù)雜系統(tǒng)軟件健壯性的嚴(yán)峻挑戰(zhàn),定位問題的困難程度,可是仍然沒有接觸“虛擬存儲(chǔ)器”;再后來,終于看到了真正的大系統(tǒng),正經(jīng)的正在做的芯片中使用了“虛擬存儲(chǔ)器”的概念。
終于,14年后,可以來談這個(gè)問題了。
看看沒有虛擬地址的處理器是怎么工作的,編譯環(huán)境除了將高級(jí)語言轉(zhuǎn)換成機(jī)器碼外,linker把眾多分散開發(fā)文件串起來,使得增量編譯
成為可能;同時(shí)loader就要考慮把多個(gè)獨(dú)立程序安排地址空間,例如操作系統(tǒng),視頻驅(qū)動(dòng),display驅(qū)動(dòng),IO驅(qū)動(dòng),wifi驅(qū)動(dòng)等。
他們存儲(chǔ)在nor-flash or nand flash等NVM中。注意這些程序大部分會(huì)使用相對(duì)的地址尋址(或長(zhǎng)或短,提高存儲(chǔ)密度必然要求),也有少量絕對(duì)跳轉(zhuǎn)地址,
這些絕對(duì)跳轉(zhuǎn)必須由loader(在這個(gè)語境下還是指 IDM PC環(huán)境)了解整個(gè)地址劃分,最后根據(jù)情況修改這些絕對(duì)跳轉(zhuǎn)地址;
然后程序開始執(zhí)行時(shí),操作系統(tǒng)先初始化,然后加載各個(gè)進(jìn)程;
1. 指令
只是cache,不區(qū)分是誰的操作系統(tǒng)指令 or 進(jìn)程指令;
但如果要卸載某個(gè)程序,或者update,只能重新編譯,linker and loader;但這對(duì)于大型系統(tǒng)來說是不可接接受的;
因?yàn)榧偈鼓硞€(gè)程序卸載后,update后的程序比原來大,原來連續(xù)的地址空間不夠用了,只能看看哪里還有空缺
- 用不連續(xù)的兩塊nor flash區(qū)域拼接;
但是complier會(huì)很痛苦,因?yàn)閷?shí)際可能遠(yuǎn)遠(yuǎn)不止2塊不連續(xù),要處理address remap問題,即使是相對(duì)分支跳轉(zhuǎn)指令;
- 或者干脆找一塊足夠大的區(qū)域,導(dǎo)致內(nèi)存碎片,利用率不高;
note:當(dāng)然處理器不會(huì)關(guān)心這些復(fù)雜的事情,它只傻傻的執(zhí)行每一條指令規(guī)定的行為。
如果系統(tǒng)沒有cache,這些指令直接就流進(jìn)處理器;
如果系統(tǒng)有cache,它也傻傻的根據(jù)這些物理地址,一定的算法,例如LRU來管理高速緩存,因此對(duì)cache沒什么影響;
ps:注意支持虛擬存儲(chǔ)器與否,對(duì)cache沒什么影響;
2. 數(shù)據(jù)
這里的數(shù)據(jù)專指程序執(zhí)行過程產(chǎn)生的臨時(shí)數(shù)據(jù),存儲(chǔ)在片上sram,or DDR中,而不是只一開始就存儲(chǔ)在nor flash中的literal data
-------------------------------------------------------
系統(tǒng)如果沒有d-cache(只有片上sram),且沒有操作系統(tǒng):所有全局變量,靜態(tài)變量,全部由編譯器分配好,稱之為heap,然后分配一塊向下生長(zhǎng)的空間作為stack,編譯器會(huì)根據(jù)某種算法估計(jì)要給stack開辟多少空間,例如這個(gè)程序就是一個(gè)大的while(1) {}, 在結(jié)尾處wfi進(jìn)入休眠,由中斷驅(qū)動(dòng),
編譯器會(huì)計(jì)算最深的函數(shù)調(diào)用(stack向下生長(zhǎng)最長(zhǎng)) + 在這種情況下發(fā)生中斷保存現(xiàn)場(chǎng)stack需要;
但如果有“遞歸調(diào)用”則是另外一回事,編譯器可能并不知道實(shí)際工作情況,自然無法準(zhǔn)確預(yù)估stack需要;
--------------------------------------------------------
系統(tǒng)如果沒有d-cache(只有片上sram),有操作系統(tǒng):因?yàn)椴僮飨到y(tǒng)有內(nèi)存管理功能,一般programmer編程不當(dāng)(內(nèi)存要及時(shí)free),會(huì)造成內(nèi)存泄露,這個(gè)和無操作系統(tǒng)場(chǎng)景不同;當(dāng)然也可能純粹應(yīng)用需要的太多,系統(tǒng)能力有限支持不了;
--------------------------------------------------------
系統(tǒng)有d-cache(只有片上sram),有操作系統(tǒng):和上一種區(qū)別不大,d-cache也是無腦工作,并不需要知道加載的到底是heap or stack,或者什么變量;
--------------------------------------------------------
問題:那么加入虛擬存儲(chǔ)器會(huì) make a difference ?對(duì)編譯器沒什么影響,但是對(duì)系統(tǒng)卻有很大的影響。
分析:對(duì)于小型系統(tǒng)來說,各個(gè)程序系統(tǒng)開發(fā)者可以把關(guān),并進(jìn)行測(cè)試保證系統(tǒng)穩(wěn)定性;
但對(duì)于大型系統(tǒng)來說,程序及其龐雜,開發(fā)者眾多,開發(fā)者水平不一;有第三方開發(fā)的軟件需要安裝,甚至有些有些惡意軟件要攻擊別的軟件;即某個(gè)程序可能異常可能會(huì)造成系統(tǒng)崩潰,或信息泄露,不管有意還是無意,最終導(dǎo)致這個(gè)后果。
審核編輯:黃飛
-
處理器
+關(guān)注
關(guān)注
68文章
19920瀏覽量
235670 -
cpu
+關(guān)注
關(guān)注
68文章
11088瀏覽量
217296 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
7163瀏覽量
125732 -
虛擬存儲(chǔ)器
+關(guān)注
關(guān)注
0文章
12瀏覽量
8884 -
編譯器
+關(guān)注
關(guān)注
1文章
1663瀏覽量
50279
發(fā)布評(píng)論請(qǐng)先 登錄
探討一下ARM中的MMU虛擬地址
ARM處理器使用虛擬地址來提供cache index和cache tag
用戶態(tài)得到虛擬地址對(duì)應(yīng)的物理地址

鴻蒙內(nèi)核中虛擬地址與物理地址之間是如何映射的

內(nèi)核邏輯地址和內(nèi)核虛擬地址到底有什么區(qū)別
虛擬地址和邏輯地址的區(qū)別是什么?

虛擬地址物理地址等眾多地址及MMU相關(guān)知識(shí)

為什么要用MMU?為什么要用虛擬地址?
虛擬地址翻譯物理地址的流程有哪些呢?

Linux系統(tǒng)為什么需要引入虛擬地址

Linux虛擬地址空間和物理地址空間的關(guān)系

評(píng)論