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、在enable_mmu的前后的取指操作,有和區別嗎?在enable_mmu之前的取指操作,Core看到的都是物理地址;在enable_mmu之后的取指操作,Core看到的都是虛擬地址地址。為了保證在enable_mmu的前后,程序能夠穩定的運行,一般的操作系統,都是將這塊內存進行一一映射,即物理地址=虛擬地址,所有對于這塊區域,在MMU開啟的前后,無論Core看到的是虛擬地址還是物理地址,事實上訪問的都是一樣的。 那么問題來了,optee也是這樣干的嗎?請找出相關代碼?
2、對于一塊一塊的內存而言,在構建MMU頁表的時候,這些內存塊他們所對應的虛擬地址是如何分配的?
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),其實本篇也沒有講述真正創建頁表的過程,只是講述了一個創建頁表管理的一個機制。
2、內存注冊模型
register_phys_mem是一個宏,用于注冊物理內存,其實就是在編譯的時候將這些物理內存信息寫入到core_mmu_phys_mem結構體中,然后再將這些結構體拼起來,放在了__scattered_array_Xphys_mem_map(X=0,1,2…)這樣的section段中.
optee系統啟動的時候,init_mem_map()--->collect_mem_ranges()函數會循環遍歷__scattered_array_Xphys_mem_map段讀出物理內存信息,然后再將這些信息寫入到static_memory_map數組
在static_memory_map數組中,其實就是一堆tee_mmap_region結構體的結合, tee_mmap_region描述了內存塊需要map的信息。在開機啟動階段,core_init_mmu()函數會根據tee_mmap_region描述的信息,為這些內存塊依次建立頁表
透過事務看本質,先小小總結一下: 在代碼中,試用register_phys_mem注冊了很多塊內存,這些信息被寫入到了.rodata的__scattered_array_Xphys_mem_map段中,開機的時候會將這些信息讀取出來,統一放到 tee_mmap_region結構體,接著就是創建頁表,創建頁表的時就是循環遍歷 tee_mmap_region結構體數組,依次將每一個內存塊信息添加到頁表中
到此我們大概清楚了頁表建立的過程,那么在建立頁表的時候VA是從哪里來的呢? 其實從上圖也可以看出,在構建tee_mmap_region結構體時,VA的填充都是0。 那么什么時候填充的VA呢?
答案詳見下面的代碼分析,其實在collect_mem_ranges()構造完tee_mmap_region結構體結構體之后,還會再調用assign_mem_va(TEE_RAM_START, memory_map) 為每一個region分配VA地址,VA的起始地址正是TEE_RAM_START
然后我們再來看下為每一個region分配VA地址的邏輯
最后再總結一下本小節,其實是這樣的:
總結
以上是生活随笔為你收集整理的OPTEE的内存管理 : 将内存加入到页表去管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: optee中MMU内存管理模型-页表的建
- 下一篇: OPTEE的内存管理 :页表的创建过程