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