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的内存管理 :页表的创建过程