《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异常掩码通常会阻止它被获取,也可以被获取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948431.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux上安装MySQL教程

1.准备好MySQL压缩包,并进行解压 tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar -C /usr/local 2.检查是否有mariadb数据库 rpm -aq|grep mariadb 关于mariadb:是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目…

量子力学复习

黑体辐射 热辐射 绝对黑体: (辐射能力很强,完全的吸收体,理想的发射体) 辐射实验规律: 温度越高,能量越大,亮度越亮 温度越高,波长越短 光电效应 实验装置&#xf…

OSI模型的网络层中产生拥塞的主要原因?

( 1 )缓冲区容量有限;( 1.5 分) ( 2 )传输线路的带宽有限;( 1.5 分) ( 3 )网络结点的处理能力有限;( 1 分…

Spring Boot 的自动配置,以rabbitmq为例,请详细说明

Spring Boot 的自动配置特性能够大大简化集成外部服务和组件的配置过程。以 RabbitMQ 为例,Spring Boot 通过 spring-boot-starter-amqp 提供了自动配置支持,开发者只需在应用中添加相关依赖并配置必要的属性,Spring Boot 会自动配置所需的连…

visual studio 安全模式

一、安全模式: 在 Visual Studio 中,安全模式是一种启动方式,允许你在禁用所有扩展和自定义设置的情况下启动 Visual Studio。这个模式可以帮助排除插件或扩展引起的问题,特别是在 Visual Studio 无法正常启动时。 二、安全模式下…

使用SSH建立内网穿透,能够访问内网的web服务器

搞了一个晚上,终于建立了一个内网穿透。和AI配合,还是得自己思考,AI配合才能搞定,不思考只依赖AI也不行。内网服务器只是简单地使用了python -m http.server 8899,但是对于Gradio建立的服务器好像不行,会出…

服务器信息整理:用途、操作系统安装日期、设备序列化、IP、MAC地址、BIOS时间、系统

文章目录 引言I BIOS时间Windows查看BIOS版本安装日期linux查看BIOS时间II 操作系统安装日期LinuxWindowsIII MAC 地址IV 设备序列号Linux 查看主板信息知识扩展Linux常用命令引言 信息内容:重点信息:用途、操作系统安装日期、设备序列化、IP、MAC地址、BIOS时间、系统 Linux…

java项目之读书笔记共享平台(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的闲一品交易平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 读书笔记共享平台的主要使…

【信息系统项目管理师】【综合知识】【备考知识点】【思维导图】第十一章 项目成本管理

word版☞【信息系统项目管理师】【综合知识】【备考知识点】第十一章 项目成本管理 移动端【思维导图】☞【信息系统项目管理师】【思维导图】第十一章 项目成本管理

1、单片机寄存器-io输入实验笔记

1、硬件 时钟总线如下: PB端口挂载在AHB1总线上,因此要对该位进行使能。 引脚 LED0和LED1挂载在PB0和PB1上:推挽输出、100M、 上拉默认高电平,低电平点亮。 2、软件 位带操作 #ifndef _IO_BIT_H_ #define _IO_BIT_H_#define …

【嵌入式硬件】嵌入式显示屏接口

数字显示串行接口(Digital Display Serial Interface) SPI 不过多赘述。 I2C-bus interface 不过多赘述 MIPI DSI MIPI (Mobile Industry Processor Interface) Alliance, DSI (Display Serial Interface) 一般用于移动设备,下面是接口…

【LC】240. 搜索二维矩阵 II

题目描述: 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,…

快速上手LangChain(四)LangChain Hub和LangSmith

文章目录 快速上手LangChain(四)LangChain Hub和LangSmith什么是LangChain HubLangChain Hub功能 LangSmith使用 快速上手LangChain(四)LangChain Hub和LangSmith 什么是LangChain Hub LangChain Hub官网地址:https:…

vip与haproxy构建nginx高可用集群传递客户端真实ip

问题 系统使用了vip与haproxy实现高可用以及对nginx进行负载均衡,但是发现在上游的应用服务无法拿到客户端的请求ip地址,拿到的是主haproxy机器的ip,以下是nginx与haproxy的缩减配置: location ~* ^/(xx|xx) {proxy_pass http:/…

使用python调用翻译大模型实现本地翻译【exe客户端版】

以前分享过一个 关于python 部署 网页端的 翻译大模型的 文章 有兴趣的小伙伴可以去看一下 https://blog.csdn.net/Drug_/article/details/144488795 今天就再分享一个 使用python 来制作一个 exe 客户端版的 本地大模型。 实际也很简单 只不过把 用 fastApi 框架 做的 网页端…

Windows系统下载、部署Node.js与npm环境的方法

本文介绍在Windows电脑中,下载、安装并配置Node.js环境与npm包管理工具的方法。 Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,其允许开发者使用JavaScript编写命令行工具和服务器端脚本。而npm(Node Package Manager)则…

PHP如何删除数组中的特定值?

php 中删除数组特定值的方法有三种:unset():直接删除指定索引的值,但会保留数组索引结构和未删除元素,适合小数组。array_filter():根据自定义回调函数筛选数组元素,返回一个新数组,原数组不变&…

(九千七-星河襟)椭圆曲线加密(ECC, Elliptic Curve Cryptography)及其例题

椭圆曲线加密(ECC)是一种基于椭圆曲线数学的公钥加密技术。它提供了一种高效的加密方法,能够在较小的密钥长度下实现与传统加密算法(如RSA)相同的安全级别。以下是ECC的主要特点和工作原理的总结: 1. 基本…

大模型系列17-RAGFlow搭建本地知识库

大模型系列17-RAGFlow搭建本地知识库 安装ollama安装open-wehui安装并运行ragflowRAG(检索、增强、生成)RAG是什么RAG三过程RAG问答系统构建步骤向量库构建检索模块生成模块 RAG解决LLM的痛点 使用ragflow访问ragflow配置ollama模型添加Embedding模型添加…

5大常见高并发限流算法选型浅析

高并发场景下,如何确保系统稳定运行,成为了每一个开发工程师必须面对的挑战。**你是否曾因系统崩溃、请求超时或资源耗尽而头疼不已?**高并发限流算法或许能帮你解决这些难题。 在处理高并发请求时,应该如何选择合适的限流算法呢…