線性地址轉物理地址

爲了節約頁表佔用的內存空間,x86將線性地址經過頁目錄表頁表兩級查找轉換成物理地址

32位的線性地址被分紅3個部分:最高10位 Directory 頁目錄表偏移量,中間10位 Table是頁表偏移量,最低12位Offset是物理頁內的字節偏移量

頁目錄表的大小爲4KB(恰好是一個頁的大小),包含1024項,每一個項4字節(32位),表項裏存儲的內容就是頁表的物理地址(由於物理頁地址4k字節對齊,物理地址低12位老是0,因此表項裏的最低12字節記錄了一些其餘信息,這裏作簡化分析)。若是頁目錄表中的頁表還沒有分配,則物理地址填0。

頁表的大小也是4k,一樣包含1024項,每一個項4字節,內容爲最終物理頁的物理內存起始地址。web

實例:mov    0x80495b0, %eax  中的地址爲例分析一下線性地址轉物理地址的過程。
明確一點,Linux中邏輯地址等於線性地址,那麼咱們要轉換的線性地址就是0x80495b0。轉換的過程是由CPU自動完成的,Linux所要作的就是準備好轉換所需的頁目錄表和頁表(假設已經準備好)

1)內核先將當前任務的頁目錄表的物理地址填入cr3寄存器
2)線性地址 0x80495b0 轉換成二進制後是 0000 1000 0000 0100 1001 0101 1011 0000spa

    最高10位0000 1000 00的十進制是32,CPU查看頁目錄表第32項,裏面存放的是頁表的物理地址。orm

    線性地址中間10位00 0100 1001 的十進制是73,頁表的第73項存儲的是最終物理頁的物理起始地址。blog

    物理頁基地址加上線性地址中最低12位的偏移量,CPU就找到了線性地址最終對應的物理內存單元。內存

相關文章
相關標籤/搜索