前言:段頁式的訪存的內容還沒有結束。。。還有一部分知識,線性地址到物理地址的轉換。話不多說,讓我們開始吧。
假設頁的大小是 4KB,每個頁表項佔 4B,則理論上一個頁表有多大?(虛擬空間大小是 4GB)
頁表項數目 = 4 GB / 4 KB = 1 MB
所以,
頁表大小 = 1 MB × 4 B = 4 MB
注意!
頁的大小是 4KB。也就是說,一個頁是放不下的。所以我們要採用多級頁表的方式。
整體過程
(在這裏說的是 IA-32 架構,也就是隻有兩層頁表)
線性地址
------> 物理地址
的整體過程如下:
用文字敘述:
- 由邏輯地址得到的線性地址一共 32 位。前 10 位是頁目錄索引,中間 10 位是頁表索引,最後 12 位是業內偏移量
- 由 CR3 寄存器得到「頁目錄基地址」,再得到「頁目錄項」
- 由「頁目錄項」得到「頁表基地址」
- 由「頁表基地址」得到「頁表項」,最後得到物理地址
什麼是 CR3 寄存器
在這裏一共要介紹 3 種「控制寄存器」
-
CR0:控制寄存器(轉自維基百科)
Bit Name Full Name Description 0 PE Protected Mode Enable 如果爲 1,則系統處於保護模式,否則系統處於實模式 1 MP Monitor co-processor 控制 WAIT / FWAIT 指令與 CR0 中 TS 標誌的交互 2 EM Emulation 如果設置,則不存在 x87 浮點單元,如果清除,則存在 x87 浮點單元 3 TS Task switched 僅在使用 x87 指令後才允許在任務切換時保存 x87 任務上下文 4 ET Extension type 在 386 上,它允許指定外部數學協處理器是 80287 還是 80387 5 NE Numeric error 設置時啓用內部 x87 浮點錯誤報告,否則啓用 PC 樣式 x87 錯誤檢測 16 WP Write protect 設置後,當權限級別爲 0 時,CPU 無法寫入只讀頁面 18 AM Alignment mask 如果 AM 設置,AC 標誌(在 EFLAGS 寄存器中)設置,並且權限級別爲 3,則啓用對齊檢查 29 NW Not-write through 全局啓用/禁用直寫式緩存 30 CD Cache disable 全局啓用/禁用內存緩存 31 PG Paging 如果爲 1,則啓用分頁並使用 CR3 寄存器,否則禁用分頁。 在本例子中,CR0 寄存器主要用來標明使不使用分頁。
-
CR2:頁故障(page fault)線性地址寄存器
存放引起頁故障的線性地址。只有在 CR0 中的 PG=1 時,CR2 纔有效。
-
CR3:頁目錄基址寄存器
保存頁目錄表的起始地址。只有當 CR0 中的 PG=1 時,CR3 纔有效。
這樣就完成了訪存的所有內容。我們來回顧一下
舉個栗子
IA-32中,執行“movl 8(%ebp), %eax” 中取數操作的大致過程如下:
- 由 ds 寄存器得到 16 位段選擇符,其中有 2 位記錄了 CPL。
- 由段選擇符,查表(第一次)或者查 Cache。找到段描述符。其中有 2 位記錄了 DPL。以及 32 位的段基址。
- 如果 CPL >= DPL 則越級,否則計算線性地址 LA = 段基址 + R[ebp] + 0 * 0 + 8
- 若 LA > 段限,則越界,否則將 LA 轉換爲主存地址 A
- 若訪問 TLB 命中則地址轉換得到 A;否則處理 TLB 缺失(硬件/OS)
- 若缺頁或越權(R/W不符)則調出 OS 內核;否則地址轉換得到 A
- 根據 A 先到 Cache 中找,若命中則取出 A 在 Cache 中的副本
- 若 Cache 不命中,則再到主存取 A 所在主存塊送對應 Cache 行
作者:madao756
鏈接:https://www.jianshu.com/p/c78cdf6214b5
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。