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