2011-07-08 15 views
4

我有興趣瞭解虛擬內存和頁面機制,特別是Windows x86系統。從我從各種在線資源中收集到的信息(包括SO上發佈的其他問題),進程頁表

1)每個進程的單獨頁表位於同一進程的內核地址空間內。

2)每個進程只有一個頁面表,其中包含虛擬頁面到物理頁面(或幀)的映射。 3)對應於給定虛擬地址的物理地址由存儲器管理單元(MMU)基本上通過使用所提供的虛擬地址的前20位作爲頁表的索引來計算,使用該索引來檢索物理幀的起始地址,然後根據虛擬地址的剩餘12位向該地址施加一些偏移量。

這三個陳述是否正確?或者我誤解了這些信息?

回答

10

所以,首先讓澄清一些事情:

  1. 在x86架構的情況下,它不是操作系統確定尋呼政策,它是CPU(更具體地說,它是MMU) 。操作系統如何查看分頁系統與其實施方式無關。正如一位評論者正確指出的那樣,操作系統專用組件可用於分頁模型。這是從屬於硬件的做事方式。
  2. 32位和64位x86處理器具有不同的分頁方案,因此如果不指定處理器的字大小,則無法真正討論x86分頁模型。

接下來是使用最簡單版本的32位x86分頁模型的大規模壓縮版本。有很多額外的調整是可能的,我知道各種操作系統都使用它們。我不會深入這些,因爲我不熟悉大多數操作系統的內部,因爲除非你掌握了更簡單的東西,否則你真的不應該這樣做。如果您想要了解x86分頁模型的所有奇妙怪癖,可以訪問Intel文檔:Intel System Programming Guide

在最簡單的分頁模型中,內存空間被分爲4KB塊,稱爲頁面。其中1024個連續塊映射到頁表(也是4KB大小)。對於更進一步的間接尋址,所有1024個頁面表都映射到4KB頁面目錄,並且該目錄的基址位於處理器中的特殊寄存器%cr3中。由於OS中的大部分內存空間都是稀疏,這意味着大部分內存空間未被使用,所以這兩級結構已到位。你不想爲一些未被觸及的內存保留一堆頁表。

當你得到一個內存地址時,最重要的10位索引進入頁面目錄,它給你頁表的基礎。接下來的10位索引到該頁表中,爲您提供物理頁面的基礎(也稱爲物理框架)。最後,最後12位索引到幀中。 MMU爲你完成所有這些工作,假設你已經將%cr3設置爲正確的值。

64位系統有一個4級尋呼系統,因爲他們的存儲空間更稀疏。另外,頁面大小可能不是4KB。

真正得到您的問題:

  1. 所有這些尋呼信息(表,目錄等)在內核內存坐鎮。請注意,內核內存是一大挑戰,並且沒有一個進程擁有內核內存的概念。
  2. 每個進程只有一個頁面目錄。這是因爲頁面目錄定義了一個內存空間,每個進程只有一個內存空間。
  3. 上面的最後一段爲您提供了地址被切碎的方式。

編輯:清理和小修改。

+0

如您所說,分頁方案與操作系統無關。例如,Linux與vanilla unix相比以不同的方式處理分頁,而不是10:10:12模式。 – i0exception

+0

非常感謝這個見解。虛擬地址是32位,是否正確?不像第三段(最後一段)所述的32個字節。還是隻是一個錯字? – Jimmy

+0

我想說的是操作系統使用的分頁模型和硬件使用的模型通常是不同的概念。 Linux在內部使用統一的分頁模型,但是這是分層的硬件分頁模型,需要體系結構特定的黑客才能使其工作。硬件的模型決定了地址翻譯如何實際發生(因爲MMU是這樣做的)。 Linux只是在頂層添加一個間接層。在它的深處它仍然使用10:10:12模型。 –

1

總的來說,這非常正確。

如果沒記錯,一些細節都有點過,但:

  1. 爲內核的內存分頁不會每個進程的改變,因此所有的頁表總是內核可見。
  2. 理論上,還有一個基於細分的翻譯步驟。然而,大多數實際系統(例如* BSD,Linux,Windows,OS/X)使用的片段的基數設置爲0,並將限制設置爲地址空間限制,因此該步驟基本上是NOP。
+0

迴應你的第一點:你的意思是說每個進程的內核地址空間總是包含相同的信息;因此,每個進程的所有頁表都存儲在每個虛擬地址空間中(但每個進程的內核地址空間映射到相同的物理幀)? – Jimmy

+0

@Jimmy:不,頁表不一定在每個虛擬地址空間中。儘管如此,它們將全部直接可見。要切換到特定的地址空間,該地址空間的頁表必須對內核可見。 –

+0

感謝您的澄清;儘管我不明白這如何使我原來的三個陳述無效。我只是沒有提到每個單獨的地址空間對內核都可見的事實。 – Jimmy