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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

OPTEE的内存管理 : 将内存加入到页表去管理

發布時間:2025/3/21 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的内存管理 : 将内存加入到页表去管理的全部內容,希望文章能夠幫你解決所遇到的問題。

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