OPTEE的内存管理 :页表的创建过程
關鍵詞: optee、ATF、TF-A、Trustzone、optee3.14、MMU、VMSA、cache、TLB、arm、armv8、armv9、TEE、安全、內存管理、頁表…
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
說明: 在默認的情況下,本文講述的是armv8 aarch64體系,optee 3.14.0代碼
.
目錄
- 1、前言
- 2、頁表基地址,存哪?頁表有多大?
- (1)、先看L1 Table
- (2)、再看L2 Table
- (3)、再看TA L2 Table
思考:
1、前言
本篇主要講述頁表是如何創建的?頁表放置在哪里的?以及一些代碼的分析和總結
在前面博文中(11-Memory Management Examples),我們已經GET到,構建頁表都需要做哪些事情,如下列舉所示
- 設置頁表基地址VBAR_EL3 (Specify the location of the translation table)
- 初始化MAIR_EL3 (Memory Attribute Indirection Register)
- 配置TCR_EL3 (Configure the translation regime)
- 創建頁表 (Generate the translation tables)
- Enable the MMU
然鵝我們今天只看“創建頁表 (Generate the translation tables)” 的過程
在講述之前,我們也先整體看一下optee os中關于MMU的整體流程,如下所示,粉色的框框(core_init_mmu())也正是我們今天要講的。
2、頁表基地址,存哪?頁表有多大?
通過之前的文章(OPTEE的內存管理 : 將內存加入到頁表去管理),其實我們已經大概知道頁表的創建流程,就是先構造出tee_mmap_region結構體數組,然后利用該結構體數組的信息去創建真正的頁表
那么創建頁表的地方在哪里呢? 沒錯,正是下方紅色框框的。其中default_partition是一個結構體,是靜態的全局的,結構體中的元素執行的正是L1 Table、L2 Table的地址
那么我們就十分好奇了,l1_tables、xlat_tables、l2_ta_tables的含義:
- l1_tables :L1 Table基地址
- xlat_tables:L2 Table基地址
- l2_ta_tables:TA的L2 Table基地址
那么這幾值又是如何定義的呢,分別又是多大呢?
l1_xlation_table 是在.nozi.mmu.l1段定義的全局變量
(1)、先看L1 Table
static l1_xlat_tbls_t l1_xlation_table[NUM_L1_TABLES] __aligned(NUM_L1_ENTRIES * XLAT_ENTRY_SIZE) __section(".nozi.mmu.l1");l1_xlat_tbls_t是一個自定義類型,事實上翻譯一下這段代碼,更好理解:
static uint64_t l1_xlat_tbls_t[CFG_TEE_CORE_NB_CORE][NUM_L1_ENTRIES] l1_xlation_table[NUM_L1_TABLES]__aligned(NUM_L1_ENTRIES * XLAT_ENTRY_SIZE) __section(".nozi.mmu.l1");然后再做一個簡單的總結,如下圖所示
所以,L1 Table到底是多大呢? 和虛擬地址有效位息息相關,比如我這里是32位有效虛擬地址,那么對應的L1 Table entries是4,每個entries占8bytes,所以L1 Table為32bytes,然后我們開了4個core(4張表), user和kernel的頁表又不分開(1張表),那么l1_xlation_table 共計34 * 4 *1 =136bytes
(2)、再看L2 Table
static xlat_tbl_t xlat_tables[MAX_XLAT_TABLES]__aligned(XLAT_TABLE_SIZE) __section(".nozi.mmu.l2");xlat_tables是一個自定義類型,事實上翻譯一下這段代碼,更好理解:
static uint64_t xlat_tables[XLAT_TABLE_ENTRIES][MAX_XLAT_TABLES]__aligned(XLAT_TABLE_SIZE) __section(".nozi.mmu.l2");其中:
- XLAT_TABLE_ENTRIES : 為512,也就是每個L2 Table中有512個entries
- MAX_XLAT_TABLES :一般配置成了5,也就是有5個L2 Table
所以L2是多大呢? 5 * 512 * 8 = 20K
(3)、再看TA L2 Table
/* MMU L2 table for TAs, one for each thread */static xlat_tbl_t xlat_tables_ul1[CFG_NUM_THREADS]__aligned(XLAT_TABLE_SIZE) __section(".nozi.mmu.l2");CFG_NUM_THREADS * XLAT_TABLE_ENTRIES * 8 , 例如我們最大線程數配置成8 ,那么此處就是 8 * 512 * 8 = 32K
然后我們再結合輸出的dump文件驗證一下,結論:md,竟然和上面計算的不一樣!!!
不管實踐和理論分析不一致的情況, 我們最后再總結一下:
L1 Table 定義在".nozi.mmu.l1"段中,也就幾十字節;
L2 Tables定義在".nozi.mmu.l2"段中,也就幾十K,L1 Table、L2 Tables在內存中是挨著排的
L3 Tables在創建頁表的時候,動態分配。
最后,再再再小小總結:
如果是32位有效虛擬地址,entries都填滿的情況下
| L1 Table = 4 entries L2 Table = 4 * 512 entries L3 Table = 4*512*512 entries | L1 Table size = 4*8 = 32bytes L2 Table size = 4*512*8 = 16kb L3 Table size = 4*512*512*8 = 8M | 這份配置管理著4*512*512*4K=4GB內存 |
如果是39位有效虛擬地址,entries都填滿的情況下
| L1 Table = 512 entries L2 Table = 512 * 512 entries L3 Table = 512*512*512 entries | L1 Table size = 512*8 = 4kb L2 Table size = 512*512*8 = 2M L3 Table size = 512*512*512*8 = 1G | 管理著512*512*512*4K=512GB內存 |
什么? 一個小小的頁表 就要占1GB內存?? 當然不是,在實際使用當中,L1 Table的entries不會被填滿的,可能也就填了幾個entries或者幾十個entries
總結
以上是生活随笔為你收集整理的OPTEE的内存管理 :页表的创建过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OPTEE的内存管理 : 将内存加入到页
- 下一篇: 有关Non-cacheable,,Cac