当前位置: 首页 > news >正文

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

分析代码

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

#ifdef CONFIG_ARM_GIC_V3/* GICv3 system register access */mrs	x0, id_aa64pfr0_el1ubfx	x0, x0, #ID_AA64PFR0_GIC_SHIFT, #4cbz	x0, 3fmrs_s	x0, SYS_ICC_SRE_EL2orr	x0, x0, #ICC_SRE_EL2_SRE	// Set ICC_SRE_EL2.SRE==1orr	x0, x0, #ICC_SRE_EL2_ENABLE	// Set ICC_SRE_EL2.Enable==1msr_s	SYS_ICC_SRE_EL2, x0isb					// Make sure SRE is now setmrs_s	x0, SYS_ICC_SRE_EL2		// Read SRE back,tbz	x0, #0, 3f			// and check that it sticksmsr_s	SYS_ICH_HCR_EL2, xzr		// Reset ICC_HCR_EL2 to defaults3:
#endif

系统寄存器ID_AA64PFR0_EL1

第3行 ID_AA64PFR0_EL1 表示系统寄存器 AArch64 Processor Feature Register 0
芯片手册这样描述该寄存器:Provides additional information about implemented PE features in AArch64 state
也就是说,该寄存器描述了AArch64下PE的一些附加扩展信息
该寄存器的值被读取到了x0寄存器中

第4行ID_AA64PFR0_GIC_SHIFT的宏定义如下:

#define ID_AA64PFR0_GIC_SHIFT		24

我们从芯片手册查看系统寄存器 id_aa64pfr0_el1 的bit[27:24],其含义如下:
GIC, bits [27:24] 
System register GIC interface support. Defined values are:
0b0000 No System register interface to the GIC is supported.
0b0001 System register interface to versions 3.0 and 4.0 of the GIC CPU interface is supported.
All other values are reserved.
bit[27:24]的值如果为1,则表示支持中断控制器的系统控制器接口;如果值为0,则表示不支持中断控制器的系统寄存器接口
该行语句把bit[27:24]提取出来并重新放到了x0寄存器里面

第5行表示,如果刚才提取的值为0,则表示不支持中断控制器系统寄存器的访问,则不需要对中断控制器系统寄存器的配置,直接跳转到第17行,标号3。
如果为0,则继续执行。

中断相关寄存器ICC_SRE_EL2

第7行,ICC_SRE_EL2, Interrupt Controller System Register Enable register (EL2)表示中断控制器使能寄存器
我们把其值获取并存放在x0寄存器中

第8行,ICC_SRE_EL2_SRE 的宏定义如下:

#define ICC_SRE_EL2_SRE			(1 << 0)

SRE, bit [0]
System Register Enable.
0b0 The memory-mapped interface must be used. Access at EL2 to any ICH_* or ICC_* register other than ICC_SRE_EL1 or ICC_SRE_EL2, is trapped to EL2.
0b1 The System register interface to the ICH_* registers and the EL1 and EL2 ICC_*  registers is enabled for EL2
其中ICH_ 和 ICC_ 寄存器**:这些寄存器是中断控制器(Interrupt Controller)的一部分,用于管理中断和异常。ICH(Interrupt Controller Host)和ICC(Interrupt Controller Client)寄存器集包含了控制中断行为的寄存器。不同的寄存器有不同的功能,比如设置中断优先级、使能或禁用中断等。
ICC_SRE_EL1 和 ICC_SRE_EL2:这两个寄存器是特定于安全性的寄存器,用于控制中断在系统寄存器(System Register)访问时的安全行为。它们分别在EL1(异常级别1,通常用于用户空间和操作系统内核)和EL2级别提供对中断安全行为的控制。
捕获(Trapped):在ARM架构中,当某个操作或访问尝试违反了当前执行级别的权限或规则时,这个操作会被“捕获”。在虚拟化环境中,这通常意味着控制权会被转移到虚拟机监控器(Hypervisor),后者会决定如何处理这个违反情况
也就是说,该寄存器bit[0]如果设置为0,则表示如果我们在EL2级别尝试访问ICH或ICC系列中的任何寄存器(除了ICC_SRE_EL1和ICC_SRE_EL2这两个安全性寄存器),这个访问请求会被捕获,并且控制权会被转移到EL2级别的处理程序(如虚拟机监控器),而不是直接执行该访问操作。这样的设计有助于保护中断控制器的关键寄存器不被不适当或未授权的访问所影响。
如果寄存器bit[0]的值为1,对于EL2级别,通过系统寄存器访问ICH_寄存器以及EL1和EL2级别的ICC_寄存器的系统寄存器接口是被使能的。
该行语句就是将bit[0]设置为1

第9行 ICC_SRE_EL2_ENABLE 的宏定义如下

#define ICC_SRE_EL2_ENABLE		(1 << 3)

芯片手册的描述如下:
Enable, bit [3]
Enable. Enables lower Exception level access to ICC_SRE_EL1.
0b0 When EL2 is implemented and enabled in the current Security state, EL1 accesses to ICC_SRE_EL1 trap to EL2.
0b1 EL1 accesses to ICC_SRE_EL1 do not trap to EL2.
意思是,该bit规定了较低级别的异常级别对于 ICC_SRC_EL1 的访问。
如果bit[3]为0,则表示EL1异常级别下如果访问系统寄存器 ICC_SRE_EL1 将陷入到 EL2
如果bit[3]为1,则EL1异常级别下如果访问系统寄存器 ICC_SRE_EL1 不会陷入到 EL2。
简而言之,ICC_SRE_EL2_ENABLE的位[3]是一个控制位,用于决定EL1级别的软件是否可以直接访问ICC_SRE_EL1寄存器,或者其访问是否应该被捕获到EL2级别进行进一步的处理。这在实现虚拟化或安全隔离时非常有用,因为它允许虚拟机监控器控制虚拟机内操作系统对中断安全寄存器的访问。
该行语句将bit[3]设置为1

第10行表示将刚才设置的bit[0]和bit[3]回写到系统寄存器 ICC_SRE_EL2 中。

第12行表示重新读取 ICC_SRE_EL2 寄存器x0

第13行使用tbz指令,该指令的含义如下:
在ARM64架构的上下文中,tbz是一个条件分支指令,全称是“Test and Branch if Zero”。这个指令用于测试一个寄存器中的指定位是否为0,并根据结果决定是否进行分支跳转
也就是说,我们设置完ICC_ SRE_EL2 的bit0]和bit[3]之后,重新读取 ICC_SRE_EL2 寄存器x0之后,判断bit[0]是否为0,如果为0,则跳转到16行,否则继续执行下一行语句

中断相关寄存器ICH_HCR_EL2

第14行涉及到ICH_HCR_EL2,该寄存器全称Interrupt Controller Hyp Control Register,即中断控制器超维控制寄存器,是ARM架构中的一个系统寄存器,特别是在支持虚拟化(如GICv3或更高版本)的ARMv8-A架构中非常关键。这个寄存器用于控制中断控制器(如GIC,即Generic Interrupt Controller)在虚拟化环境下的行为,特别是在处理物理中断和虚拟中断时的交互和路由。
我们在这里将该寄存器清零,后续启动过程中进行初始化。

http://www.lryc.cn/news/412348.html

相关文章:

  • 初谈Linux多线程--线程控制
  • 文件工具类 - FileUtils
  • Kafka源码剖析-Producer基于内存缓存池分配ByteBuffer
  • 实习十九:学习笔记
  • OrionX:革新GPU资源管理,助力AI开发团队高效运作
  • RabbitMQ发送者重连、发送者确认
  • 请转告HPC计算AI计算单位,选对存储事半功倍
  • [GYCTF2020]Blacklist1
  • Blackcat V2.2付费会员制WordPress资源站主题
  • 动手学强化学习 第 18 章 离线强化学习 训练代码
  • Python笔试面试题AI答之面向对象常考知识点
  • 面试经典算法150题系列-数组/字符串操作之买卖股票最佳时机
  • 安装jdk和tomcat
  • mongodb 备份还原
  • day27——homework
  • shell脚本自动化部署
  • C语言| 文件操作详解(二)
  • 保证项目如期上线,测试人能做些什么?
  • 【杂谈】在大学如何学得计算机知识,浅谈大一经验总结
  • Superset二次开发之柱状图实现同时显示百分比、原始值、汇总值的功能
  • 堆的创建和说明
  • 【玩转python】入门篇day14-函数
  • uni-app 将base64图片转换成临时地址
  • C#用Socket实现TCP客户端
  • jmeter-beanshell学习15-输入日期,计算前后几天的日期
  • Zabbix 7.0 安装
  • 软考高级-系统架构设计师
  • Notepad++ 安装 compare 插件
  • 大数据技术原理-spark的安装
  • 第四范式上线搜广推一体化平台 赋能企业高效增长