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

ioctl compat_ioctl unlock_ioctl <br />区别:<br />ioctl 和 unlock_ioctl <br />ioctl 不会lock_kernel()<br /> <br />compat_ioctl被使用在用户空间为32位模式,而内核运行在64位模式时。这时候,需要将64位转成32位。<br /> <br />引用<br />http://blog.chinaunix.net/u1/38994/showart_2248151.html<br />对几个ioctl执行顺序的分析<br /> <br />关于ioctl,unlock 阅读详情

分析代码

	/* 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_EL1、TTBR0_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-优快云博客

ARM处理器 -- ARM64 MPIDR_EL1寄存器 本文目的在于理解MPIDR_EL1寄存器,掌握处理器亲和寄存器作用。 阅读详情

相关推荐

Linux内核框架之内核进程

前言 内核主要架构由五部分构成:内存管理,进程调度和管理,文件系统、设备管理和驱动,网络驱动。本系列文希望通过代码实践和参考文章的方式力争对这几个部分做出深入的了解。 目录 前言 一、Linux的进程介绍 1.进程 线程和轻量级进程 2.进程调度的结构组成 二、进程的静态描述 1.进程描述符 2.进程链表的维护 2.1运行队列 2.2 等待队列 3.进程间关系 4.进程切换 一、Linux的进程介绍 1.进程 线程和轻量级进程 进.............

weixin_39077305的博客 3243

Linux系统调用源码分析(三)

前文讲了Linux系统调用的定义、函数实现及系统处理的流程。现在我们继续以ARMv8为例讲一下与系统调用相关的异常处理的内容,包括异常的级别与类型,异常向量表,系统调用的异常处理源码等。 一、异常的级别与类型 按ARM官方文档中的定义,“Exceptions are conditions or system events that require some action by privileged software (an exception handler) to ensure smooth.

weixin_39094034的博客 1048

基于aarch64分析kernel源码 三:启动代码分析

1、通过__HEAD将启动代码链接到文件开始位置。2、调用y ,进行初始化相关操作。3、调用调用函数。4、函数进入C语言环境初始化内核。

OnlyLove_的博客 1825

Armv8架构虚拟化介绍

这里我们将介绍一些基础的Hypervisor和虚拟化的理论知识。如果你已经有一定的基础或是已经熟悉了这些概念,可以跳过这部分内容。我们用Hypervisor这个词来定义一种负责创建,管理以及调度虚拟机(Virtual Machines, VMs)的软件。Stage 2 转换允许Hypervisor控制虚拟机的内存视图。具体来说,其可以控制虚拟机是否可以访问特定的某一块物理内存,以及该内存块出现在虚拟机内存空间的位置。这种能力对于虚拟机的隔离和沙箱功能来说至关重要。

cy413026的博客 1394

ARM64 Linux中断向量表与汇编处理全解析:从硬件响应到C语言入口

中断机制是计算机系统中处理异步事件的核心基础,它允许CPU在执行任务时,能够即时响应外部硬件请求。其工作原理是,当外设触发中断信号时,CPU会暂停当前执行流,保存现场状态,并根据预设的规则跳转到特定的处理程序。这一机制对于实现高并发、低延迟的系统至关重要,是驱动开发、操作系统调度和性能优化的技术基石。在ARM64架构的Linux内核中,这一过程始于异常向量表(Exception Vector Table),它作为硬件与软件约定的“应急地图”,由VBAR_ELx寄存器定位。当中断发生时,CPU会根据异常类型和

weixin_34008933的博客 515

RK3588部署Zipformer模型问题总结

本文分享了在RK3588嵌入式设备上部署小米Zipformer语音识别模型时遇到的问题及解决方法。主要遇到两个问题:1)在rknn_model_zoo例程编译时出现静态库版本不兼容,通过重新编译kaldi-native-fbank库并修改链接路径解决;2)sherpa-onnx编译时提示缺少portaudio库,通过修改编译脚本启用相关宏定义后成功编译。最终成功在RK3588上运行Zipformer模型,测试结果显示该模型具有较好的识别效果和实时性(RTF=0.22),验证了其在边缘设备上的适用性。

pkyang2004的博客 2145

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

【代码】慢慢欣赏arm64内核启动7 primary_entry之el2_setup代码第五部分。

shipinsky的博客 894

多传感器标定全栈系统学习教程

无论是激光雷达(Lidar)、毫米波雷达(Radar)、相机(Camera)还是惯导(IMU),传感器之间的精确标定直接决定了系统的可靠性与性能。本文将以系统化的视角,梳理多传感器标定的核心知识体系,并分享一套覆盖全栈技术的学习路径。Calibration)是实现点云与图像融合的前提,而雷达与车辆的标定(Radar2Car)则是精准速度估计的关键。:Lidar2Car、Camera2Car的快速标定流程,标定板布置规范。:从单传感器标定入手(如相机内参),逐步过渡到多传感器联合标定。

weixin_41792788的博客 904

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

【代码】慢慢欣赏arm64内核启动8 primary_entry之el2_setup代码第六部分。

shipinsky的博客 914

AIR780E二次开发点灯(LuatOS)

Air780E的LuatOS点灯教程,二次开发教程,可用于所有ec618平台,无需SDK

rootuseres的博客 1万+

全桥LLC谐振变换器设计与双环控制策略详解

LLC谐振变换器作为高频开关电源的核心拓扑,通过谐振腔实现软开关特性,显著提升转换效率(可达96%以上)。其工作原理基于谐振电感、电容的协同作用,当开关频率接近谐振点时实现ZVS/ZCS。在工业电源、电动汽车充电等场景中,电压电流双环控制策略通过引入电流内环和竞争仲裁机制,有效改善动态响应(实测负载跳变时电压跌落减少60%)。数字控制实现时需注意ADC采样同步和PWM更新时序,而谐振参数测量与温升管理则是工程实践的关键。

weixin_29189987的博客 257

慢慢欣赏arm64内核启动20 primary_entry之__cpu_setup代码第二部分

【代码】慢慢欣赏arm64内核启动20 primary_entry之__cpu_setup代码第二部分。

shipinsky的博客 1030

【华为OD】华为性格测试(综合测试)高分策略

1、性格测试非常重要,是一次否决制,18 个月有效期,所以态度一定要认真对待,不要随便乱选;2、做题原则:正向原则,积极乐观向上3、时间为 25-30 分钟,会频繁出现重复选项重复出现的题目注意一致性。

笑着的程序员的博客 3万+

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

el2_setup继续执行就到了EL2异常等级的虚拟化部分的解析和处理部分。

shipinsky的博客 925

Isaac Lab 强化学习全身控制策略 Sim2Real 宇树人形机器人训练部署 HOVER

《IsaacLab策略训练与部署指南》提供了在仿真和真实机器人上实现HOVER全身控制策略的完整流程。主要内容包括:1) Linux环境下的IsaacLab安装与HOVER资源库配置;2) 使用1024个并行环境训练教师/学生策略的详细步骤;3) 策略测试与评估方法;4) Sim2Sim仿真验证和Sim2Real真实机器人部署方案。本教程特别针对Unitree H1仿人机器人,包含运动数据准备、策略训练、性能评估到硬件部署的全链条实现方案,为机器人控制策略开发提供标准化参考框架。

机器人控制与仿真应用 3070

YOLOv11改进策略【卷积层】| CVPR 2024 可变形卷积 v4(DCNv4)无界权重提表达 + 线程合并降冗余,强化模型收敛速度

DCNv4(Deformable Convolution v4)是一种专为广泛视觉应用设计的高效算子,它对DCNv3进行了关键改进,有效解决了DCNv3存在的速度慢和表达能力受限等问题。

Limiiiing的博客 925

慢慢欣赏arm64内核启动23 primary_entry之__cpu_setup代码第五部分

CONFIG_ARM64_HW_AFDBM 是 Linux 内核的一个配置选项,用于启用 ARMv8.1 架构扩展中的硬件功能,该功能支持硬件更新页面表项中的访问(Access)和脏(Dirty)标志位。同样,如果向设置了 DBM 位的只读页面写入,将清除只读位(AP[2]),而不是触发权限故障。当在 TCR_EL1 寄存器(HA 和 HD 位)上启用此功能时,如果访问了清除了 PTE_AF 位的页面,则会设置该位,而不是触发访问标志故障。第2行到第6行为注释,含义为使能“硬件访问标记位”。

shipinsky的博客 879

HSTS漏洞(缺少Strict-Transport-Security头)

HTTP严格传输安全性(HSTS)告诉浏览器只能使用HTTPS访问网站。检测到您的Web应用程序未实现HTTP严格传输安全性(HSTS),因为响应中缺少严格传输安全性标头。理想回复响应头因存在:Strict-Transport-Security: max-age=31536000信息。nginx添加响应头。

墨痕诉清风的博客 4409

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

解析完虚拟化部分,我们继续分析启动过程中,对中断控制器的处理。

shipinsky的博客 814

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

在该宏定义里面,ID_AA64MMFR0_EL1, AArch64 Memory Model Feature Register 0。第4行涉及到宏定义 tcr_compute_pa_size 和 TCR_IPS_SHIFT。提供 EL1 异常模式下 内存模型和内存管理的信息,涉及到的宏定义如下。第1到第3行是注释,含义是设置 TCR_EL1 的 IPS 域。其中,tcr_compute_pa_size 的定义如下。我们可以看到 bit[3] 始终为0, 所以可以忽略掉。

shipinsky的博客 890

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

分析完el2_setup的注释和代码段的位置之后,我们正式开始学习el2_setup的实现。

shipinsky的博客 423

慢慢欣赏arm64内核启动21 primary_entry之__cpu_setup代码第三部分

展示代码 /* * Set/prepare TCR and TTBR. We use 512GB (39-bit) address range for * both user and kernel. */ mov_q x10, TCR_TxSZ(VA_BITS) | TCR_CACHE_FLAGS | TCR_SMP_FLAGS | \ TCR_TG_FLAGS | TCR_KASLR_FLAGS | TCR_ASID16 | \ TCR_TBI0 | TCR_A1 | TC

shipinsky的博客 1277

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

【代码】慢慢欣赏arm64内核启动9 primary_entry之el2_setup代码第七部分。

shipinsky的博客 323

慢慢欣赏arm64内核启动24 primary_entry之__cpu_setup代码第六部分

第1行到第3行是注释,准备寄存器 SCTLR,SCTLR 是什么东东我们继续分析。第4行涉及宏定义 SCTLR_EL1_SET,定义如下。

shipinsky的博客 1199

慢慢欣赏arm64内核启动19 primary_entry之__cpu_setup代码第一部分

也就是说,位域bit12设置为1时,在EL0异常等级下,访问 MDCCSR_EL0, DBGDTR_EL0, DBGDTRTX_EL0, and DBGDTRRX_EL0 将会切换到 EL1 异常等级。第14, 15行涉及的寄存器 CPACR_EL1, Architectural Feature Access Control Register 的位域 bits[21:20]daifclr 涉及到 pstate 寄存器的 bits[9:6],分别是 DAIF,8对应 bit[9],表示清除调试掩码。

shipinsky的博客 1129

慢慢欣赏arm64内核启动2 primary_entry之el2_setup注释部分

primary_entry执行完保存参数的函数后,进入el2_setup函数查看调用函数的注释,含义是切换到EL1模式,出参为w0,保存进入内核时的异常等级。看到这个注释,我联想起异常返回章节的通过sppr_elX和elr_elX切换异常等级的方法,我们分析代码看看是否这样实现的。该函数较长,我们分段进行欣赏。

shipinsky的博客 348
上一篇: 慢慢欣赏arm64内核启动5 primary_entry之el2_setup代码第三部分
下一篇: 慢慢欣赏arm64内核启动7 primary_entry之el2_setup代码第五部分
天麓
博客等级 码龄22年 323粉丝 437原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值