日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OPTEE的内存管理 :页表的创建过程

發布時間:2025/3/21 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的地址

struct mmu_partition {l1_xlat_tbls_t *l1_tables;xlat_tbl_t *xlat_tables;xlat_tbl_t *l2_ta_tables;unsigned int xlat_tables_used;unsigned int asid; };

那么我們就十分好奇了,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都填滿的情況下

entriesTable size虛擬地址范圍
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都填滿的情況下

entriesTable size虛擬地址范圍
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的内存管理 :页表的创建过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。