optee中MMU内存管理模型-页表的建立模型

思考:
1、__identity_map_init_start 的干啥的,作用? ----看起来是给ALSR用的,暂且不研究

MMU页表的创建模型,在optee os系统中,有很多种类型的memory,详见teecore_memtypes,每一种内存类型(或者说每一块内存)都可以使用tee_mmap_region结构体来描述。而在系统启动的时候,需要先map一些内存,表示这些内存的结构体,又是放在一个名为static_memory_map的静态全局数组中的(固定大小的,如MAX index = 23)
optee中MMU内存管理模型-页表的建立模型_第1张图片
在开机启动阶段,事实上就填充了一个结构体,表示__nozi_start - __nozi_end 区间.
optee中MMU内存管理模型-页表的建立模型_第2张图片
总结在开机阶段就map了一小块内存 : __nozi_start - __nozi_end 区间 ,并且是一一映射哦!!

optee中MMU内存管理模型-页表的建立模型_第3张图片

(1)、teecore_memtypes 和 tee_mmap_region 结构体原型

非常重要的两个结构体teecore_memtypestee_mmap_region

optee中MMU内存管理模型-页表的建立模型_第4张图片

(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(地址随机)用的种子.

(3)、static_memory_map 数组的填充

你可能感兴趣的:(optee,optee)