ARMV8 mmu頁表結(jié)構(gòu)分析
掃描二維碼
隨時隨地手機看文章
1.概述
armv8 mmu頁表結(jié)構(gòu)比較復雜,總體說來可以將MMU分為以下幾個部分:
(1)虛擬地址(VA)為48位,而一般只使用到39位(512G內(nèi)核,512G用戶)
(2)可以配置成3級頁表(64K頁)或者4級頁表(4K頁)
最高的地址位是48為的地址,用4級頁表進行管理。
用戶空間的[63:39]都為零,而內(nèi)核空間的[63:39]都是1。
虛擬地址的63位可以用來選擇TTBRx。
2.虛擬地址格式
按照虛擬地址格式可以分為以下幾種:
4K時頁表的映射

64K時頁表的映射

3.頁表映射過程
如果要理解ARM64的映射過程,需要搞清楚的是
目前基于ARMv8-A架構(gòu)的處理器最大可支持到48根地址線,也就是尋址2^48的虛擬地址空間。即虛擬地址空間范圍為 0x0000 0000 0000 0000 ~ 0x0000 FFFF FFFF FFFF,共 256 TB。
由于需要進行4K頁表的映射,所以需要3個512字節(jié)的數(shù)組用來存放表項。

那么我們相信分析一下頁表的映射過程:
第一步:定義一個表的開始地址
main_tll[0]=(unsigned long)((unsigned char*)&T0_L1[0]) | // physical address
PTE_TYPE_PAGE | // it has the "Present" flag, which must be set, and we have area in it mapped by pages
MEM_ATTR_MEMORY;
其中main_tll為組表的表頭,可以看main_tll[0]可以映射的空間范圍是0到(0x4000 0000 - 1)。
這里由于用不到0x4000 0000以上的空間,所以把這部分空間再進行第二次映射。直接指向了T0_L1表的地址。
T0_L1[0]=(unsigned long)(0) | // physical address
PT_BLOCK | // we have area in it mapped by pages
MEM_ATTR_MEMORY;
可以看到,這里直接將T0_L1的地址賦值為0,這里表示這0-0x200000這2M空間直接映射。如果此時訪問這2M虛擬地址,則直接1:1訪問到物理地址上去了。
當然,如果想將這個地址映射的更加具體,也就是將這2M的空間,映射成4K,那就需要第三級的頁表項來映射。
現(xiàn)在我們用樹莓派3B來舉例。
樹莓派的串口寄存器地址0x3F200000。只需要映射到后面4k就可以了。
所以,總的表的映射過程如下:
//第一次映射
main_tll[0]=(unsigned long)((unsigned char*)&T0_L1[0]) | // physical address
PTE_TYPE_PAGE | // it has the "Present" flag, which must be set, and we have area in it mapped by pages
MEM_ATTR_MEMORY;
//第二次映射
T0_L1[505]=((unsigned long)(&T0_L2[0]) | // physical address
PT_PAGE | // map 4K
MEM_ATTR_MEMORY); // different attributes for device memory
//第三次映射
T0_L2[0]=(unsigned long)((505<<21)) | // physical address
PTE_TYPE_PAGE | // map 4k
MEM_ATTR_MEMORY;
這樣就可以正常的訪問地址空間了,至于為什么有個505,實際上0x3F200000 << 21得到的。21=12+9。
到這里三級映射關(guān)系就建立完成了。這時4K空間已經(jīng)映射完成。