在 Linux 系統(tǒng)中,采用了虛擬內(nèi)存管理技術(shù),事實上大多數(shù)現(xiàn)在操作系統(tǒng)都是如此!在 Linux 系統(tǒng)中,每一個進(jìn)程都在自己獨(dú)立的地址空間中運(yùn)行,在32 位系統(tǒng)中,每個進(jìn)程的邏輯地址空間均為 4GB,這 4GB 的內(nèi)存空間按照 3:1 的比例進(jìn)行分配,其中用戶進(jìn)程享有 3G 的空間,而內(nèi)核獨(dú)自享有剩下的1G 空間,如下所示:
虛擬地址會通過硬件MMU(內(nèi)存管理單元)映射到實際的物理地址空間中,建立虛擬地址到物理地址的映射關(guān)系后,對虛擬地址的讀寫操作實際上就是對物理地址的讀寫操作,MMU會將物理地址“翻譯”為對應(yīng)的物理地址,其關(guān)系如下所示:
Linux 系統(tǒng)下,應(yīng)用程序運(yùn)行在一個虛擬地址空間中,所以程序中讀寫的內(nèi)存地址對應(yīng)也是虛擬地址,并不是真正的物理地址,譬如應(yīng)用程序中讀寫0x80800000 這個地址,實際上并不對應(yīng)于硬件的 0x80800000 這個物理地址。
為什么需要引入虛擬地址呢?
計算機(jī)物理內(nèi)存的大小是固定的,就是計算機(jī)的實際物理內(nèi)存,試想一下,如果操作系統(tǒng)沒有虛擬地址機(jī)制,所有的應(yīng)用程序訪問的內(nèi)存地址就是實際的物理地址,所以要將所有應(yīng)用程序加載到內(nèi)存中,但是我們實際的物理內(nèi)存只有G,所以就會出現(xiàn)一些問題:
當(dāng)多個程序需要運(yùn)行時,必須保證這些程序用到的內(nèi)存總量要小于計算機(jī)實際的物理內(nèi)存的大小。
內(nèi)存使用效率低。內(nèi)存空間不足時,就需要將其它程序暫時拷貝到硬盤中,然后將新的程序裝入內(nèi)存。然而由于大量的數(shù)據(jù)裝入裝出,內(nèi)存的使用效率就會非常低。
進(jìn)程地址空間不隔離。由于程序是直接訪問物理內(nèi)存的,所以每一個進(jìn)程都可以修改其它進(jìn)程的內(nèi)存數(shù)據(jù),甚至修改內(nèi)核地址空間中的數(shù)據(jù),所以有些惡意程序可以隨意修改別的進(jìn)程,就會造成一些破壞,系統(tǒng)不安全、不穩(wěn)定。
無法確定程序的鏈接地址。程序運(yùn)行時,鏈接地址和運(yùn)行地址必須一致,否則程序無法運(yùn)行!因為程序代碼加載到內(nèi)存的地址是由系統(tǒng)隨機(jī)分配的,是無法預(yù)知的,所以程序的運(yùn)行地址在編譯程序時是無法確認(rèn)的。
針對以上的一些問題,就引入了虛擬地址機(jī)制。程序訪問存儲器所使用的邏輯地址就是虛擬地址,通過邏輯地址映射到真正的物理內(nèi)存上。所有應(yīng)用程序運(yùn)行在自己的虛擬地址空間中,使得進(jìn)程的虛擬地址空間和物理地址空間隔離開來,這樣做帶來了很多的優(yōu)點(diǎn):
進(jìn)程與進(jìn)程、進(jìn)程與內(nèi)核相互隔離。一個進(jìn)程不能讀取或修改另一個進(jìn)程或內(nèi)核的內(nèi)存數(shù)據(jù),這是因為每一個進(jìn)程的虛擬地址空間映射到了不同的物理地址空間。提高了系統(tǒng)的安全性與穩(wěn)定性。
在某些應(yīng)用場合下,兩個或者更多進(jìn)程能夠共享內(nèi)存。因為每個進(jìn)程都有自己的映射表,可以讓不同進(jìn)程的虛擬地址空間映射到相同的物理地址空間中。通常,共享內(nèi)存可用于實現(xiàn)進(jìn)程間通信。
便于實現(xiàn)內(nèi)存保護(hù)機(jī)制。譬如在多個進(jìn)程共享內(nèi)存時,允許每個進(jìn)程對內(nèi)存采取不同的保護(hù)措施,例如,一個進(jìn)程可能以只讀方式訪問內(nèi)存,而另一進(jìn)程則能夠以可讀可寫的方式訪問。
編譯應(yīng)用程序時,無需關(guān)心鏈接地址。前面提到了,當(dāng)程序運(yùn)行時,要求鏈接地址與運(yùn)行地址一致,在引入了虛擬地址機(jī)制后,便無需關(guān)心這個問題。
-
Linux
+關(guān)注
關(guān)注
87文章
11456瀏覽量
212750 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3108瀏覽量
74979 -
地址
+關(guān)注
關(guān)注
1文章
32瀏覽量
10969 -
系統(tǒng)
+關(guān)注
關(guān)注
1文章
1028瀏覽量
21701
發(fā)布評論請先 登錄
物理地址到虛擬地址的轉(zhuǎn)換步驟
探討一下ARM中的MMU虛擬地址
linux kernel實現(xiàn)物理地址到虛擬地址空間的切換方法
ARM處理器使用虛擬地址來提供cache index和cache tag
用戶態(tài)得到虛擬地址對應(yīng)的物理地址

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

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

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

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

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

Linux虛擬地址到物理地址轉(zhuǎn)換過程

評論