標籤:
轉載請註明出處:jiq?欽‘s technical Blog
記憶體管理單元(MMU)完成虛存地址到物理地址的轉換。
1什麼是虛擬記憶體:
虛擬記憶體兩個關鍵技術:
(1)頁表(地址變換機構)。虛擬位址(連續的)到物理地址(不連續的頁)的轉換;
(2)頁面置換功能。將暫時不用的頁面放到磁碟,讓正在啟動並執行進行獲得更大的物理空間。
虛擬記憶體是電腦系統記憶體管理的一種技術。它使得應用程式認為它擁有連續的可用的記憶體(一個連續完整的地址空間),而實際上,它通常是被分隔成多個實體記憶體片段,還有部分暫時儲存在外部磁碟儲存空間上,在需要時進行資料交換。(頁面置換演算法)
與沒有使用虛擬記憶體技術的系統相比,使用這種技術的系統使得大型程式的編寫變得更容易,對真正的實體記憶體(例如RAM)的使用也更有效率。
注意:虛擬記憶體不只是“用磁碟空間來擴充實體記憶體”的意思——這隻是擴充記憶體層級以使其包含硬碟而已。把記憶體擴充到磁碟只是使用虛擬記憶體技術的一個結果,它的作用也可以通過覆蓋或者把處於不活動狀態的程式以及它們的資料全部交換到磁碟上等方式來實現。對虛擬記憶體的定義是基於對地址空間的重定義的,即把地址空間定義為“連續的虛擬記憶體地址”,以藉此“欺騙”程式,使它們以為自己正在使用一大塊的“連續”地址。
現代所有用於一般應用的作業系統都對普通的應用程式使用虛擬記憶體技術,例如文書處理軟體,電子製表軟體,多媒體播放器等等。老一些的作業系統,如DOS和1980年代的Windows,或者那些1960年代的大型主機,一般都沒有虛擬記憶體的功能——但是Atlas,B5000和蘋果公司的Lisa都是很值得注意的例外。[1]
那些需要快速存取或者反應時間強式一致性的嵌入式系統,和其他的特殊應用的電腦系統,可能會為了避免讓運算結果的可預測性降低,而選擇不使用虛擬記憶體。
2Linux中的虛擬記憶體
在Linux作業系統支援兩種形式的交換空間:交換分區和分頁檔。
交換分區:在磁碟中專門分出一個磁碟分割用於交換 分頁檔:建立一個檔案用於交換交換空間大小沒有規定特定的值,如果實體記憶體較小(小於512M位元組)時,一般設定為實體記憶體的1.5倍到2倍。
Linux支援同時使用多個交換裝置,還能為它們分配給不同的優先順序。當需要交換出實體記憶體中頁時,作業系統根據優先順序順序選擇可用的交換裝置。如果有多個交換裝置優先順序相同,那麼它們是按照類似level0RAID的方式分配使用的。如果能夠並行地訪問這些交換裝置的話,給他們分配相同的優先順序就能夠使系統效能得到提供。因此,分配優先順序的時候還應該特別注意一些問題。例如,在同一物理磁碟上的多個交換分區就不應該被並行地使用,而應該以訪問速度從高到底的順序使用。所以在只有一塊物理磁碟的時候,設定多個交換分區,並不能提高效能,反而可能會使效能下降。
3 為什麼要虛擬記憶體?
(1) 安全性:
(a) 隔離不同進程:
通過把不同進程的虛存空間映射道不同的實體記憶體,這樣便實現了進程間在物理上的隔離。使得一個進程無法訪問其他進程的進程空間。:
(b) 隔離User Mode和Kernel Mode------雙處理器模式的實現:
雙處理器模式就是指使用者模式和核心模式。通過虛存機制,作業系統使用兩套不同映射寄存器將使用者空間和核心空間映射到不同的實體記憶體,從而杜絕了使用者程式直接存取(而不是使用系統調用)核心空間的可能性。
例如一個16位應用程式Hello_Jiq,最大地址空間是64k,其中32k空間0x0~0x7FFF被映射到實體記憶體的0x4000~0xBFFF,剩餘32k空間0x8000~0xFFFF沒有被做任何映射。核心空間被映射到實體記憶體0x0~0x3FFF。
應用程式訪問0x0~0x7FFF時實際上是訪問了物理空間的0x4000~0xBFFF,訪問0x8000~0xFFFF時由於沒做任何映射而導致匯流排錯誤。總之其無論如何都訪問不到核心空間。
(2)提高空間利用率:
由於程式指令的指令字長的限制,其只能訪問16位64K的地址空間。
但是匯流排支援18位地址模式,最大物理空間可達256K。
實際記憶體DRAM也比較多,一般大於256K甚至更高。
但是使用者程式的指令如果直接存取實體記憶體的話只能訪問0-64K的實體記憶體(訪問不到64K-256K部分)。
使用虛擬記憶體可以將進程的每一個64K空間映射到實體記憶體的每一個64K部分(包括原來訪問不到的高地址物理空間部分)。多個進程就可以充分利用所有記憶體空間。
(3)多進程支援:
任意進程可以在自己的"0-64K"的空間內任意分配代碼區和資料區。如果沒有虛存機制,而且任何進程都在想要使用0-64K的地址空間,但是又只能同時有一個進程使用,這樣就會導致難以實現。
(4) 現代作業系統中虛存的另一個重要作用還有實現程式的動態連結!!!
編譯 ---> 連結 ---> 裝入 ---> 運行
Linux核心(五)虛擬記憶體