本文共 1401 字,大约阅读时间需要 4 分钟。
#arch/arm64/mm/proc.SENTRY(__cpu_setup)
1. 清空 Instruction Cache (ICache)
执行iallu指令,强制清空ICache的所有缓存线,以确保在进入分区优化(PoU)阶段时内存访问处于一致状态。2. TLB Invalidating
调用tlbi vmalle1is指令,通过猜测操作对TLB(Translation Lookaside Buffer)进行全局无效化。vmalle1is参数设置为e1(适用于EL1层次)和is(内共享)。3. Memory Barrier (DSB)
执行dsb ish指令,确保在MMU开启之前,TLB无效化和ICache清空操作已经完成。这一操作保证了TLB和ICache的状态一致性。4. Architectural Feature Control
设置CPACR_EL1和MDSCR_EL1寄存器:mov x0, #3 << 20msr cpacr_el1, x0msr mdscr_el1, xzr
CPACR_EL1用于控制浮点运算单元(FPE)和SIMD单元的访问权限。MDSCR_EL1用于管理调试系统的状态。
5. Memory Attribute Setup
加载MAIR_EL1寄存器,配置内存区域属性:ldr x5, =MAIR(0x00, MT_DEVICE_nGnRnE) | \ MAIR(0x04, MT_DEVICE_nGnRE) | \ MAIR(0x0c, MT_DEVICE_GRE) | \ MAIR(0x44, MT_NORMAL_NC) | \ MAIR(0xff, MT_NORMAL)msr mair_el1, x5
该配置定义了内核和用户空间的内存属性,包括设备nGnRnE、nGnRE、普通区域等。
6. SCTLR_EL1准备
获取SCTLR_EL1值并存储在x0寄存器中,作为__enable_mmu函数的参数。通过crval变量获取TCR寄存器的值,并进行必要的二进制操作:adr x5, crvalldp w5, w6, [x5]mrs x0, sctlr_el1bic x0, x0, x5orr x0, x0, x6msr tcr_el1, x10
TCR寄存器用于定义内核和用户空间的地址范围及页表属性。
7. MMU开启准备完成
函数执行完毕后,返回至__enable_mmu函数,完成MMU的最终开启。转载地址:http://pnqd.baihongyu.com/