ARM v7-A 系列CPU的MMU隱射分析安全
摘要:ARM v7-A系列的CPU加入了不少擴展,如多核處理器擴展、大物理地址擴展、TrustZone擴展、虛擬化擴展。若支持大的物理地址,則必須支持多核處理器;若支持虛擬化,則必須支持大的物理地址、多核處理器、TrustZone。加入這些擴展後,相應的MMU(虛擬地址到物理地址的隱射功能)結構也改變了許多。本文首先分析加入擴展後MMU的總體結構,而後詳細介紹地址轉換中用到短描述符格式(32位)和長描述符格式(64位),以及如何實現虛擬地址到物理地址的查詢,最後就二級隱射問題,給出一個例子用以驗證。app
關鍵字:Cortex-A MMU;大物理地址擴展;TrustZone;虛擬化;二級隱射spa
總體結構由四部分組成,以下圖所示。線程
PL2:NS(非安全模式)下的HYP(超級管理)模式3d
PL1:S(安全模模式)或者NS(非安全模式)下的其它模式(用戶模式除外)blog
PL0:S或者NS下的用戶模式內存
注:每一個CPU(支持TrustZone擴展)能夠處於安全模式或者非安全模式,處於任意模式(安全或者非安全)的CPU又有8個模式(支持TrustZone、虛擬化)。it
這四部分爲:table
安全模式的PL1&0隱射,頁表控制寄存器TTBCR,頁表基址寄存器TTBR0/TTBR1,這些寄存器須要在S模式的PL1設置;pdf
非安全模式的PL2隱射,頁表控制寄存器HTCR,頁表基址寄存器HTTBR,須要在NS的PL2設置;
非安全模式的PL1&0的一級映射,頁表控制寄存器TTBCR,頁表基址寄存器TTBR0/TTBR1,須要在NS模式的PL1設置;
非安全模式的PL1&0的二級映射,頁表控制寄存器VTCR,頁表基址寄存器VTTBR,須要在NS的PL2設置;
因爲擴展了不少,帶來了下面幾個問題:
一、處於安全模式的CPU,用MMU訪問相應的物理單元時,一樣的虛擬地址,能夠訪問到安全的物理地址,也可能訪問到非安全的物理地址,怎麼決定訪問的物理地址是安全的、非安全的?
處於非安全模式的CPU是沒有這個功能的,只能訪問到非安全的物理地址。
答:對於採用短描述符,若一級描述符是段或者超級段,則第19位NS表示訪問的是S/NS;
若一級描述符是頁表,則第3位NS表示訪問的是S/NS,
就是二級描述符再也不區分了,即S/NS的區分是以1MB爲單位的。
對於採用長描述符格式,二級映射只在NS模式下才使用,而S/NS之分只在S模式下使用,故只有一級映射纔有該功能。
若一級描述符是block,則第5位NS表示訪問的是S/NS,只是在查詢出最終的物理地址時纔有用。
若一級描述符是table,則第63位NS Table表示是S/NS,
若爲1,則後續的二級、三級都是非安全的;
若爲0,若二級是block,則NS決定;
若二級也是table,繼續判斷 NS TABLE
若爲1,則後面的是非安全的。
若爲0,則三級的第5位NS決定。
二、NS PL1&0 是否啓用二級映射,可否不採用?
答:HCR寄存器的VM位,決定NS PL1&0的二級映射是否使能
三、短/長描述符格式怎麼選取,S PL1&0,NS PL1&0的一級映射怎麼決定採用短描述符格式、長描述符格式?
答: 參考上面的描述,TTBCR的EAE位決定採用短或者長;而NS的PL2,NS的PL1&0的二級映射必須採用長描述符格式。
輸入的虛擬地址是32位,輸出的物理地址是32位/40位。
32位的TTBCR的格式:
32位的TTBR0格式:
32位的TTBR1格式:
隱射分類:
超級段:24位,16MB,是否支持,由實現決定(Cortex-A7,A9都是不一樣的實現)。物理地址最大能夠到40位
段: 20位,1MB
大頁: 16位,64KB
小頁: 12位,4KB
短描述符總共可能有二級,分別描述以下。
一級描述符內容:
00:無效
01:頁表,[31:10] 位是二級頁表的基地址
1X:段隱射,X是PXN(Privileged execute never)位。
18位是0則是段,是1則爲超級段。
段,則用[31:20]表示物理地址的高12位,虛擬地址的低20位也是物理地址的;
超級段,[39:36(8:5) 35:32(23:20)31:24] 共16位,組成物理地址的高16位,虛擬地址的低24位也是物理地址的
PXN:沒有實現大的物理地址擴展時,這個位是可選的(定義或不定義);
若實現了,則這個位必須定義。
二級描述符內容:
00:無效
01:大頁,31:16表示物理地址的高位,虛擬地址的低16位也是物理地址的,
1X:小頁,31:12表示物理地址的高位,虛擬地址的低12位也是物理地址的。
X是XN(execute never)位,可否執行位
TTBR0或者TTBR1的選取:
TTBCR的2:0這3位的內容,就是N。
若N是0,則一直用TTBR0;
若N>0,則按照下面表格內容推斷。
N最大是7,若N是7,則0x0200 0000 ~ 0x03FF FFFF開頭的虛擬地址採用TTBR0,這個總共0x20個,每一個4字節,故TTBR0只需128字節就可;
而對於TTBR1,由於地址不連續,則須要16KB的大小,16KB/4=4KB,4*1024*1MB=4GB,就覆蓋了整個範圍。
總共可能有三級,分別描述以下。
一級查詢示意以下圖所示。
對於stage 1隱射:輸入32位,輸出40位
HYP模式下,64位的HTTBR定義以下。
根據HTCR.T0SZ(就是HTCR低3位的值),肯定X的值。
若HTCR.T0SZ > 1,則是14 - HTCR.T0SZ;不然是5 - HTCR.T0SZ。
32位的HTCR定義以下。
其它模式下,64位的TTBR0/TTBR1定義以下。
其中X的值,由TTBCR.T0SZ/T1SZ決定,公式同上。
TTBCR的第22位A1,決定採用TTBR0或者是TTBR1的ASID(地址空間ID)
32位的TTBCR定義以下。
TTBR0或者TTBR1的選取:
參考下面的表格公式,可能出現某段虛擬地址空間,找不到頁表基地址,沒法被訪問。
對於Stage 2隱射:輸入40位,輸出40位。
64位的VTTBR定義以下所示。
其中X的值,由VTCR.T0SZ決定,計算方法同上。
32位的VTCR定義以下。
一級查詢和二級查詢的描述符格式以下圖所示。
根據上圖,若一級查詢出來是block,則取出39:30做爲地址的高位,虛擬地址的30:0做爲低位,大小是以1GB爲單元。
若一級查詢出來的是頁表,則根據取出的39:12做爲高地址,虛擬地址的29:21充當11:3低位,繼續查詢。
根據上圖,若查詢出來的是block,則取出39:21做爲物理地址的高位,虛擬的20:0做爲低位,大小是以2MB爲單元。
若查詢出來的仍然是頁表,則取出39:12做爲高地址,再次將虛擬地址的20:12充當11:3位,繼續查詢。
一級映射下,一次完整的三級查詢以下圖所示。
根據上圖,三級查詢結果必定是頁表,將取出來的39:12做爲物理的高地址,虛擬地址的11:0做爲低地址,這就是最終的物理地址。
驗證平臺:
內存大小2GB:0x0000 0000 ~ 0x8000 0000
CPU:Cortex-A7
UBOOT中設置傳遞給內核的內存地址大小爲1024-16M,地址範圍爲 0x0000 0000 ~ 0x4000 0000 -16MB。
開啓NS下的二級隱射功能。設置VTTBR的地址爲table_base_stage_2,二級隱射的頁表內容以下。
.globl table_base_stage_2
table_base_stage_2:
.quad 0x00000000000007FD // Mapping guest's IPA 0x0000,0000-0x3FFF,FFFF to PA 0x0000,0000-0x3FFF,FFFF (RAM space)
.quad 0x0000000000000000
.quad 0x00400000800004C9 // Mapping guest's IPA 0x8000,0000-0xBFFF,FFFF to PA 0x8000,0000-0xBFFF,FFFF (Device space)
.quad 0x00400000800004C9 // Mapping guest's IPA 0xC000,0000-0xFFFF,FFFF to PA 0xC000,0000-0xFFFF,FFFF (Device space)
.quad 0x0000000000000000 // Mark everything else as aborting
.quad 0x0000000000000000
每一個描述符內容64位,8個字節。
第一個 0x0000 0000 0000 07FD,[39:30]是[0000 0000 00], 最低位是1 1 0 1,代表是個塊映射。即IPA 0xXX 0000 0000 ~ 0xXX 3FFF FFFF這段地址空間對應的
物理地址是個塊,對應的物理地址範圍是0x00 0000 0000 ~ 0x00 3FFF FFFF。
對於第二個,0x0000000000000000,最低位是0 0 0 0,則根據下面的描述,
即IPA 0x4000 0000 ~ 0x7FFF FFFF對應的PA是不肯定的,會產生轉換失效。
內核中,創建一個16M的短描述符的段隱射,隱射描述爲:
虛擬地址0xFD00 0000 ~ FE00 0000 對應的IPA中間地址是0x 4000 0000 ~ 0x4100 0000。
而後內核訪問0xfd00 0004這個虛擬地址空間,根據一級隱射,對應的IPA是0x4000 0004;
而在二級隱射中,這個IPA地址找不到對應的物理地址,就會出錯,可是不會panic,觀察顯示這個線程佔用了90%多的CPU。
參考文獻:DDI0406C_arm_architecture_reference_manual.pdf