天天看点

在enable mmu之前可以使用mmu了

在enable mmu之前可以使用mmu吗? 很多人也许都没用思考过这个问题,或者认为太简单了,这不废话吗,在enable mmu之前,怎么可能使用mmu呢…

其实这就是大家的一个误区。事实上只要Core一上电,MMU就可以使用的,只不过是如果你没用开启

SCTLR.M

比特,PE发起的读写不会自动经过MMU翻译,当然这个时候你是可以手动执行

AT

指令进行翻译的,在翻译的时候如果你没用配置也页表、基地址、TCR等寄存器,MMU在翻译也会报错。

下面我们以optee os代码为例,展示一下在enable MMU之前,就使用了地址翻译的这种情况:

void core_init_mmu_regs(struct core_mmu_config *cfg)
 {
 	uint64_t ips = get_physical_addr_size_bits();
 	uint64_t mair = 0;
 	uint64_t tcr = 0;
 
 	cfg->ttbr0_el1_base = virt_to_phys(l1_xlation_table[0][0]);
 	cfg->ttbr0_core_offset = sizeof(l1_xlation_table[0][0]);
 
 	mair  = MAIR_ATTR_SET(ATTR_DEVICE, ATTR_DEVICE_INDEX);
 	mair |= MAIR_ATTR_SET(ATTR_IWBWA_OWBWA_NTR, ATTR_IWBWA_OWBWA_NTR_INDEX);
 	cfg->mair_el1 = mair;
 
 	tcr = TCR_RES1;
 	tcr |= TCR_XRGNX_WBWA << TCR_IRGN0_SHIFT;
 	tcr |= TCR_XRGNX_WBWA << TCR_ORGN0_SHIFT;
 	tcr |= TCR_SHX_ISH << TCR_SH0_SHIFT;
 	tcr |= ips << TCR_EL1_IPS_SHIFT;
 	tcr |= 64 - CFG_LPAE_ADDR_SPACE_BITS;
 
 	/* Disable the use of TTBR1 */
 	tcr |= TCR_EPD1;
 
 	/*
 	 * TCR.A1 = 0 => ASID is stored in TTBR0
 	 * TCR.AS = 0 => Same ASID size as in Aarch32/ARMv7
 	 */
 	cfg->tcr_el1 = tcr;
 }
           
在enable mmu之前可以使用mmu了

继续阅读