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

《learn_the_architecture_-_aarch64_exception_model》学习笔记

1.当发生异常时,异常级别可以增加或保持不变,永远无法通过异常来转移到较低的权限级别。从异常返回时,异常级别可能会降低或保持不变,永远无法通过从异常返回来移动到更高的权限级别。EL0级不进行异常处理,异常必须在比EL0更高的异常级别处理。

2.ARM A-profile处理器(即A系列)的虚拟内存系统通过内存管理单元(MMU)管理内存访问权限。MMU使用转换表将虚拟地址映射到物理地址,并设置内存区域的属性和访问权限,包括读/写权限。访问权限分为特权和非特权访问,特权访问由高异常级别(如EL1、EL2、EL3)控制,通常用于操作系统内核或虚拟机管理程序,而非特权访问用于低级别的用户模式(EL0)。当应用程序在EL0执行时,内存访问权限会根据非特权访问权限进行检查,确保其不能访问超出权限的区域。而EL1、EL2、EL3的内存访问根据特权访问权限进行检查。MMU的配置存储在系统寄存器中,这些寄存器的访问权限由当前的异常级别控制,确保只有高权限级别才能修改MMU的配置,从而保障系统的安全性和稳定性。

3.SCTLR_ELx,即System Control Register。是ARM架构中用于控制系统行为的关键寄存器之一。不同的异常级别(EL0,EL1,EL2,EL3)都有相应的SCTLR_ELx寄存器,EL1和EL0共享相同的MMU配置,并且控制仅限于在EL1上运行的特权代码。因此没有SCTLR_EL0,所有控制均来自EL1可访问寄存器。较高的异常级别有权访问控制较低级别的寄存器,反之则不行。例如,如果需要,EL2有权访问SCTLR_EL1。无法从EL0访问该寄存器,任何尝试这样做都会生成异常。常见的系统寄存器如下表:

4.ARM架构中,处理元件(PE)在AArch32和AArch64执行状态间的切换只能在异常级别(EL)变化时发生。较低EL到较高EL时,可以保持当前状态或切换为AArch64;较高EL到较低EL时,可以保持或切换为AArch32。64位层可以托管32位层,但32位层不能托管64位层。例如,64位操作系统可运行64位和32位应用程序,而32位操作系统只能运行32位应用程序。AArch32提供与旧32位架构的向后兼容性,从Armv9-A开始在所有异常级别都必须支持AArch64,并且仅可选择在EL0级别支持AArch32。即除EL0其他异常级别均为 AArch64,并且复位时执行状态始终为 AArch64。这意味着旧版应用程序可以运行,但不能运行内核、虚拟机管理程序或固件。

5.AArch64架构支持多种安全状态,主要分为安全状态和非安全状态。想要从一种安全状态切换到另一种安全状态时必须通过EL3。如果实现了TrustZone,则处理器可以处于安全状态或非安全状态,这由SCR_EL3.NS位选择。安全状态下,处理元件(PE)可访问安全和非安全物理地址空间,适用于运行可信软件;而在非安全状态下,PE仅能访问非安全物理地址空间,适用于普通操作系统。EL3 是最高特权的异常级别,EL3 的安全状态是固定的,EL3 能够访问存储系统寄存器的所有副本。在Armv8-A架构中,EL3始终处于安全状态。而在Armv9-A架构中,EL3属于安全状态,除非实现了RME(Root Management Entity)。

Armv9-A新引入了对Realm Management Extension(RME)的支持。当实现RME时,支持两种额外的安全状态:Realm状态和Root状态。在Realm状态下,处理元件(PE)可以访问非安全和Realm物理地址空间;而在Root状态下,PE可以访问所有物理地址空间,且Root状态仅在EL3中可用。

6.对于任何特定处理器,是否实现所有异常级别以及每个实现的异常级别允许哪些执行状态都是可选择的,EL0和EL1是唯一必须实现且强制执行的异常级别,EL2和EL3是可选的。EL2包含许多虚拟化功能,没有EL2的实现无法访问这些功能。EL3是唯一可以更改安全状态的级别,如果实现选择不实现EL3,则该PE将只能访问单个安全状态。在Armv8.0-A中,EL2只存在于Non-secure状态,因为Secure状态下没有虚拟化支持。Armv8.4-A添加了S.EL2作为带有使能位(SCR_EL3.EEL2)的可选功能,以提供向后兼容性。

7.异常是指任何可能导致当前正在执行的程序挂起的事件,发生异常会导致状态发生变化,以执行代码来处理该异常。当发生异常时,处理器不会移至当前代码中的下一条指令,而是停止当前执行并分支到一段代码来处理请求。该代码称为异常处理程序,一旦事件处理完毕,执行就可以返回到原来的程序。Arm架构将异常分为两大类:同步异常和异步异常。同步异常是由当前正在执行的指令引起或与之相关的异常。同步异常与执行流同步,因为它们与当前执行的指令直接相关。例如,尝试写入MMU定义的只读位置的指令将触发同步异常。常见的同步异常有:Invalid instructions and trap exceptions、Memory accesses(内存访问异常是软件层面的问题,通常与页表、虚拟内存和访问权限相关,注意与SError区别)、Exception-generating instructions、Debug exceptions。SVC、HVC、SMC指令分别用于EL0请求EL1操作系统服务、EL1请求EL2虚拟机管理程序服务、普通世界请求EL3安全世界服务。当 PE 在 EL0 上执行时,它无法直接调用EL2上的虚拟机管理程序或EL3上的安全监视器,因为这只能在EL1及更高版本上实现。EL0处的应用程序必须使用对内核的SVC调用,并让内核执行调用更高异常级别的操作。假设已经实现了相应的异常级别,则操作系统内核EL1可以执行HVC指令来调用EL2处的管理程序或使用SMC指令调用EL3处的安全监视器。类似地,从EL2开始,PE可以使用SMC指令来调用EL3安全监视器。如下图所示:

异步异常不直接与当前执行的指令相关,并且通常是来自处理器外部的系统事件。这可能是软件需要响应的系统事件,例如计时器的活动或屏幕的触摸。异步异常也称为中断。常见的异步异常(中断)有:Physical interrupts(如UART中断)、SError(System Error是内存系统为响应意外事件而生成的异常类型,主要与硬件故障或系统层面的严重问题相关,通常是由硬件故障引起的,比如内存、缓存、外设或总线出错)、IRQ and FIQ、Virtual interrupts(如vSError、vIRQ、vFIQ, 这些虚拟中断的功能与物理中断相同,但它们只能向EL1发送信号)。物理和虚拟异步异常都可以被暂时屏蔽,这意味着异步异常可以保持挂起状态,直到它们被取消屏蔽并且异常被处理,这对于处理嵌套异常特别有用。同步异常无法被屏蔽,这是因为同步异常是由指令的执行直接引起的,因此如果它们随后悬而未决或被忽略,则会阻止执行。总结一下,从更大的角度来说,ARM中异常总的分为同步异常、SError、IRQ和FIQ四类,其中后面三个是中断,同步异常和SError是没有与之对应的中断号的,所有的SGI、SPI、PPI、LPI中断最终都是被处理为IRQ或FIQ(可以将IRQ或FIQ理解为中断处理方式,将SGI、SPI、PPI、LPI理解为中断分类)。

8.当处理器遇到异常时,会保存当前处理元件(PE)的状态和异常返回地址,并进入特定模式以处理该异常。当前的处理器状态从PSTATE中获取(在ARMv8架构中,PSTATE 并不是一个单独的寄存器,而是一个处理器状态寄存器的抽象概念,PSTATE中的DAIF位用于屏蔽异常事件。当相应的位被设置时,不会响应相应异常,包括D(调试异常)、A(SError异步异常)、I(IRQ异步异常)和F(FIQ异步异常)),并保存到程序状态寄存器(SPSR_ELx,x为1、2、3),而返回地址会存入异常链接寄存器(ELR_ELx,x为1、2、3)。对于同步异常和SError,还会更新异常综合症寄存器(ESR_ELx,x为1、2、3),记录异常的具体原因。对于与地址相关的异常(如MMU故障),触发异常的虚拟地址会写入故障地址寄存器(FAR_ELx,x为1、2、3)。

9.任何给定异常的异常处理都从称为异常向量的固定内存地址开始,当异常发生时,处理元件(PE)分支到向量表中的某个位置。AArch64 中的向量表与许多其他处理器架构不同,因为它们包含指令,而不是地址。每个条目最多包含32条指令,一个指令4字节(32位);足以执行基本的堆栈和调用特定于异常的处理代码。异常处理与返回如下图所示:

10.每种异常类型都有目标异常级别,可能是根据异常类型隐式决定的,或者由系统寄存器中的配置位定义。同步异常(如SVC、HVC和SMC指令)根据与其指令相关的规则进行路由。其他异常类型(如IRQ、FIQ和SError)可以路由到EL2(虚拟机管理程序)或EL3(安全监视器)。例如,可以配置系统将所有IRQ路由到EL1。每种异常类型(IRQ、FIQ和SError)的路由配置是独立进行的。SCR_EL3寄存器用于指定哪些异常(如IRQ、FIQ和SError)会路由到EL3(安全监视器),HCR_EL2寄存器用于指定哪些异常会路由到EL2(虚拟化层),这些寄存器允许将不同类型的中断路由到不同的异常级别。SCR_EL3和HCR_EL2中的每一位控制特定类型的中断(如IRQ、FIQ、SError),SCR_EL3的配置优先于HCR_EL2配置。当系统复位时,这些路由位的值是UNKNOWN的,必须由软件进行初始化配置。

11.路由到较高异常级别的异常无法被较低EL屏蔽。例如,如果中断在EL1中被屏蔽,并且中断被路由到EL2,则EL1屏蔽将不会影响EL2操作。路由到当前异常级别的异常可以被当前级别屏蔽。路由到较低异常级别的异常始终被屏蔽,异常将被挂起,直到PE更改为等于或低于路由到的异常级别。异常被处理时,处理器在特定异常级别的执行状态(AArch64或AArch32)由更高的异常级别的控制寄存器来决定。如下图:

12.每个异常级别都有自己的向量表,其基地址由其自己的向量基地址寄存器VBAR_ELx(Vector Base Address Register,x为1、2、3)定义。每种异常类型都有特定的地址偏移,这些偏移指向异常处理程序。异常可以分为四大类:来自较低异常级别的异常且较低异常级别使用的都是AArch32、来自较低异常级别的异常且较低异常级别至少有一个使用的是AArch64、来自当前异常级别且使用的堆栈指针是SP_EL0和来自当前异常级别且使用的堆栈指针是SP_ELx(使用哪个SP由PSTATE.SP位来决定)。在ARM架构中,当异常被路由到某个异常级别处理时,所使用的异常向量表是目标异常级别(即接收异常的异常级别)对应的向量表,而不是原始异常发生时的异常级别的向量表。

13.2021年扩展Armv8.8-A和Armv9.3-A中添加了不可屏蔽中断(NMI)支持。具有超级优先级的中断被归类为NMI,即使PSTATE异常掩码通常会阻止它被获取,也可以被获取。

相关文章:

《learn_the_architecture_-_aarch64_exception_model》学习笔记

1.当发生异常时,异常级别可以增加或保持不变,永远无法通过异常来转移到较低的权限级别。从异常返回时,异常级别可能会降低或保持不变,永远无法通过从异常返回来移动到更高的权限级别。EL0级不进行异常处理,异常必须在比…...

【C++项目实战】贪吃蛇小游戏

一、引言 贪吃蛇,这款经典的电子游戏,自1976年诞生以来,一直受到全球玩家的喜爱。它的规则简单,玩法直观,但同时也充满了挑战性。在这篇文章中,我们将一起探索如何开发一个贪吃蛇游戏,无论是作为…...

Python基于matplotlib实现树形图的绘制

在Python中,你可以使用matplotlib库来绘制树形图(Tree Diagram)。虽然matplotlib本身没有专门的树形图绘制函数,但你可以通过组合不同的图形元素(如线条和文本)来实现这一点。 以下是一个简单的示例&#…...

【UE5 C++课程系列笔记】21——弱指针的简单使用

目录 概念 声明和初始化 转换为共享指针 打破循环引用 弱指针使用警告 概念 在UE C 中,弱指针(TWeakPtr )也是一种智能指针类型,主要用于解决循环引用问题以及在不需要强引用保证对象始终有效的场景下,提供一种可…...

【游戏设计原理】46 - 魔杖

幻想,人们可以通过多种形式来引发,比如文字,图片,绘画,语言等,但游戏与以上这些形式的区别,正如游戏与其他艺术形式的区别一样,游戏作为一种艺术和娱乐形式,其独特之处在…...

【路径跟踪】PIDMPC

路径跟踪(Path Tracking)是指在实际行驶过程中,根据预先规划好的路径进行控制,能够沿着设定的路径行驶。常见的路径跟踪算法包括基于模型的控制方法(如PID控制器)、模型预测控制(Model Predicti…...

Spring源码分析之事件机制——观察者模式(二)

目录 获取监听器的入口方法 实际检索监听器的核心方法 监听器类型检查方法 监听器的注册过程 监听器的存储结构 过程总结 Spring源码分析之事件机制——观察者模式(一)-CSDN博客 Spring源码分析之事件机制——观察者模式(二&#xff…...

热备份路由HSRP及配置案例

✍作者:柒烨带你飞 💪格言:生活的情况越艰难,我越感到自己更坚强;我这个人走得很慢,但我从不后退。 📜系列专栏:网路安全入门系列 目录 一,HSRP的相关概念二,…...

仿生的群体智能算法总结之三(十种)

群体智能算法是一类通过模拟自然界中的群体行为来解决复杂优化问题的方法。以下是30种常见的群体智能算法,本文汇总第21-30种。接上文 : 编号 算法名称(英文) 算法名称(中文) 年份 作者 1 Ant Colony Optimization (ACO) 蚁群优化算法 1991 Marco Dorigo 2 Particle Swar…...

CentOS 7系统 OpenSSH和OpenSSL版本升级指南

文章目录 CentOS 7系统 OpenSSH和OpenSSL版本升级指南环境说明当前系统版本当前组件版本 现存安全漏洞升级目标版本升级准备工作OpenSSL升级步骤1. 下载和解压2. 编译安装3. 配置环境 OpenSSH升级步骤1. 下载和解压2. 编译安装3. 创建systemd服务配置4. 更新SSH配置文件5. 设置…...

【专题】2024年出口跨境电商促销趋势白皮书报告汇总PDF洞察(附原数据表)

原文链接:https://tecdat.cn/?p38722 在当今全球化加速演进、数字经济蓬勃发展的大背景下,跨境电商行业正以前所未有的态势重塑国际贸易格局,成为各方瞩目的焦点领域。 根据亚马逊发布的《2024年出口跨境电商促销趋势白皮书》,…...

【Ubuntu】不能连上网络

1. ping路由器的IP地址 ping 192.168.1.1 如果ping不通的话,可能是网络故障导致的。需要重启配置ip地址。配置文件 sudo vi /etc/network/interface 2. ping 8.8.8.8 如果ping不通的话,可能是路由器不能链接往外网; 或者路由器显示了当…...

CSS3 框大小

CSS3 框大小 CSS3 是网页设计和开发中不可或缺的一部分,它为开发者提供了更多样化、更灵活的样式和布局选择。在 CSS3 中,框大小(Box Sizing)是一个重要的概念,它决定了元素内容的宽度和高度以及元素整体的大小。本文将详细介绍 CSS3 框大小的概念、用法以及最佳实践。 …...

联发科MTK6771/MT6771安卓核心板规格参数介绍

MT6771,也被称为Helio P60,是联发科技(MediaTek)推出的一款中央处理器(CPU)芯片,可运行 android9.0 操作系统的 4G AI 安卓智能模块。MT6771芯片采用了12纳米工艺制造,拥有八个ARM Cortex-A73和Cortex-A53核心,主频分别…...

python中的时间模块--datetime模块、time模块

python中的时间模块 一.datetime模块二.time模块 一.datetime模块 引入时间模块 from datetime import datetime获取当前时间 print(datetime.today()) # 前的日期和时间 print(datetime.now()) # 当前的日期和时间 print(datetime.now().year) # 当前的年份 print(datetime…...

CV 处理全流程:从数据采集到模型部署的整个过程,体现全面性

CV 处理全流程:从数据采集到模型部署的整个过程,体现全面性 Numpy广播 OpenCV - Python归一化提取ROI(感兴趣区域)分离和合并通道 Pytorch 基础算子自动梯度计算 CV 全流程图像数据采集1. 确认目标2. 分析过程(使用目标-手段分析法&#xff0…...

OWASP ZAP之API 请求基础知识

ZAP API 提供对 ZAP 大部分核心功能的访问,例如主动扫描器和蜘蛛。ZAP API 在守护进程模式和桌面模式下默认启用。如果您使用 ZAP 桌面,则可以通过访问以下屏幕来配置 API: Tools -> Options -> API。 ZAP 需要 API 密钥才能通过 REST API 执行特定操作。必须在所有 …...

南京观海微电子----GH7009国宇测试盒使用

1. SPI接线 针对7009: 2. 国宇上位机代码准备 在主函数首尾两端加入IO2时序控制的代码、以及国语SPI有效位控制的代码(请注意7009和其他700x使用的有效位控制不一致,需要用哪一款加入哪一行即可): 三、国宇SPI读的使…...

mysql及其兼容语法数据库对于注释的特殊要求

我司大部分数据库使用MS-SQL,其中使用大量–开头的行注释,由于业务需要,切换到了Starrocks数据库(兼容mysql语法)后发现使用with开头子查询的时候,大量报错,单独执行内部的子查询又正常&#xf…...

数据去重与重复数据的高效处理策略

在实际业务中,数据去重是一个非常常见的需求,特别是在日志数据、用户操作记录或交易记录等领域。去重不仅仅是删除重复数据,更重要的是按照业务规则保留最有价值的数据记录。 本文将探讨如何在 SQL 中高效地处理重复数据,通过 DI…...

Spring Boot自动装配代码详解

概述 Spring Boot自动装配是其核心特性之一,它能够根据项目中添加的依赖自动配置Spring应用程序。通过自动装配,开发人员可以减少大量的配置工作,快速搭建起一个可用的Spring应用。 关键组件和注解 SpringBootApplication注解 这是Spring Bo…...

渗透测试-非寻常漏洞案例

声明 本文章所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法. 此文章不允许未经授权转发至除先知社区以外的其它平台!&#xff0…...

122. 买卖股票的最佳时机 II

https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150问题分析: 和买卖股票的最佳时机I这题相比,区别就是可以买多只股票虽然同时只能持有一支,但是我们还是可以…...

Python爬虫入门指南:从零开始抓取数据

Python爬虫入门指南:从零开始抓取数据 引言 在大数据时代,数据是新的石油。而爬虫作为获取数据的重要手段,受到了越来越多的关注。Python作为一门强大的编程语言,其简洁易用的特性使得它成为爬虫开发的首选语言。本篇文章将带你…...

Android使用JAVA调用JNI原生C++方法

1.native-lib.cpp为要生成so库的源码文件 2.JNI函数声明说明 NewStringUTF函数会返回jstring JNI函数声明规则 3.JAVA中声明及调用JNI函数 声明: 调用 4.源码地址: gitgithub.com:tonyimax/UpdateTimeByThread.git...

ros常用命令记录

文章目录 1.基本2.rosbag2.1录制rosbag包2.2播放录制的ROS包 3.生命周期4.ROS启动&#xff0c;roslaunch5.ROS消息发布6.ROS消息后台打印监控 1.基本 ros2 topic list #查看话题列表2.rosbag 2.1录制rosbag包 ros2 bag record <topic_name> #记录单个主题消息 ros2 ba…...

UE5材质节点VertexNormalWs/PixelNormalWS

VertexNormalWs顶点法线方向&#xff0c;此节点可以做物体上积雪、青苔等效果 PixelNormalWS像素法线方向...

友元和运算符重载

1. 友元 可以把某些选定的函数看作类的“荣誉函数”&#xff0c;允许它们访问类对象中非公共的成员&#xff0c;就好像它们是类的成员一样&#xff0c;这种函数称为类的友元。友元可以访问类对象的任意成员。 1.1 友元函数 友元函数是一种定义在类外部的普通函数&#xff0…...

【数据库事务锁的类型:读锁/写锁、悲观锁/乐观锁、表锁/页锁/行锁】

数据库事务锁的类型&#xff1a;读锁/写锁、悲观锁/乐观锁、表锁/页锁/行锁 一、读锁/写锁1、锁定读 二、悲观锁/乐观锁2.1 悲观锁2.2 乐观锁 三、表锁/页锁/行锁3.1 表级别的S锁、X锁3.2 表级别的意向锁&#xff08;intention lock&#xff09; 一、读锁/写锁 对于数据库中并…...

【Motion Builder】配置c++插件开发环境

目录 准备环境构建官方案例另行构建经验分享附录 准备环境 安装Motion Builder 2024并破解安装Qt 5.15.2 截止至2024年12月19日&#xff0c;Qt的在线安装器的默认页面是没有5.15.2版本的。你需要&#xff1a;在“选择组件”界面&#xff0c;选择“Archive”&#xff0c;点击“…...