optee中MMU内存管理模型-页表的建立模型
思考:
1、__identity_map_init_start 的干啥的,作用? ----看起來是給ALSR用的,暫且不研究
MMU頁表的創(chuàng)建模型,在optee os系統(tǒng)中,有很多種類型的memory,詳見teecore_memtypes,每一種內(nèi)存類型(或者說每一塊內(nèi)存)都可以使用tee_mmap_region結(jié)構(gòu)體來描述。而在系統(tǒng)啟動的時候,需要先map一些內(nèi)存,表示這些內(nèi)存的結(jié)構(gòu)體,又是放在一個名為static_memory_map的靜態(tài)全局數(shù)組中的(固定大小的,如MAX index = 23)
在開機啟動階段,事實上就填充了一個結(jié)構(gòu)體,表示__nozi_start - __nozi_end 區(qū)間.
總結(jié):在開機階段就map了一小塊內(nèi)存 : __nozi_start - __nozi_end 區(qū)間 ,并且是一一映射哦!!
(1)、teecore_memtypes 和 tee_mmap_region 結(jié)構(gòu)體原型
非常重要的兩個結(jié)構(gòu)體teecore_memtypes和tee_mmap_region
(optee_os/core/include/mm/tee_mmu_types.h)struct tee_mmap_region {unsigned int type; /* enum teecore_memtypes */unsigned int region_size;paddr_t pa;vaddr_t va;size_t size;uint32_t attr; /* TEE_MATTR_* above */ }; (optee_os/core/arch/arm/include/mm/core_mmu.h)enum teecore_memtypes {MEM_AREA_END = 0,MEM_AREA_TEE_RAM,MEM_AREA_TEE_RAM_RX,MEM_AREA_TEE_RAM_RO,MEM_AREA_TEE_RAM_RW,MEM_AREA_NEX_RAM_RW,MEM_AREA_TEE_COHERENT,MEM_AREA_TEE_ASAN,MEM_AREA_IDENTITY_MAP_RX,MEM_AREA_TA_RAM,MEM_AREA_NSEC_SHM,MEM_AREA_RAM_NSEC,MEM_AREA_RAM_SEC,MEM_AREA_IO_NSEC,MEM_AREA_IO_SEC,MEM_AREA_EXT_DT,MEM_AREA_RES_VASPACE,MEM_AREA_SHM_VASPACE,MEM_AREA_TA_VASPACE,MEM_AREA_PAGER_VASPACE,MEM_AREA_SDP_MEM,MEM_AREA_DDR_OVERALL,MEM_AREA_SEC_RAM_OVERALL,MEM_AREA_MAXTYPE };(2)、static_memory_map 靜態(tài)全局數(shù)組的定義
static struct tee_mmap_region static_memory_map[CFG_MMAP_REGIONS];CFG_MMAP_REGIONS為平臺的配置,如配置 CFG_MMAP_REGIONS = 23
(3)、init_mem_map() 創(chuàng)建頁表
在構(gòu)造好static_memory_map結(jié)構(gòu)體數(shù)組之后,調(diào)用init_mem_map() 即可遍歷數(shù)組去創(chuàng)建L1 L2 L3頁表, init_mem_map()的原型如下:
static unsigned long init_mem_map(struct tee_mmap_region *memory_map, size_t num_elems, unsigned long seed)其中memory_map為數(shù)組的首地址, num_elems為結(jié)構(gòu)體的個數(shù), seed是ALSR(地址隨機)用的種子.
(3)、static_memory_map 數(shù)組的填充
總結(jié)
以上是生活随笔為你收集整理的optee中MMU内存管理模型-页表的建立模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 经典面试题-Linux Kernel面试
- 下一篇: OPTEE的内存管理 : 将内存加入到页