二級頁表如何節省記憶體
<深入理解linux核心>:如果使用簡單的一級頁表,如果程序使用全部4G線性地址空間,那麼將需要高達2^20表項(總共地址線是32位,每頁大小為4kb,則頁偏移量需要低12位,高20位當作頁表地址)來儲存表示每個程序的頁表,若每項4B,則需要4MB的ram來儲存頁表。即使一個程序並不使用內的所有地址。
書上提出:使用這種二級模式能夠減少每個程序頁表所需RAM數量。開始一直沒想通,為什麼節省了呢?從你最終要儲存的表項來看,無論如何你儲存的表項是不會少的,而且多級頁表還會增加儲存開銷。
其實是這樣的,二級表只是從程序的角度來看,為程序節省了頁表項(其實所有的頁表儲存空間增大了)。二級模式通過只為程序實際使用的那些虛擬記憶體區請求頁表來減少頁表,就是程序未使用的頁暫時可以不用為其建立頁表,因為如果使用一級頁表的話,你就必須為所有的4G範圍內分配頁表,不能細分。每個活動程序必須有一個分配給它的頁目錄,不過沒必要馬上為程序的所有頁表都分配ram,只有在程序實際需要一個頁表時才給該頁表分配ram,這樣就提高了效率。
注:正在使用的頁目錄實體地址存放在控制暫存器cr3中。
注:linux程序的線性地址空間分成兩部分:
(1)0x00000000~0xbfffffff的線性地址,無論使用者態和核心態的程序都可以定址;
(2)0xc0000000~0xffffffff的線性地址,只有核心態的程序可以定址。
栗子:
比如對於4G的空間,4K頁
那需要2^20 == 1M個頁標項(無論用不用都需要,系統不知道哪個地址是否會被訪問)
1M * 4B== 4MB
每個程序都需要4MB的頁表
而如果2級
只需要一個頁目錄 + 1個頁表(比如只使用4MB的情況)就足夠了