頁目錄和頁表重合與分頁位址轉換

2021-04-24 16:20:05 字數 2031 閱讀 6184

寫得不錯,轉下,來自jiurl大牛的

頁目錄的位址為什麼是c0300000,1個頁目錄加上1024個頁表為什麼只使用了1024*4k的位址空間

對於要對映整個4g位址空間,是需要1024個頁表和1個頁目錄的,每個都是4kb大小,也就是 1024*4kb+1*4kb=4mb+4kb。而實際中win2k把每個程序的頁目錄和頁表對映到了從 0xc0000000到0xc03fffff 這4mb的位址空間中(頁目錄在0xc0300000開始的4k)。注意是4mb位址空間而不是4mb+4kb。1024個頁表和1個頁目錄,應該是需要 (1024+1)*4kb的位址空間的。而現在win2k只使用了1024*4kb的位址空間這是為什麼?

原因就是頁表被對映到了程序的位址空間。

如果頁表和頁目錄沒有被對映到程序的位址空間中,而乙個程序的4gb位址空間又都映**物理記憶體的話,那麼就確實需要1024個物理頁來存放頁表,和另外1個物理頁來存放頁目錄,也就是需要(1024+1)*4kb的物理記憶體。

但是頁表被對映到了程序的位址空間中,這導致了乙個頁表的內容和頁目錄的內容是完全一樣的,正是這種完全相同,使得將1024個頁表加1個頁目錄對映到位址空間只需要1024*4kb的位址空間,其中的乙個頁表和頁目錄完全重合了。

乙個頁表1024項,每項對應4kb位址空間,乙個頁表對應4mb的位址空間。1024個對應了整個4gb位址空間。1024個頁表也被對映到了從 0xc0000000到0xc03fffff 的4mb位址空間中。這4mb位址空間也是由乙個頁表來對應的。我們來看對應於從 0xc0000000到0xc03fffff 這4mb的位址空間的頁表。該頁表有1024項,每項對應一頁的位址空間,表明是否在物理記憶體中,如果在,實體地址是多少。而這個頁表是對應頁表所在的 4mb位址空間的,所以它的每一項對應的一頁,正是每個頁表所在的頁。也就是說這個頁表的每一項指出了乙個頁表是否有物理記憶體對映,如果有的話,實體地址 是多少。這正是頁目錄所做的工作。把1024個頁表對映到了位址空間,導致了1024個頁表中的乙個的內容和頁目錄完全重合,它既是頁目錄又是頁表。所以 1個頁目錄加上1024個頁表只使用了1024*4k的位址空間。

頁表被對映到位址空間的什麼地方,是由作業系統的設計者決定的,他會綜合考慮各種問題,作出最後的決定。不過一旦頁表所在的位址空間的位址決定了,那麼頁目錄的位址也就決定了,除非他打算多使用一頁的位址空間儲存和現在乙個頁表中完全相同的內容。

win2k中把頁表對映到了從 0xc0000000到0xc03fffff 的4mb位址空間中,我們來計算一下負責這4m位址空間的那個頁表的位址,那個頁表就是和頁目錄重合的頁表。4mb位址空間的首位址0xc0000000 顯然是由該頁表的第一項負責的,我們用這個位址來計算。pte_address=(virtualaddress>> 12)*4+0xc0000000,

(0xc0000000>>12)*4+0xc0000000=0xc0000*4+0xc0000000=0x300000+0xc0000000=0xc0300000

正是頁目錄的虛擬位址。

1 虛擬位址->虛擬位址對應的pde位址

pde_address=(virtualaddress>>22)*4+0xc0300000 

2 虛擬位址->虛擬位址對應的pte位址

pte_address=(virtualaddress>>12)*4+0xc0000000 

3 虛擬位址->實體地址

如果 虛擬位址大於等於0x80000000 並且小於0xa0000000(在 large page 部分),

直接用虛擬位址減去0x80000000就得到了實體地址。

其他情況

取得該虛擬位址的pde,判斷是否有效。

有效的話,取得該虛擬位址的pte,判斷是否有效。

有效的話,將pte的低12位清0加上虛擬位址的低12位就得到了實體地址。

由於頁表和頁目錄在系統位址空間中,訪問需要程式執行在ring0,所以要測試的話,需要寫驅動程式。

unsigned int pde;

unsigned int pte;

if(virtualaddress>=0x80000000 && virtualaddress<0xa0000000)

else}}

頁目錄和頁表重合與分頁位址轉換

頁目錄的位址為什麼是c0300000,1個頁目錄加上1024個頁表為什麼只使用了1024 4k的位址空間 對於要對映整個4g位址空間,是需要1024個頁表和1個頁目錄的,每個都是4kb大小,也就是 1024 4kb 1 4kb 4mb 4kb。而實際中win2k把每個程序的頁目錄和頁表對映到了從 0...

分頁和頁表

除了分段,空間管理的第二種常見方式是分頁。linux將虛擬記憶體劃分成固定大小的頁 linux中的頁大小是4kb 並且以頁作為操作記憶體的最小單元。例如一次性讀取一頁,虛擬記憶體中的頁稱為虛擬頁。對應的,物理記憶體也會劃分成固定大小的頁來管理,稱為物理頁,也常稱為頁框或頁幀 page frame 物...

程序頁表兩級結構 頁目錄和頁表頁

程序頁表的基本結構僅適合於小程序位址空間,在大位址空間下,該結構發生了變化。大虛址空間下的記憶體程序頁表結構採用頁表頁和頁目錄。32位意味著虛址空間可達4gb 虛址空間計算方法 32位的編址為232,232 210 210 210 22 4gb 1k 1024b 1m 1024k 1g 1024m ...