当前位置: 首页 > 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)在虚拟化环境下的行为,特别是在处理物理中断和虚拟中断时的交互和路由。
我们在这里将该寄存器清零,后续启动过程中进行初始化。

相关文章:

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

分析代码 解析完虚拟化部分&#xff0c;我们继续分析启动过程中&#xff0c;对中断控制器的处理 #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, x…...

初谈Linux多线程--线程控制

文章目录 线程的概述理解线程Linux中的线程重新理解的进程Windows的线程线程的优点线程的缺点理解线程调度成本低 进程VS线程 线程控制创建线程等待线程线程函数传参线程的返回值新线程的返回值新线程返回值错误返回值为类对象 创建多线程线程的终止线程的分离pthread_detach 线…...

文件工具类 - FileUtils

Slf4j Component public class FileUtils {/*** 文件夹复制到指定的文件夹*/SneakyThrowspublic static void copyDir(File source, File target) {if (!target.exists()) {boolean mkdirs target.mkdirs();}if (source.isDirectory()) {File[] files source.listFiles();if …...

Kafka源码剖析-Producer基于内存缓存池分配ByteBuffer

文章目录 在将消息发送到内存缓中区之前做的准备工作发送消息前的准备工作代码示例源码分析1. **消息序列化**2. **元数据准备**3. **分区选择**4. **批处理准备**总结大致浏览一下源码中将消息写入内存缓冲的运行流程源码分析1. **消息序列化和创建记录批次**2. **确定分区**3…...

实习十九:学习笔记

上午 1、构建vue发行版本 [rootserver ~]# cd eleme_web/ [rootserver eleme_web]# npm run buid //项目未执行时运行该命令&#xff0c;创建发行版本 [rootserver eleme_web]# cd dist/ //dist中包含发行版本的所有文件 [rootserver dist]# ls css favicon.ico i…...

OrionX:革新GPU资源管理,助力AI开发团队高效运作

您的AI开发团队是否经常陷入这样的窘境&#xff1a; 人多卡少&#xff0c;GPU资源难以满足每个成员的需求&#xff1f; 当开发环境中需要变更GPU卡配置时&#xff0c;流程繁琐不堪&#xff0c;不得不关闭容器、重新配置再重启&#xff1f; 是否曾因GPU卡分配后未被充分利用而…...

RabbitMQ发送者重连、发送者确认

RabbitMQ发送者重连、发送者确认 一、发送者重连 spring:rabbitmq:connection-timeout: 1s #设置MQ的连接超时时间template:retry:enabled: true #开启超时重试机制initial-interval: 1000ms #失败后的初始等待时间multiplier: 1 #失败后下次的等待时长倍数&#xff0c;下次等…...

请转告HPC计算AI计算单位,选对存储事半功倍

U.2 NVMe全闪混合统一存储GS 5000U是Infortrend产品中一款高性能机型。得益于搭载强劲的第五代IntelXeon处理器&#xff0c;以及支持PCIe 5.0、NVMe-oF、100GbE等多种特点&#xff0c;GS 5000U单台块级性能可达50 GB/s的读、20 GB/s的写&#xff0c;以及1300K的IOPS&#xff1b…...

[GYCTF2020]Blacklist1

打开题目 判断注入类型&#xff0c;输入1试试 输入2 输入1 判断为字符型注入 堆叠查询2;show databases;# 然后来输入2; show tables;#来查看数据库的表 然后我们通过FlagHere表来查看列输入2;show columns from FlagHere;# 来查看列 、 重新构造payload&#xff1a;0;HAND…...

Blackcat V2.2付费会员制WordPress资源站主题

Blackcat-付费会员制WordPress资源站主题&#xff0c;该主题是基于简约实用的主题选项框架 Codestar Framework 进行开发的功能强大的付费会员制主题&#xff0c;该主题尤其适合用于搭建付费下载资源网站&#xff0c;比如素材站、软件站、视频教程站等付费资源下载网站。 集成…...

动手学强化学习 第 18 章 离线强化学习 训练代码

基于 https://github.com/boyu-ai/Hands-on-RL/blob/main/%E7%AC%AC18%E7%AB%A0-%E7%A6%BB%E7%BA%BF%E5%BC%BA%E5%8C%96%E5%AD%A6%E4%B9%A0.ipynb 理论 离线强化学习 修改了警告和报错 运行环境 Debian GNU/Linux 12 Python 3.9.19 torch 2.0.1 gym 0.26.2 运行代码 CQL.…...

Python笔试面试题AI答之面向对象常考知识点

Python面向对象面试题面试题覆盖了Python面向对象编程&#xff08;OOP&#xff09;的多个重要概念和技巧&#xff0c;包括元类&#xff08;Metaclass&#xff09;、自省&#xff08;Introspection&#xff09;、面向切面编程&#xff08;AOP&#xff09;和装饰器、重载&#xf…...

面试经典算法150题系列-数组/字符串操作之买卖股票最佳时机

买卖股票最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易…...

安装jdk和tomcat

安装nodejs 1.安装nodejs&#xff0c;这是一个jdk一样的软件运行环境 yum -y list installed|grep epel yum -y install nodejs node -v 2.下载对应的nodejs软件npm yum -y install npm npm -v npm set config .....淘宝镜像 3.安装vue/cli command line interface 命令行接…...

mongodb 备份还原

### 加入 MongoDB 官方 repositoryecho [mongodb-org-4.4] nameMongoDB Repository baseurlhttps://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/ gpgcheck1 enabled1 gpgkeyhttps://www.mongodb.org/static/pgp/server-4.4.asc| tee /etc/yum.repos.d/mo…...

day27——homework

1、使用两个线程完成两个文件的拷贝&#xff0c;分支线程1拷贝前一半&#xff0c;分支线程2拷贝后一半&#xff0c;主线程回收两个分支线程的资源 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <fcntl.h> #include <uni…...

shell脚本自动化部署

1、自动化部署DNS [rootweb ~]# vim dns.sh [roottomcat ~]# yum -y install bind-utils [roottomcat ~]# echo "nameserver 192.168.8.132" > /etc/resolv.conf [roottomcat ~]# nslookup www.a.com 2、自动化部署rsync [rootweb ~]# vim rsync.sh [rootweb ~]# …...

C语言| 文件操作详解(二)

目录 四、有关文件的随机读写函数 4.1 fseek 4.2 ftell 4.3 rewind 五、判定文件读取结束的标准与读写文件中途发生错误的解决办法 5.1 判定文件读取结束的标准 5.2 函数ferror与feof 5.2.1 函数ferror 5.2.2 函数feof 在上一章中&#xff0c;我们主要介绍了文件类型…...

保证项目如期上线,测试人能做些什么?

要保证项目按照正常进度发布&#xff0c;需要整个研发团队齐心协力。 有很多原因都可能会造成项目延期。 1、产品经理频繁修改需求 2、开发团队存在技术难题 3、测试团队测不完 今天我想跟大家聊一下&#xff0c;测试团队如何保证项目按期上线&#xff0c;以及在这个过程中可能…...

【杂谈】在大学如何学得计算机知识,浅谈大一经验总结

大学新生的入门经验简谈 我想在学习编程这条路上&#xff0c;很多同学感到些许困惑&#xff0c;摸爬滚打一年&#xff0c;转眼就要进入大二学习了&#xff0c;下面浅谈个人经验与反思总结。倘若说你是迷茫的&#xff0c;希望这点经验对你有帮助&#xff1b;但倘若你有更好的建…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...