為什麼CPU都選擇了使用mmu來實現程序間位址隔離,而不是使用相對位址鏈結的方式?

時間 2021-06-01 09:17:09

1樓:冒泡

相對位址的話,你是指乙個程序的乙個內部位址x對映到物理記憶體位址是用x+a的方式麼,其中a是程序在記憶體中的起始位址

這樣做有個問題,你啟動乙個程序的時候os得給你安排[a,a+len]這段記憶體,這個len不好確定,因為不知道你要用到多少,假設len給你100M,那麼a+len的位置可能已經分配給另乙個新開的程序,那麼你的程式如果申請需要100M以上就沒法安排了

2樓:

我來猜一下題主的意思,題主可能是問為什麼全域性變數用絕對位址訪問而不用相對位址訪問?這是乙個編譯器實現的問題。但題主把cpu的虛擬記憶體機制中的相對位址絕對位址概念和編譯器中的相對位址絕對位址概念搞混淆了,所以問題問的有點不太容易理解。

我覺得對全域性變數訪問用絕對位址(加重定位表)的方式主要從效率考慮。因為模組每次載入的位址可能不一樣,所以全域性變數的位址也會隨著模組的位置變化。

一種方案是每次使用全域性變數時,動態獲取當前模組的位址,再加上固定偏移。一種方案是啟動的時候檢查模組是否載入在預設的位置,如果在就什麼都不用做。如果不在,則將重定位表中所有的項重定位。

訪問的時候絕對位址就是想要的位址。

第一種方案至少需要兩條指令,而第二種方案只用一條指令,顯然第二種執行效率更高。所以編譯器主要使用後一種方案。

3樓:Autumn-Cat

沒看懂問題,只用相對位址,是指每次都分配一整塊記憶體嗎,這很容易造成碎片啊。

不如直接用mmu,每個程序都獨佔全部虛擬記憶體位址,然後lazy分配物理頁

4樓:kevin

這種方案有兩個問題:

第一,不安全,因為隔離不乾淨,無法防止程式中的絕對定址,這樣乙個程式就可以任意訪問甚至破壞另外乙個程式的記憶體資料,(包括作業系統的安全模組),如果對CPU進行改動,去除所有直接定址指令,將會對作業系統實現帶來困難。都已經直接改動CPU了, MMU難道不是更好的方案嗎?

第二,無法使用虛擬記憶體,當記憶體不夠時,通過mmu,可以將nand falsh、eeprom、檔案等不具備直接定址能力的儲存器,虛擬的為記憶體。

為什麼現在手機都選擇使用玻璃材質而不使用金屬材質?

聚玻網 從腹黑的角度來分析的話,估計是為了更新換代,因為市場就這麼大,如果像上世紀80 90年代那樣造產品,怕是乙隻手機可以用很多年,諾基亞就是如此,可這樣一來,就不符合廠家的利益了,市場飽和,意味著新品的推出受限,畢竟發燒友還是少數。 清輝大雄 當然是為了好看。前面很多答主說因為5g啦,無線充電啦...

為什麼 iPad 選擇了 iOS,而不是使用 macOS?

獨狼 arm和x86的區分,一系列指令集.如果iPad搭載intel處理器,按照intel擠牙膏式更新週期,iPad更新恐怕不足以吸引消費者.其次考慮功耗吧,畢竟iPad注重使用者體驗,iOS對於絕大多數人來說很容易上手。macOS雖說容易上手,但熟悉系統花的時間比iOS多,不是有人買Mac裝win...

為什麼CPU使用率老是接近100 ,使得電腦很卡,可以解決嗎?

Windows系上process explorer Unix 系 ps e 看看哪個Time最多,然後Google一下那個程序的名字。 木獨 同病相憐的,可惜在知乎沒有找到相關的回答,可能知乎的大牛都是在產品和其他軟體上 而我,剛剛扛著機箱去找了樓下的幾家電腦維修店,結果,不知道 結合一下親身體會吧...