ARM v7-A 系列CPU的MMU隱射分析

ARM v7-A 系列CPU的MMU隱射分析安全

摘要:ARM v7-A系列的CPU加入了不少擴展,如多核處理器擴展、大物理地址擴展、TrustZone擴展、虛擬化擴展。若支持大的物理地址,則必須支持多核處理器;若支持虛擬化,則必須支持大的物理地址、多核處理器、TrustZone。加入這些擴展後,相應的MMU(虛擬地址到物理地址的隱射功能)結構也改變了許多。本文首先分析加入擴展後MMU的總體結構,而後詳細介紹地址轉換中用到短描述符格式(32位)和長描述符格式(64位),以及如何實現虛擬地址到物理地址的查詢,最後就二級隱射問題,給出一個例子用以驗證。app

關鍵字:Cortex-A MMU;大物理地址擴展;TrustZone;虛擬化;二級隱射spa

1 ARM v7-A MMU 總體結構介紹

1.1 總體結構

總體結構由四部分組成,以下圖所示。線程

 

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設置

1.2 帶來的問題

因爲擴展了不少,帶來了下面幾個問題:

一、處於安全模式的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的二級映射必須採用長描述符格式。

2 短描述符的地址轉換表格式

2.1 相關寄存器和概念描述

輸入的虛擬地址是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,就覆蓋了整個範圍。

2.2 虛擬地址到物理地址的轉換

2.2.1 超級段的查找

 

2.2.2 段的查找

 

2.2.3 大頁的查找

 

2.2.4 小頁的查找

 

 

3 長描述符的地址轉換格式

總共可能有三級,分別描述以下。

3.1 一級查詢

一級查詢示意以下圖所示。

 

3.1.1 Stage 1隱射

對於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的選取:

參考下面的表格公式,可能出現某段虛擬地址空間,找不到頁表基地址,沒法被訪問。

 

3.1.2 Stage 2隱射

對於Stage 2隱射:輸入40位,輸出40位。

64位的VTTBR定義以下所示。

 

其中X的值,由VTCR.T0SZ決定,計算方法同上。

32位的VTCR定義以下。

 

 

一級查詢和二級查詢的描述符格式以下圖所示。

 

根據上圖,若一級查詢出來是block,則取出39:30做爲地址的高位,虛擬地址的30:0做爲低位,大小是以1GB爲單元。

               若一級查詢出來的是頁表,則根據取出的39:12做爲高地址,虛擬地址的29:21充當11:3低位,繼續查詢。

 

3.2 二級查詢

根據上圖,若查詢出來的是block,則取出39:21做爲物理地址的高位,虛擬的20:0做爲低位,大小是以2MB爲單元。

             若查詢出來的仍然是頁表,則取出39:12做爲高地址,再次將虛擬地址的20:12充當11:3,繼續查詢。

 

3.3 三級查詢

一級映射下,一次完整的三級查詢以下圖所示。

 

根據上圖,三級查詢結果必定是頁表,將取出來的39:12做爲物理的高地址,虛擬地址的11:0做爲低地址,這就是最終的物理地址。

 

4 NS模式的二級隱射功能驗證

驗證平臺:

內存大小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

相關文章
相關標籤/搜索