RISC-V Linux支持sv32、sv39、sv48等虛擬地址格式,分別代表32為虛擬地址、38位虛擬地址和48位虛擬地址。RISC-VLinux默認(rèn)也是使用sv39格式,sv39的虛擬地址、物理地址、PTE格式如下:
虛擬地址格式:
物理地址格式:
PTE格式:
虛擬地址使用39位表示,其中低12位代表pageoffset,高位劃分為了三部分:VPN[0]、VPN[1]和VPN[2],分別代表虛擬地址VA在PTE、PMD和PGD中的索引。
物理地址使用56位表示,低12位代表page offset,高位是物理頁(yè)P(yáng)PN[0]、PPN[1]和PPN[2]
PTE保存了物理頁(yè)P(yáng)PN[0]、PPN[1]和PPN[2],和物理地址中的PPN相對(duì)應(yīng);PTE的低10位代表物理地址的訪問(wèn)權(quán)限,當(dāng)RWX全為0時(shí),則代表該P(yáng)TE存儲(chǔ)的地址是下一級(jí)頁(yè)表的物理地址,否則代表當(dāng)前頁(yè)表是最后一級(jí)頁(yè)表。
再看看sv39 的頁(yè)表格式,sv39使用的是三級(jí)頁(yè)表,PGD、PMD和PTE,每一個(gè)級(jí)頁(yè)表使用9bit表示,即每一級(jí)頁(yè)表都有512個(gè)頁(yè)表項(xiàng)。
在代碼中,創(chuàng)建一個(gè)有512個(gè)元素的數(shù)組即代表一個(gè)頁(yè)表。一個(gè)PTE有512個(gè)頁(yè)表項(xiàng),每一個(gè)頁(yè)表項(xiàng)占用8字節(jié),5128=4096字節(jié),所以一個(gè)PTE代表4K。一個(gè)PMD也是512個(gè)頁(yè)表項(xiàng),每一項(xiàng)可代表一個(gè)PTE,5124 K=2M,所以一個(gè)PMD就代表2M。以此類(lèi)推,一個(gè)PGD代表512 * 2M=1G。
重要結(jié)論:PGD代表1G、PMD代表2M、PTE代表4K。sv39默認(rèn)的頁(yè)大小是4K。
三級(jí)頁(yè)表虛擬地址轉(zhuǎn)為物理地址過(guò)程示意圖:
sv39三級(jí)頁(yè)表虛擬地址轉(zhuǎn)為物理地址過(guò)程:
MMU通過(guò)satp寄存器得到PGD的物理地址,結(jié)合PGD index(即VPN[2])找到PMD;找到PMD后,再結(jié)合PMDindex(即VPN[1])找到PTE,然后結(jié)合PTE index(即VPN[0])得到VA在PTE索引中的值,從而得到物理地址。
最后在PTE中取出PPN[2]、PPN[1]和PPN[0],再和虛擬地址的低12位offset相加,得到最終的物理地址。
-
Linux
+關(guān)注
關(guān)注
87文章
11304瀏覽量
209523 -
RISC
+關(guān)注
關(guān)注
6文章
462瀏覽量
83734 -
地址表
+關(guān)注
關(guān)注
0文章
4瀏覽量
813
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論