1. 程式人生 > >虛擬地址和實體地址及其對映

虛擬地址和實體地址及其對映

其實之前我看過這個問題,據我理解的,當時是這麼回答的“程序在執行的時候,作業系統都為其分配一個4GB的地址空間,即所謂的虛擬地址空間,一般情況下,當我們的程式很大的時候,實際的實體記憶體根本不能滿足我們的需求的時候,這個時候作業系統就會藉助磁碟空間來做虛擬的記憶體空間,把當前程序不需要的資料放在磁碟上,等到用到的時候,在利用排程演算法把所需要的資料從磁碟空間上排程到記憶體,虛擬記憶體就是為了擴大記憶體的容量,每當我們要執行一個程式的時候經過編譯以後形成的僅僅是邏輯上的空間,根本不是可以直接執行的記憶體空間,所以它還存在一個地址對映的概念。”當時感覺回答的很是籠統,只見總監在最後說了一句,你下去還是把這一塊的內容在好好看看,所以今天就好好的把這個概念理一理。

首先我從最基本的概念說起,什麼是實體記憶體的概念,虛擬記憶體的概念?
實體記憶體,在應用中,自然是顧名思義,物理上,真實的插在板子上的記憶體是多大就是多大了。而在CPU中的概念,實體記憶體就是CPU的地址線可以直接進行定址的記憶體空間大小。比如8086只有20根地址線,那麼它的定址空間就是1MB,我們就說8086能支援1MB的實體記憶體,及時我們安裝了128M的記憶體條在板子上,我們也只能說8086擁有1MB的實體記憶體空間。同理我們現在大部分使用的是32位的機子,32位的386以上CPU就可以支援最大4GB的實體記憶體空間了。
先說說為什麼會有虛擬記憶體和實體記憶體的區別。正在執行的一個程序,他所需的記憶體是有可能大於記憶體條容量之和的,比如你的記憶體條是256M,你的程式卻要建立一個2G的資料區,那麼不是所有資料都能一起載入到記憶體(實體記憶體)中,勢必有一部分資料要放到其他介質中(比如硬碟),待程序需要訪問那部分資料時,在通過排程進入實體記憶體。所以,虛擬記憶體是程序執行時所有記憶體空間的總和
,並且可能有一部分不在實體記憶體中,而實體記憶體就是我們平時所瞭解的記憶體條。有的地方呢,也叫這個虛擬記憶體為記憶體交換區。
關鍵的是不要把虛擬記憶體跟真實的插在主機板上的記憶體條相掛鉤,虛擬記憶體它是“虛擬的”不存在,假的啦,它只是記憶體管理的一種抽象!
那麼,什麼是虛擬記憶體地址和實體記憶體地址呢。假設你的計算機是32位,那麼它的地址匯流排是32位的,也就是它可以定址0~0xFFFFFFFF(4G)的地址空間,但如果你的計算機只有256M的實體記憶體0x~0x0FFFFFFF(256M),同時你的程序產生了一個不在這256M地址空間中的地址,那麼計算機該如何處理呢?回答這個問題前,先說明計算機的記憶體分頁機制

計算機會對虛擬記憶體地址空間(32位為4G)分頁產生頁(page),對實體記憶體地址空間(假設256M)分頁產生頁幀(page frame),這個頁和頁幀的大小是一樣大的,所以呢,在這裡,虛擬記憶體頁的個數勢必要大於實體記憶體頁幀的個數。在計算機上有一個頁表(page table),就是對映虛擬記憶體頁到實體記憶體頁的,更確切的說是頁號到頁幀號的對映,而且是一對一的對映。但是問題來了,虛擬記憶體頁的個數 > 實體記憶體頁幀的個數,豈不是有些虛擬記憶體頁的地址永遠沒有對應的實體記憶體地址空間?不是的,作業系統是這樣處理的。作業系統有個頁面失效(page fault)功能作業系統找到一個最少使用的頁幀,讓他失效,並把它寫入磁碟,隨後把需要訪問的頁放到頁幀中,並修改頁表中的對映,這樣就保證所有的頁都有被排程的可能了。這就是處理虛擬記憶體地址到實體記憶體的步驟。
現在來回答什麼是虛擬記憶體地址和實體記憶體地址。虛擬記憶體地址由頁號(與頁表中的頁號關聯)和偏移量組成。頁號就不必解釋了,上面已經說了,頁號對應的對映到一個頁幀。那麼,說說偏移量。偏移量就是我上面說的頁(或者頁幀)的大小,即這個頁(或者頁幀)到底能存多少資料。舉個例子,有一個虛擬地址它的頁號是4,偏移量是20,那麼他的定址過程是這樣的:首先到頁表中找到頁號4對應的頁幀號(比如為8),如果頁不在記憶體中,則用失效機制調入頁,否則把頁幀號和偏移量傳給MMU(CPU的記憶體管理單元)組成一個物理上真正存在的地址,接著就是訪問實體記憶體中的資料了。總結起來說,虛擬記憶體地址的大小是與地址匯流排位數相關,實體記憶體地址的大小跟實體記憶體條的容量相關。