ARM64 Linux head.S flat address mapping分析

本文详细分析了ARM64 Linux内核引导时的flat地址映射,解释了在MMU关闭状态下,物理地址与虚拟地址相等的原理。讨论了ARM64 CPU的地址空间结构,包括物理内存和虚拟地址空间,以及Linux内核如何在引导阶段使用TTBR0_EL1和TTBR1_EL1进行地址转换。在MMU重新启用时,identity mapping的作用确保了平滑过渡。
摘要由CSDN通过智能技术生成

走读 arch/arm64/kernel/head.S 代码时,发现一些关键点需要厘清,这里记录下来:

ARM64 flat address mapping

支持MMU功能的CPU在MMU没有开启(如上电复位时或者人为关闭)的情况下都有相关机制,ARM中采用flat address mapping。
ARM在DDI0487A_k_armv8_arm文档中对flat address mapping描述如下:

Flat address mapping
                 Is where the physical address for every access is equal to its virtual address.

也就是pa==va,没有基地址+偏移。
同时该文档在D4.2.8 The effects of disabling a stage of address translation谈到对AARCH64 MMU stage1/stage2 disable时特性,包括数据与地址访问。

至于MMU什么时候disable,在SCTLR_EL1.M/SCTLR_EL2.M/SCTLR_EL3.M描述时指出When this register has an architecturally-defined reset value, this field resets to 0.
这样在CPU复位上电后MMU是Disable。

Linux内核引导时地址映射要求

ARM64 Linux内核在引导时也要MMU disable,具体见head.S文件:

// arch/arm64/kernel/head.S
/*
 * Kernel startup entry point.
 * ---------------------------
 *
 * The requirements are:
 *   MMU = off, D-cache = off, I-cache = on or off,
 *   x0 = physical address to the FDT blob.
 *
 * This code is mostly position independent so you call this at
 * __pa(PAGE_OFFSET + TEXT_OFFSET).
 *
 * Note that the callee-saved registers are used for storing variables
 * that are useful before the MMU is enabled. The allocations are described
 * in the entry routines.
 */

归纳起来,Linux在引导时MMU关闭,pa==va。这里实际上也是内核对boot loader类程序在跳入Linux内核执行时对CPU状态设置要求。

ARM64 CPU flat address mapping特性

ARM64 CPU地址空间

主要包括两部分:物理内存地址空间和虚拟地址空间

A

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值