我們首先明確一下這個問題 也就是說你需要通過線性地址(因為開啟了分頁,這里也可以叫虛擬地址,我們下文都將這樣稱呼,假設需要找到虛擬地址vaddr)vaddr來找到對應它的PTE指針。 我們知道通過虛擬地址vaddr,我們經(jīng)過頁變化可以找到一個確定的物理地址phy_vaddr?,F(xiàn)在我們想要找到的是指向這個phy_vaddr的pte指針,由于頁表,頁表項這些都是存在于內(nèi)存中的,所以其對應的是實在的物理地址。于是我們現(xiàn)在的目的就是:通過一個虛擬地址得到物理地址。 嗯,聽起來就讓人很激動呀? 讓我們先來回顧一下處理器處理 32 位地址的三個步驟: (1)首先處理高 10位 的 pde索引,從而處理器得到頁表物理地址。 (2)其次處理中間 10 位 的 pte 索引,進而處理器得到普通物理頁的物理地址 (3)*是把低 12 位 作為普通物理頁的頁內(nèi)偏移地址,此偏移地址加上物理頁的物理地址,得到的地址之和便是最終的物理地址,處理器到此物理地址上進行讀寫操作。也就是說,我們要創(chuàng)造的一個新的虛擬地址 new vaddr,它經(jīng)過處理器以上三個步驟的拆分處理,最終會落到 vaddr 自身所在的 pte 的物理地址上。 *步:高10位的構成 那么分析到這里,我們就需要知道一個知識點:在頁目錄表中,*一個目錄表項填的是頁目錄表自己的地址。 所以我們在構建新的虛擬地址的時候,在高10位,我們可以直接讓其指向頁目錄表的*一位,然后本該得到頁表物理地址的我們得到的還是頁目錄表的物理地址。 即圖中Dir我們讓其指向Page Directory的*一項,然后我們得到的還是一個指向Page Directory的指針,而并不是指向Page Table的指針。 由于頁目錄表也是4KB,所以為4*2^10 = 2^12 = 1024,由于其實下標為0,所以*一個表項為1023,對應的16進制為0x3ff,將其左移到高10位后,變?yōu)?xffc00000 第二步:中間10位的構成 現(xiàn)在我們的指針是指向頁目錄表的,如果按照之前的規(guī)則的話,我們此時看圖,應該是Table與上一個結果相加,得到Physical Address Space的地址,而我們最終想得到的是指向物理地址Phy.Addr的那個指針,也就是我們想知道的pte指針,那么這一步我們就應該找到Page Table的地址。 所以,我們構造中間10位的時候,將原本的Dir作為偏移地址,這樣,通過其與*步我們得到的頁目錄表的地址相加,就可以得到指向Page Table的指針,也就是我們要得到的頁表的地址。
于是中間10位的構成為圖中Dir的值 第三步:低12位的構成 我們現(xiàn)在已經(jīng)有了指向Page Table的指針了,那我們?nèi)绾握业街赶蛭锢淼刂稰hy.Addr的那個指針呢?我們可以想一下,初始的時候我們是通過加上Table的值得到指向物理地址Phy.Addr的指針的,所以我們此時也是將其作為低12位。 但是這里又有一個問題了,其為10位,而我們需要的是12位,怎么辦呢?我們通過將其左移2位,即可得到新的地址,即將其值乘以4即可。同樣pde指針也是同理,大家自己可以思考一下哦??