天天看點

C++前序——(1)虛拟位址空間

一、前言

以前的程式,都是直接運作在實體記憶體上的,即程式在運作時通路的位址都是實體位址。這種方式帶來的問題就是:如何把有限的實體記憶體配置設定給這麼多程式使用呢?

C++前序——(1)虛拟位址空間

與此同時,這種記憶體配置設定政策也帶來幾個問題:

(1) 程式間的位址不隔離,惡意程式可能會借此損壞正常程式的資料。

(2) 記憶體使用效率低,由于記憶體大小有限,當剩餘的記憶體不夠裝載接下來要運作的程式的時候,正在運作的程式需要暫停換出到磁盤,以空出足夠的記憶體來,等它運作完了再換回來。這樣大量的資料進進出出,導緻記憶體的使用效率非常低下。

(3) 程式運作的位址不确定,程式在裝載運作時,都需要占用記憶體上的一塊空間,這個空間的位置是不确定的。但是,程式在編寫時,很多資料或是指令跳轉時的目标位址都是确定的,這個問題給程式的編寫帶來不小的問題。

是以,為了解決以上的三個問題,增加了中間層——虛拟位址,提供了一種間接通路實體記憶體的通路方法。

二、虛拟位址

為了解決上述的幾個問題,虛拟位址就出現了。為了隔離每個程式,每一個程式都有自己的位址空間、CPU(當然,隻是看起來是這樣),每一個程式都可以不用管其他的程式,就像它占據了整個計算機。

1.位址空間

(1) 實體位址空間

實體位址空間是實實在在存在于計算機中的,它和位址空間的位址長度有關。如果計算機是32位的,即計算機的位址總線有32條,那麼實體空間就有4GB。4GB的實體空間中,隻有記憶體的512MB有效,其他的是外存部分。

(2) 虛拟位址空間

虛拟位址空間其實是人為想象出來的位址空間,這個位址空間的大小有CPU的位數(硬體的尋址空間大小)決定,32位CPU的虛拟位址空間大小為4GB,64位CPU的虛拟位址空間大小為17179869184GB(看起來很大了吧,可是以後或許還有更大的,因為在32位時人們就覺得“夠了”...)。

每一個程序都有自己的虛拟位址空間,這樣使得每一個程序都隻能通路自己的位址空間而互不影響。當程序在通路自己的虛拟位址空間時,實際上通路的是它映射在實體位址空間的那一部分。

具體的映射方式,就是記憶體分段、分頁管理中的内容了。

C++前序——(1)虛拟位址空間

那麼,在32位的虛拟位址空間中,4GB的空間是否程式都可以使用呢?

2.虛拟位址空間的分布

其實,整個虛拟位址空間都是由作業系統來管理的,是以程序隻能使用那些作業系統配置設定給它的空間。同時,作業系統留有一部分給自己使用。

32位作業系統下虛拟位址空間的分布:

C++前序——(1)虛拟位址空間

其中,核心中的ZONE_DMA如果進行了配置,則程式進入記憶體就不需要進入寄存器。

繼續閱讀