在enable mmu之前可以使用mmu了

本文探讨了一个常见的误解:即在启用MMU前无法使用内存管理单元(MMU)。实际上,MMU自处理器上电后即可使用,但若未正确配置,则不会自动介入地址转换过程。文章通过分析opteeos源码示例,展示了即使在MMU未完全启用的情况下如何进行手动地址转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速链接:
.
👉👉👉 个人博客笔记导读目录(全部) 👈👈👈

在这里插入图片描述

在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;
 }

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arm精选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值