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