当前位置: 首页 > 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;但倘若你有更好的建…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...