80386 分頁

高階設計

80386 是一個 32 位處理器,具有 32 位可定址儲存空間。Paging 子系統的設計者注意到 4K 頁面設計以相當簡潔的方式對映到這 32 位 –10 位,10 位和 12 位:

+-----------+------------+------------+
| Dir index | Page index | Byte index |
+-----------+------------+------------+
 3         2 2          1 1          0  Bit
 1         2 1          2 1          0  number

這意味著位元組索引是 12 位寬,它將索引到 4K 頁面。目錄和頁面索引是 10 位,每個都對映到 1,024 條目表 - 如果這些表條目每個 4 個位元組,那麼每個表將是 4K:也是一個頁面!

這就是他們所做的:

  • 每個程式都有自己的目錄,一個包含 1,024 個頁麵條目的頁面,每個頁面都定義了下一級頁面表的位置 - 如果有的話。
  • 如果有的話,那個頁面表將有 1,024 個頁麵條目,每個頁麵條目定義了最後一級頁面所在的位置 - 如果有的話。
  • 如果有,那麼該頁面可以直接讀出它的位元組。

頁面輸入

頂級目錄和下一級頁表都包含 1,024 個頁麵條目。這些條目中最重要的部分是索引的地址:頁表或實際頁面。請注意,此地址不需要完整的 32 位 - 因為所有內容都是 Page,所以只有前 20 位是重要的。因此,頁面輸入中的其他 12 位可用於其他事項:是否存在下一級別; 關於頁面是否被訪問或寫入的內務管理; 甚至是否應該允許寫入!

+--------------+----+------+-----+---+---+
| Page Address | OS | Used | Sup | W | P |
+--------------+----+------+-----+---+---+
Page Address = Top 20 bits of Page Table or Page address
OS           = Available for OS use
Used         = Whether this page has been accessed or written to
Sup          = Whether this page is Supervisory - only accessible by the OS
W            = Whether this page is allowed to be Written
P            = Whether this page is even Present

請注意,如果 P 位為 0,則允許條目的其餘部分具有作業系統想要放入的任何內容 - 例如,頁面的內容位於硬碟上的位置!

頁目錄基址暫存器(PDBR

如果每個程式都有自己的目錄,那麼硬體如何知道從哪裡開始對映?由於 CPU 一次只執行一個程式,因此它只有一個控制暫存器來儲存當前程式目錄的地址。這是頁面目錄基本暫存器(CR3)。當作業系統在不同程式之間交換時,它會使用程式的相關頁面目錄更新 PDBR

頁面錯誤

每次 CPU 訪問記憶體時,都必須將指示的虛擬地址對映到適當的實體地址。這是一個三步過程:

  1. 將地址的前 10 位索引到 PDBR 指示的頁面中,以獲取相應頁面表的地址;
  2. 將地址的下 10 位索引到目錄所指示的頁面中,以獲取相應頁面的地址;
  3. 索引地址的最後 12 位以從該頁面獲取資料。

由於上面的步驟 1.和 2.上面都使用了頁麵條目,因此每個條目都可能表示存在問題:

  • 下一級可能標記為不存在;
  • 下一級可以標記為只讀 - 操作是寫入;
  • 下一級可能被標記為主管 - 它是訪問記憶體的程式,而不是作業系統。

當硬體注意到這樣的問題時,它不會完成訪問,而是引發故障:中斷#14,即頁面錯誤。它還填寫了一些特定的控制暫存器,其中包含故障發生原因的資訊:引用的地址; 是否是主管訪問; 以及是否是寫入嘗試。

作業系統應該捕獲該故障,解碼控制暫存器,並決定做什麼。如果它是無效訪問,它可以終止錯誤程式。如果它是虛擬記憶體訪問,作業系統應該分配一個新的頁面(可能需要騰出一個已經在使用的頁面!),用所需的內容填充它(全部為零,或者從磁碟載入的前一個內容) ),將新頁面對映到適當的頁面表,將其標記為存在,然後恢復故障指令。這次訪問將成功進行,程式將不知道發生了什麼特別的事情(除非它看一下時鐘!)