快速链接:
.
个人博客笔记导读目录(全部)
- 付费专栏-付费课程 【购买须知】:
- 【精选】ARMv8/ARMv9架构入门到精通-[目录]
在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;
}