【操作系統】虛擬內存(一)

一個系統中的進程是與其他進程共享CPU和主存資源的(win系統就是內存條內存),然而主存資源是有限的,如果進程太多,那內存資源根本就滿足不了。爲了更加有效的管理內存並且減少出錯,現代操作系統提供了一種對主存的抽象概念,叫虛擬內存
虛擬內存是硬件異常、硬件地址翻譯、主存、磁盤文件和內核軟件的完美交互,它爲每個進程提供了一個大的、一致的和私有的地址空間

一、尋址

1.物理尋址

早期的PC的CPU訪問內存方式是使用物理地址,稱之爲物理尋址。如圖1
在這裏插入圖片描述

圖1

圖1展示的是一條加載指令,它讀取從物理地址4處開始的4字節字,當CPU執行這條加載指令時,會生存一個有效的物理地址,通過內存總線,把它傳遞給主存。主存取出從物理地址4處開始的4字節字,並將它返回給CPU,CPU會將它存放在一個寄存器裏。

2.虛擬尋址

現代處理器使用的是虛擬尋址的尋址方式,如圖2:
在這裏插入圖片描述

圖2

CPU通過生存一個虛擬地址來訪問主存,這個虛擬地址在被送到內存之前先轉換爲適當的物理地址。將一個虛擬地址轉換爲物理地址的任務叫做地址翻譯。CPU芯片上有個內存管理單元(MMU)的專用硬件,利用存放在主存中的查詢表來動態的翻譯虛擬地址,該表由操作系統管理。

二、地址空間

虛擬地址空間是一個非負整數地址的有序集合:

{0, 1,2,…}

如果地址空間中的整數是連續的,那麼我們說它是一個線性地址空間。
一個地址空間的大小由表示最大地址所需要的位數來描述的。
例如,一個包含N=2^n個地址的虛擬地址空間就叫做一個n爲地址空間。win系統的x86架構是32位地址系統,x64是64位地址系統。
主存中的每字節都有一個選自虛擬地址空間的虛擬地址和一個選自物理地址空間的物理地址。

三、虛擬內存作爲緩衝工具

虛擬內存被組織爲一個由存放在磁盤上的N個連續的字節大小的單元組成的數組。每字節都有一個唯一的虛擬地址,作爲到數組的索引。磁盤上數組的內容被緩存在主存中。
磁盤上的數據塊被分割成塊,這些塊作爲磁盤和主存之間的傳輸單元。VM系統通過將虛擬內存分割爲稱爲虛擬頁的大小固定的塊來處理這個問題。每個虛擬頁的大小爲P=2^p字節。物理內存被分割爲物理頁,大小也爲P字節(物理頁被稱爲頁幀)。
虛擬頁面的集合分爲三個不相交的子集:

  • 未分配的:VM系統還未分配(或者創建)的頁。未分配的塊沒有任何數據和它們相關聯,因此也就不佔用任何磁盤空間。
  • 緩存的:當前已緩存在物理內存中的已分配頁。
  • 未緩存的:未緩存在物理內存中已分配頁。

VM系統使用主存作爲緩存示例:
在這裏插入圖片描述

圖3

一共有8個虛擬頁的小虛擬內存,虛擬頁0和3還未被分配,因此在磁盤上還不存在。虛擬頁1、4、6被緩存在物理內存中。頁2、5和7已經被分配了,但是還並未被緩存在主存中。

1.DRAM緩存的組織結構

爲清晰理解存儲層次結構中不同的緩存概念,使用術語SRAM緩存來表示位於CPU和主存之間的L1、L2、L3高速緩存,用術語DRAM緩存來表示虛擬內存系統的緩存,它在主存中緩存虛擬頁。

2.頁表

同任何緩存一樣,虛擬內存系統中必須有某種方法來判定一個虛擬頁是否緩存在DRAM中的某個地方。如果是,系統還必須確定這個虛擬頁存放在哪個物理頁中,如果不命中,系統必須判定這個虛擬頁存放在磁盤的哪個位置,在物理內存中選擇一個犧牲頁,並將虛擬頁從磁盤複製到DRAM中,替換這個犧牲頁。
上述這些功能是由操作系統軟件、MMU中的地址翻譯硬件和一個存放在物理內存中叫做頁表(page table)的數據結構,頁表將虛擬頁映射到物理頁。每次地址翻譯硬件將一個虛擬地址轉換爲物理地址時,都會讀取頁表。操作系統維護頁表的內容,以及在磁盤與DRAM之間來回傳送頁表。
頁表的基本組織結構如下圖:
在這裏插入圖片描述

圖4

頁表就是一個頁表條目的數組。虛擬地址空間中的每個頁在頁表中一個固定偏移量處都有一個PTE。上圖中假設每個PTE由一個有效位和一個n位地址字段組成。有效位表明了該虛擬頁當前是否被緩存在DRAM中,如果設置有效位,那麼地址字段就表示DRAM中相應的物理頁的起始位置,這個物理頁中緩存了該虛擬頁。若未設置有效位,那麼一個空地址表示這個虛擬頁還未被分配。
上圖4中展示了一個有8個虛擬頁和4個物理頁的系統頁表。

  • 四個虛擬頁(VP1、VP2、VP4、VP7)當前被緩存在DRAM中。
  • 兩個頁(VP0、VP5)還未被分配。
  • VP3、VP6已經被分配,但是還未被緩存。
3.缺頁

在虛擬內存的習慣說法中,DRAM緩存不命中稱爲缺頁。舉例說明:
缺頁之前
在這裏插入圖片描述

圖5

CPU引用了VP3中的一個字,VP3並未緩存在DRAM中。地址翻譯硬件從內存中讀取PTE3,從有效位推斷出VP3未被緩存,並且觸發一個缺頁異常。之後按如下流程處理:

  1. 缺頁異常調用內核中的缺頁異常處理程序,該程序會選擇犧牲一個犧牲頁,此例中是存放在PP3的VP4。
  2. 如果VP4已經被修改了,那麼內核就會將它複製會磁盤。無論哪種情況,內核都會修改VP4的頁表條目,反映出VP4不再緩存在主存中。
  3. 內核從磁盤複製VP3到內存中的PP3,更新PTE3,返回返回。
  4. 當異常處理程序返回時,它會重新啓動導致缺頁的指令,該指令會把導致缺頁的虛擬地址重發送到地址翻譯硬件。
  5. 此時VP3已經緩存在主存中,那麼頁也能正常命中了。

缺頁之後
缺頁之後的處理如圖6
在這裏插入圖片描述

圖6

四、虛擬內存作爲內存管理工具

操作系統爲每個進程提供了一個獨立的頁表,也就是一個獨立的虛擬地址空間,如圖7
在這裏插入圖片描述

圖7

注意:多個虛擬頁面可以映射到同一個共享物理頁面上。

VM簡化了鏈接和加載、代碼和數據共享,以及應用程序的內存分配。

  • 簡化鏈接。獨立的地址空間運行每個進程的內存映像使用相同的基本格式,而不管代碼和數據實際存放在物理內存的何處。
  • 簡化加載。 虛擬內存還使得容易向內存中加載可執行文件和共享對象文件。加載器從不從磁盤到內存實際複製任何數據。在每個頁初次被引用時,要麼是CPU取指令時引用的,要麼是一條正在執行的指令引用一個內存位置時引用的,虛擬內存系統會按照需要自動地調入數據頁。
  • 簡化共享。 獨立地址空間爲操作系統提供了一個管理用戶進程和操作系統自身之間共享的一致機制。相同的操作系統內核代碼,每個進程之間都是共享的。
  • 簡化內存分配。 當操作系統給進程分配K個連續的虛擬頁面,這連續的虛擬頁面可以映射到K個人也的物理頁面。

五、虛擬內存作爲內存保護工具

現代計算機系統必須爲操作系統提供手段來控制對內存系統的訪問。不應該發生以下事情:

  1. 不應該允許用戶進程修改它的只讀代碼段;
  2. 不應該允許用戶進程讀或修改任何內核中的代碼和數據結構;
  3. 不應該允許用戶進程讀或者寫其它進程的私有內存;
  4. 不應用允許用戶進程修改任何與其他進程共享的虛擬頁面,除非所有的共享者都顯示的允許它這麼做。

通過在PTE上添加一些二外的許可位來控制對一個虛擬頁面內容的訪問則十分簡單了,大致思想如圖8
在這裏插入圖片描述

圖8

每個PTE中添加三個許可位。

  • SUP位表示進程是否必須運行在內核(超級用戶)模式下才能訪問該頁。運行在內核模式中的進程可以範圍任何頁面,但是運行中用戶模式下的進程只允許訪問那些SUP爲0的頁面。
  • READ位和WRITE位控制對頁面的讀和寫權限。

如果一條指令違反了這些許可條件,那麼CPU就觸發一個一般保護故障,將控制傳遞給一個內核中的異常處理程序。產生一個“段錯誤”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章