慢慢欣赏arm64内核启动6 primary_entry之el2_setup代码第四部分

分析代码

	/* Populate ID registers. */
	mrs	x0, midr_el1
	mrs	x1, mpidr_el1
	msr	vpidr_el2, x0
	msr	vmpidr_el2, x1

#ifdef CONFIG_COMPAT
	msr	hstr_el2, xzr			// Disable CP15 traps to EL2
#endif

ID寄存器

第一行注释的含义是:填充 ID 寄存器簇。

第二行的含义是把 midr_el1 寄存器的内容填充到x0寄存器里。其中,midr_el1 的含义如下:
MIDR_EL1, Main ID Register
Provides identification information for the PE, including an implementer code for the device and a device ID number.
提供PE的身份鉴别信息,包括设备的实现者代码和设备ID号。
该寄存器有很多域,有的域提供了ARM的厂家编码信息,有的域提供了ARM的版本信息,细节详见芯片手册。

第三行的含义是把 mpidr_el1 寄存器的内容填充到x1寄存器里,其中,mpidr_el1的含义如下:
MPIDR_EL1, Multiprocessor Affinity Register
In a multiprocessor system, provides an additional PE identification mechanism for scheduling purposes.
该寄存器是一个多核亲和性寄存器,为调度目的提供了额外的PE识别机制。

第四行的含义是将x0寄存器的值存放到 vpidr 寄存器里面,根据芯片手册的描述,
Holds the value of the Virtualization Processor ID. This is the value returned by EL1 reads of  MIDR_EL1.
vpidr 寄存器是虚拟化芯片ID寄存器,与 midr_el1具有相同的字段分布
将x0的内容赋值到 vpidr_el2 寄存器;

这行代码的含义是 在虚拟化场景中,VPIDR_EL2 会作为虚拟机看到的 MIDR_EL1 的值,通常用于掩盖真实硬件信息。

第5行的含义是将x1的值赋值到 vmpidr_el2,根据芯片手册的描述
VMPIDR_EL2, Virtualization Multiprocessor ID Register
Holds the value of the Virtualization Multiprocessor ID. This is the value returned by EL1 reads of MPIDR_EL1.
该寄存器是虚拟化多核ID寄存器,该值是MPIDR_EL1的返回值。

这行代码的含义是虚拟机通过 VMPIDR_EL2 获取处理器的亲和性信息,Hypervisor 可能修改此值以虚拟化多核拓扑。

总之,上述4行代码的用途如下:

当客户机操作系统查询处理器 ID 时,得到的是虚拟化后的 ID,而非真实的硬件 ID。为 ARM 架构的虚拟化环境配置处理器标识信息,确保客户机操作系统能够正常运行,同时实现对底层硬件的抽象。

CONFIG_COMPAT

第7行,CONFIG_COMPAT 在内核配置选项的含义如下:

  │ Symbol: COMPAT [=y]                                                                                                                                                                                 │  
  │ Type  : bool                                                                                                                                                                                        │  
  │ Defined at arch/arm64/Kconfig:1274                                                                                                                                                                  │  
  │   Prompt: Kernel support for 32-bit EL

CONFIG_COMPAT 是一个内核配置选项,用于控制内核是否支持32位应用程序在64位系统上运行。
当这个选项被启用时(通常在内核配置文件中设置为y或m),内核将包含必要的代码和机制来支持32位应用程序的兼容执行。

HSTR_EL2

第8行,根据芯片手册, HSTR_EL2 的描述如下:
HSTR_EL2, Hypervisor System Trap Register
Controls trapping to EL2 of EL1 or lower AArch32 accesses to the System register in the coproc == 0b1111 encoding space,
by the CRn value used to access the register using MCR or MRC instruction.
When the register is accessible using an MCRR or MRRC instruction,
this is the CRm value used to access the register.

含义如下:
HSTR_EL2 是ARM架构中的一个寄存器,全称是 Hypervisor System Trap Register EL2,属于异常级别2(EL2)的寄存器。
这个寄存器主要用于虚拟化环境中,特别是在hypervisor(宿主操作系统)层面,用于控制和管理虚拟机(guest OS)的异常和中断处理。

在ARM架构的虚拟化环境中,EL2是hypervisor运行的异常级别,而虚拟机操作系统(guest OS)则在更低的异常级别EL1运行。
HSTR_EL2 寄存器的作用是让hypervisor能够配置和控制哪些异常和中断应该被转交给虚拟机操作系统处理,哪些应该被hypervisor自己截获并处理。

详细一点:控制当EL1或更低特权级的AArch32状态访问协处理器编码空间为0b1111的系统寄存器时,是否陷入EL2。该控制基于使用MCR或MRC指令访问寄存器时所用的CRn值。具体如下

  1. 寄存器作用:HSTR_EL2 (Hypervisor System Trap Register) 是ARMv8架构中EL2(虚拟化层)的一个控制寄存器,用于管理系统寄存器访问的陷阱(trap)行为。

  2. 触发条件

    • 当运行在EL1或EL0(非特权级)的AArch32代码

    • 尝试访问协处理器编码空间为0b1111(CP15)的系统寄存器时

    • 使用MCR(从寄存器到协处理器)或MRC(从协处理器到寄存器)指令

  3. 控制机制

    • 该寄存器的每一位对应一个特定的CRn值(控制寄存器编号)

    • 当某位被设置为1时,对应CRn的系统寄存器访问将触发陷阱到EL2

    • 允许hypervisor监控和模拟某些系统寄存器的访问

  4. 应用场景

    • 虚拟化环境中,hypervisor可以捕获guest OS对关键系统寄存器的访问

    • 实现寄存器访问的重定向或模拟

    • 提供对硬件资源的隔离和保护

  5. 典型使用

    • 在虚拟化设置阶段配置HSTR_EL2

    • 确定哪些系统寄存器访问需要被hypervisor拦截

    • 结合其他陷阱控制寄存器(如HCR_EL2)共同工作

这个寄存器是ARM虚拟化扩展的重要组成部分,使得hypervisor能够精细控制guest OS对系统资源的访问。

在32位兼容模式下,希望访问CP15不会陷入到EL2,所以就将HSTR_EL2清零。

协处理编码空间0b1111的解释

在ARM架构中,"协处理器编码空间为0b1111的系统寄存器"指的是通过AArch32的CP15协处理器(编号15,二进制1111)访问的那些系统控制寄存器。

详细解释:

  1. 协处理器编号

    • 在AArch32状态下,系统寄存器是通过协处理器指令(MRC/MCR)访问的

    • 协处理器编号(coproc)用4位二进制表示,范围0-15(0b0000到0b1111)

    • 0b1111(十进制15)对应的是CP15,这是专门用于系统控制的协处理器

  2. CP15寄存器

    • CP15包含所有关键的系统控制寄存器

    • 包括:MMU配置、缓存控制、安全状态、进程ID等

    • 访问时需要指定:

      • CRn:主寄存器编号(控制寄存器编号)

      • opc1/opc2:操作码

      • CRm:辅助寄存器编号

  3. 典型CP15系统寄存器举例

    • TTBR0/TTBR1(转换表基址寄存器)

    • DACR(域访问控制寄存器)

    • SCTLR(系统控制寄存器)

    • ACTLR(辅助控制寄存器)

    • CONTEXTIDR(上下文ID寄存器)

  4. 与HSTR_EL2的关系

    • HSTR_EL2的每一位对应一个CRn编号(如bit0对应CR0,bit1对应CR1等)

    • 当EL1尝试访问特定CRn的CP15寄存器时,如果HSTR_EL2对应位为1,就会触发陷阱到EL2

    • 例如:设置HSTR_EL2.T0=1会捕获所有CRn=0的CP15访问(如SCTLR)

为什么重要?

在虚拟化环境中,hypervisor需要捕获guest OS对这些关键系统寄存器的访问,以:

  • 维持正确的虚拟化状态

  • 防止guest直接修改硬件配置

  • 实现寄存器虚拟化(如为每个VM维护独立的TTBR0)

CP15协处理器在ARM架构中的存在情况

1. AArch32

(32位ARM,如ARMv7、ARMv8 AArch32模式)

  • ✅ 存在:CP15(协处理器15)是AArch32的核心部分,用于访问系统控制寄存器(如MMU、缓存、安全状态等)。

  • 访问方式

    • 使用 MRC(从协处理器读)和 MCR(写协处理器)指令。

    • 例如:

      asm

      复制

      下载

      MRC p15, 0, <Rt>, c1, c0, 0  ; 读取SCTLR(系统控制寄存器)
      MCR p15, 0, <Rt>, c1, c0, 0  ; 写入SCTLR
  • 典型用途

    • 配置MMU(TTBR0/TTBR1)

    • 控制缓存(CSSELR, CLIDR)

    • 管理安全状态(SCR, NSACR)


2. AArch64

(64位ARM,如ARMv8/ARMv9的AArch64模式)

  • ❌ 不存在:AArch64 没有 CP15协处理器概念,系统寄存器改用直接访问方式(MSR/MRS指令)。

  • 访问方式

    • 使用 MRS(读系统寄存器)和 MSR(写系统寄存器)指令。

    • 例如:

      asm

      复制

      下载

      MRS X0, SCTLR_EL1   ; 读取SCTLR_EL1
      MSR SCTLR_EL1, X0    ; 写入SCTLR_EL1
  • 为什么没有CP15?

    • AArch64 简化了系统寄存器访问,不再依赖协处理器机制。

    • 每个寄存器有独立名称(如 SCTLR_EL1TTBR0_EL1),而不是通过 CRn/CRm/opc 编码。


3. 特殊情况

AArch64运行AArch32代码(混合模式)

  • ✅ 在EL0/EL1运行32位代码时

    • 如果CPU处于AArch32模式(如运行32位Linux或32位虚拟机),仍然会使用CP15访问系统寄存器。

    • HSTR_EL2的作用

      • 在虚拟化场景(EL2),HSTR_EL2 可以捕获这些AArch32的CP15访问,让Hypervisor模拟或重定向它们。


总结

架构/模式CP15 是否存在访问方式示例指令
AArch32✅ 存在MRC/MCRMRC p15, 0, R0, c1, c0, 0
AArch64❌ 不存在MRS/MSRMRS X0, SCTLR_EL1
AArch64运行AArch32✅ 存在(仅32位模式)MRC/MCRMCR p15, 0, R0, c2, c0, 0(TTBR0)

关键点

  • CP15是AArch32的概念,AArch64改用直接寄存器访问(SCTLR_EL1 而不是 CP15:c1:c0:0)。

  • 虚拟化场景(EL2)HSTR_EL2 主要用于捕获32位Guest OS(AArch32)的CP15访问,以便Hypervisor模拟或控制它们。

参考

参考1

arch/arm64/kernel/head.S文件——el2_setup函数分析

arch/arm64/kernel/head.S文件——el2_setup函数分析_mdcr-el2-优快云博客

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值