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