思考:
1、__identity_map_init_start
的干啥的,作用? ----看起来是给ALSR用的,暂且不研究
MMU页表的创建模型,在optee os系统中,有很多种类型的memory,详见teecore_memtypes,每一种内存类型(或者说每一块内存)都可以使用tee_mmap_region结构体来描述。而在系统启动的时候,需要先map一些内存,表示这些内存的结构体,又是放在一个名为static_memory_map的静态全局数组中的(固定大小的,如MAX index = 23)
在开机启动阶段,事实上就填充了一个结构体,表示__nozi_start
- __nozi_end
区间.
总结:在开机阶段就map了一小块内存 : __nozi_start
- __nozi_end
区间 ,并且是一一映射哦!!
(1)、teecore_memtypes 和 tee_mmap_region 结构体原型
非常重要的两个结构体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 静态全局数组的定义
static struct tee_mmap_region static_memory_map[CFG_MMAP_REGIONS];
CFG_MMAP_REGIONS
为平台的配置,如配置 CFG_MMAP_REGIONS = 23
(3)、init_mem_map() 创建页表
在构造好static_memory_map
结构体数组之后,调用init_mem_map() 即可遍历数组去创建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
为数组的首地址, num_elems
为结构体的个数, seed
是ALSR(地址随机)用的种子.