From:https://www.cnblogs.com/0Nullptr/articles/6958964.html
一、首先明確幾個概念
邏輯地址:是程序編譯后,生成的目標模塊進行編址時都是從0號單元開始編址,稱之為目標模塊的相對地址,即為邏輯地址。
頁:將進程划分的塊,對應的大小就叫頁面大小。
頁框:將內存划分的塊。
頁和頁框二者一一對應,一個頁放入一個頁框,(理論上)頁的大小和頁框的大小相等。
頁表:就是一個頁和頁框一一對應的關系表。【存放在內存中】 關系表只是起到一個索引的作用,說白了就是能根據關系表能查到某一個頁面和哪一個頁框所對應。
二、用例子說話【例子出現在:《王道考研操作系統》的內存管理部分】
已知條件:邏輯地址32位、頁面大小4KB、頁表項大小4B,按字節編址。
分析:
1.

首先32位的虛擬地址可表示的進程大小應該是2^32B = 4GB(暫時別去想頁號P占多少位,W占多少位)
2.(根據頁的定義和頁面大小的定義)將進程進行分頁:

3.我們已經知道了頁面的數目為:2^20頁。現在的迷茫點就在於頁表項的問題上。
上圖在頁表上已經給出了幾個數據:20位,12位,32位,2^20項。一一解釋如下【請結合上圖一個一個數據分析】:
2^20項:因為頁表的作用是要將頁面的頁框一一對應起來,所以,每一個頁面在頁表中都應該有一個頁表項:用來表示一個頁號對應一頁頁框號(內存中的塊號),故應
該有2^20項。【不應該有問題吧,就好像一個班有50個同學,每個人都應該有一個地址一樣】
20位:已經很顯然了,需要表示出2^20個頁表項,就至少需要20位的地址。為什么只取20位而不是21位,22位呢,本人現在還沒想這個問題,就暫時定為恰好取20位即可。
32位:已知條件里告訴了頁表項大小為4B,那么自然就應該是32位了。
12位:32位-20位 = 12位。為什么頁框號地址為12位,只能表示2^12個頁框,要小於2^20個頁面呢,因為並不是進程的每一個頁面都要調入內存。其實32位、12位、20位這三個數據還是有一定依據的,在二級分頁的時候就會發現“哦,原來剛剛好”。此處暫不討論二級分頁。
4.通過上面的分析我們得出了哪些數據:
邏輯地址32位,進程大小:4GB。
頁面:大小4KB,數量:2^20頁。
頁表項:4B,數量:2^20項。所以頁表就需要4B*2^20 = 4MB的空間存儲(這就是書中說:頁表項大小為4MB的由來)進一步,主存的頁框大小和頁面大小是相等的,也為4KB,所以將頁表存在主存就需要占用4MB/4KB = 1024頁(因為頁表也是存在主存中的,而主存也是按頁框划分的。這的確是一種資源浪費,所以就需要建立二級頁面,將其大小控制在1頁之內,將二級頁面存入主存即可)
-
