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

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

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

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

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...

深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙

WebGL&#xff1a;在浏览器中解锁3D世界的魔法钥匙 引言&#xff1a;网页的边界正在消失 在数字化浪潮的推动下&#xff0c;网页早已不再是静态信息的展示窗口。如今&#xff0c;我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室&#xff0c;甚至沉浸式的V…...