x86中的分頁機制

2021-08-20 03:16:23 字數 1743 閱讀 3919

分頁單元(page unit): 把線性位址轉化成實體地址.

為了效率, 線性位址分成固定長度的組, 該單元成為頁, 頁內部連續的線性位址被對映到連續的實體地址.

頁框: 分頁單元把ram分成固定長度的頁框, 頁框是乙個儲存區域, 與頁長度相同

頁是資料塊, 頁框是儲存區域, 所以頁可以放到頁框和磁碟中.

線性位址到實體地址的對映功能成為頁表, 頁表放在駐村, 並且在啟用分頁單元之前必須對頁表初始化.

分頁機制在x86處理器上通過設定cr0暫存器的pg標誌, pg = 0的時候線性位址就被解釋成實體地址

自從386開始分頁單元處理4kb頁, 32位線性位址被分成3部分第一部分為頁目錄(10 bit), 第二部分為頁表(10bit), 最後是offset(12bit),使用頁目錄和頁表兩個方式來轉換的目的在於減少程序頁表所需要的ram數量.

使用二級分頁模式每個頁表只需要2^10個表項(總共2 * 1024), 假設一項4位元組則需要8kb, 如果使用一級分頁則需要2^20個表項, 1mb * 4 = 4mb

每個程序必須有乙個頁目錄, 頁目錄的實體地址放在cr3暫存器.

我們稱頁目錄為pg dir, 頁表為pg tbl, 偏移量為offset. 所以1024 * 1024 * 4096 = 4gb.

擴充套件分頁

從pentium開始x86引入了擴充套件分頁, 它使頁框為4mb而不是4kb, 核心就用不到頁表項, 只需要頁目錄就可以訪問全部實體地址,從而節省了記憶體.

擴充套件分頁機制和正常分頁的不同在於, page size標誌必須設定成支援4mb, 由於每個實體地址都是4mb對齊, 所以位址的最低22位都為0.

通過設定cr4暫存器的pse能使擴充套件分頁和常規分頁共存.

常規分頁舉例:

假設核心給乙個程序分配了0x20000000-0x2000ffff, 該空間為2 ^ 16一共32kb. 高10位為directory = 0x80, 頁表範圍從0 - 15, 其餘頁表項均無效.

假設該程序要訪問0x2000e002則, directory 字段選擇第0x80項,  pg tbl欄位0x0e選擇第0x0e表項此表項指向了該頁的頁框.

pae分頁:

intel為了處理大於4gb的ram採用了pae, 將32根pin增加到36根, 從而擴大了定址能力通過設定cr4暫存器的pae標誌來啟用, 啟用後頁目錄項的頁大小標誌ps會使用大尺寸頁(2mb).

高達64gb的定址導致ram被分為2 ^ 24個頁框, 頁表項的實體地址欄位從20變成了24位, 頁表項大小從32位擴充套件為64位, 結果導致

1個4kb的頁表包含了512個表項而不是1024個表項.

該機制引入了乙個pdpt(page directory pointer table), 它由4個64位表項組成

cr3控制暫存器包含了pdpt的基位址字段, 由於pdpt存在ram的前4gb, 並且在32位元組對齊, 所以用27位來表示

當線性位址對映到4kb的頁時:

32位線性位址通過一下方式來轉換

[31:30] 指向pdpt 4項中的乙個 [29:21] 指向頁目錄512項的乙個 [20:12]指向頁表512項的乙個 [11:0] 偏移量

當線性位址對映到2mb的頁時:

[31:30] pdpt [29:21] 頁目錄 [20:0]偏移量

pae只處理了實體地址, 線性位址並沒有擴大, 只是用同乙個線性位址對映到不同的實體地址, 使用者態的程序不能使用大於4gb的物理空間(因為只有核心才能修改程序的頁表), 但是核心可以使用, 從而增加了系統中程序的數量.

參考:深入理解linux核心

X86中的RDTSC指令

intel 的x86 中的rdtsc 即read time stamp counter 讀取時間計數器的指令。這個指令讀取 cpu時間計數器,返回乙個無符號的 64位整數。它通過 edx eax 暫存器返回 cpu被引導後,時鐘所走的圈數。這意味著,你可以用它來計算時間間隔了多久。但是,由於這個指令...

x86 的 TSS 任務切換機制

寫在前面 5.7.1 tss 提供的程序切換機制 5.7.1.1 三個元素構成 tss 環境 tss selector 以及 tr task register 暫存器 tss 塊 task status segment 5.7.1.2 tss 機制的建立 下面的指令用來建立初始的 tss segme...

x86 的 TSS 任務切換機制

寫在前面 5.7.1 tss 提供的程序切換機制 5.7.1.1 三個元素構成 tss 環境 tss selector 以及 tr task register 暫存器 tss 塊 task status segment 5.7.1.2 tss 機制的建立 下面的指令用來建立初始的 tss segme...