ARM(2)ARMv8基础知识

news2024/11/18 9:46:48

目录

一、异常

1.1异常等级的定义

1.2异常的种类

1.2.1同步异常和异步异常

1.3改变异常等级

1.4异常后的处理

1.4.1异常处理相关寄存器

1.4.2系统调用

1.4.3对EL2/EL3的系统调用

1.4.4异常返回

1.4.5异常处理流程

二、安全状态

三、执行状态


本文介绍以下内容:

  1. 四个异常级别:EL0~EL3
  2. 两种安全状态:安全、非安全
  3. 两种执行状态:AArch64、AArch32

一、异常

        在ARMv8架构中,异常是指CPU在执行指令时遇到的一些特殊情况,例如访问非法地址、除以零、硬件故障等。这些事件会打断正在执行的程序,并且需要处理器转而执行一些特定的代码来处理这些事件。为了处理这些异常情况,ARMv8架构定义了一套异常处理机制,其中每个异常都有一个预定义的处理程序。

1.1异常等级的定义

在 ARMv8 中,程序执行发生在四个异常级别中的一个。在AArch64中,异常级别决定了权限级别。因此在ELn执行对应于权限PLn。同样,数字越小,异常越低,权限越低。异常级别提供了软件执行权限的逻辑分离,适用于ARMv8架构的所有操作状态。它类似于并支持计算机科学中常见的分层保护域的概念。

以下是在每个异常级别上运行的软件的典型例子:

  1. EL0 : 普通用户应用程序。
  2. EL1 : 操作系统内核通常被描述为有特权的。
  3. EL2 : 虚拟化管理程序。
  4. EL3 : 低级别的固件,包括Secure Monitor。

        一般来说,一个软件,如应用程序、操作系统的内核或管理程序,只占用一个异常级别。这一规则的一个例外是内核内的管理程序,如KVM,它在EL2和EL1之间运行。ARMv8-A提供两种安全状态:安全和非安全。非安全状态也被称为 "正常世界"。这使得操作系统(OS)可以在同一硬件上与受信任的操作系统并行运行,并提供对某些软件攻击和硬件攻击的保护。ARM TrustZone技术使系统可以在正常世界和安全世界之间进行划分。与ARMv7-A架构一样,安全监视器作为网关在正常世界和安全世界之间移动。
 

1.2异常的种类

  • 中断

    在ARM中,FIQ的优先级要高于IRQ,在SOC内部会有一个中断控制器负责中断优先级调度,然后发送中断信号给处理器。中断属于异步模式的异常。

  • 中止

    中止异常分为数据中止和指令中止,MMU(Memory Management Unit)能够捕获错误并汇报给处理器。

  • 复位

    复位是处理器中优先级最高的异常,通常分为上电复位和软件复位。

  • 软件产生的异常

    ARMv8提供了3种软件产生的异常,发生此异常的原因是软件企图进入更高的异常等级。

    a) SVC是Supervisor Call的缩写,可以允许用户模式下的程序请求操作系统(OS)服务。当用户模式下的程序需要执行特权指令或者需要访问受保护的资源时,就会触发SVC异常。此时处理器会切换到特权模式,操作系统会接收到该异常并执行相应的服务。

    b) HVC是Hypervisor Call的缩写,是一种虚拟化技术中的指令。在虚拟化环境中,HVC指令可以用来切换虚拟机和宿主机之间的控制权,从而实现虚拟机和宿主机之间的交互。当客户机需要执行特权指令或者需要访问主机上受保护的资源时,就会触发HVC异常。此时处理器会切换到虚拟化模式,并将该异常传递给主机上运行的虚拟化软件进行处理。

    c) SMC是Secure Monitor Call的缩写,可以允许普通世界(非安全世界)中运行的程序请求安全服务。当普通世界中运行的程序需要执行受保护指令或者需要访问受保护资源时,就会触发SMC异常。此时处理器会切换到安全世界,并将该异常传递给安全监控程序进行处理。

1.2.1同步异常和异步异常

同步异常必须等待cpu处理完当前异常才可以继续执行指令。

常见的同步异常:

    a) 访问其他等级的寄存器,比如当前是EL1,如果访问EL2的寄存器就会出现异常

    b) SP(Stack Pointer,栈指针)未对齐    

    c) SVC、HVC和SMC

    d) 地址翻译错误/地址权限

常见的异步异常:

    a) 物理中断 IRQ、FIQ和系统错误SError  

    b) 虚拟中断 vIRQ、vFIQ、vSError

1.3改变异常等级

        在ARMv7架构中,处理器模式可以在特权软件控制下或在发生异常时自动改变。当异常发生时,内核会保存当前的执行状态和返回地址,进入所需的模式,并可能禁用硬件中断。 这在下面的表格中进行了总结。应用程序在最低的权限水平上运行,即PL0,以前的非特权模式。操作系统在PL1运行,而在具有虚拟化扩展的系统中的管理程序在PL2运行。安全监控器,作为在安全和非安全(正常)世界之间移动的网关,也在PL1运行。

        在AArch64中,处理器模式被映射到Exception级别上,如下图所示。如同在ARMv7(AArch32)中,当出现异常时,处理器会改变到支持处理异常的异常级别(模式)。

异常级别之间的切换遵循以下规则:

  • 移动到更高的异常级别,例如从EL0到EL1,表示软件执行权限的增加。
  • 一个异常不能被带到较低的异常级别。
  • 在EL0层没有异常处理,异常必须在更高的异常层处理。
  • 一个异常会导致程序流程的改变。异常处理程序的执行在高于EL0的异常级别开始,从一个定义的向量开始,与所发生的异常有关。异常包括:
  •        中断,如IRQ和FIQ。
  •        内存系统中止。
  •        未定义的指令。
  •        系统调用。这些允许无特权的软件对操作系统进行系统调用。 操作系统的系统调用。
  •        安全监控器或管理程序陷阱。
  • 结束异常处理并返回到上一个异常级别是通过执行ERET指令进行的。
  • 从异常中返回可以停留在同一个异常级别或进入一个较低的异常级别。它不能移动到更高的异常级别。
  • 安全状态会随着异常级别的改变而改变,除了从EL3返回到非安全状态时。

1.4异常后的处理

1.4.1异常处理相关寄存器

    a) 异常综合寄存器(ESR_ELn)

    b) 故障地址寄存器(FAR_ELn):

        为异常处理程序提供关于同步异常原因的信息。ESR_ELn保存了异常原因,而FAR_ELn保存了所有同步指令和数据中止以及对齐故障的故障虚拟地址。

    c) 异常链接寄存器ELR_ELn:

        保存了导致中止数据访问的指令的地址(对于数据中止)。这些在内存故障后被更新,但在其他情况下也会被设置,例如,通过分支到错位的地址。如果一个异常从AArch32中的异常级别进入使用AArch64的异常级别,并且该异常写入了与目标异常级别相关的故障地址寄存器。

    d) 异常综合寄存器ESR_ELn:

        包含了允许异常处理程序确定异常原因的信息。它只对同步异常和SError进行更新。它不对IRQ或FIQ进行更新,因为这些中断处理程序通常从通用中断控制器(GIC)的寄存器中获取状态信息。

图.ESR_ELn寄存器

Bit[31:26](ESR_ELn.EC)表示异常类别,它使处理程序能够区分各种可能的异常原因(如未分配的指令,从MCR或MRC到CP15的异常,FP操作的异常,SVC、HVC或SMC的执行,数据中止,以及对齐异常)。例如,EC=101111是一个SError中断。

Bit[25](ESR_ELn.IL)表示被困指令的长度(16位指令为0,32位指令为1),并对某些异常类别进行设置。

Bit[24:0] (ESR_ELn.ISS)构成指令特定综合症(ISS)字段,包含该异常类型的特定信息。例如,当一个系统调用指令(SVC、HVC或SMC)被执行时,该字段包含与操作码相关的即时值,如SVC为0x123456。

注:被困指令是一种特殊的指令,用于在处理器执行过程中发生异常或错误时,将处理器状态(当前的程序计数器和程序状态寄存器等关键寄存器的值保存到内存中)保存到内存中,以确保系统在出现异常或错误时能够正确地响应,并避免进一步的损坏或数据丢失。

1.4.2系统调用

    一些指令或系统功能只能在特定的异常级别进行。例如,如果运行在较低Exception级别的代码必须执行一个特权操作,例如当应用程序代码(EL0)向内核(EL1)请求功能时。一种方法是通过使用SVC指令来实现。这允许应用程序产生一个异常。参数可以在寄存器中传递,或者在系统调用中编码。

1.4.3对EL2/EL3的系统调用

        SVC指令可以用来从EL0的用户应用程序调用到EL1的内核。HVC和SMC系统调用指令以类似的方式将处理器移动到EL2和EL3。

        注意:当处理器在EL0(应用程序)执行时,它不能直接调用管理程序(EL2)或安全监视器(EL3)。这只有在EL1和以上的地方才有可能。因此,应用程序必须使用SVC来调用内核,并允许内核代表它们调用更高的异常级别。

        在操作系统内核(EL1),软件可以用HVC指令调用管理程序(EL2),或用SMC指令调用安全监视器(EL3)。

        同样,从管理程序代码(EL2)中,程序可以用SMC指令调用安全监视器(EL3)。如果在EL3时进行SMC调用,它仍然会在同一个异常级别上引起一个同步异常,该异常级别的处理程序可以决定如何响应。

1.4.4异常返回

    当操作系统的异常处理完成后,执行一条 ERET 指令即可从异常返回。

    ERET 指令会自动完成以下动作。 - 从 ELR_ELx 寄存器中恢复 PC 指针 - 从 SPSR_ELx 寄存器恢复 PSTATE 处理器的状态。 

    当中断发生时,CPU 会将 PSTATE 寄存器的值保存到对应的目标异常等级的 SPSR_ELx 中, 并且把 PSTATE 寄存器里的 D,A,I, F 标志位都设置为1, 这相当于把本地 CPU 的中断关闭。

    当中断完成后,操作系统调用 ERET 指令返回中断现场,并且会把 SPSR_ELx 恢复到 PSTATE 寄存器中,这相当于把中断打开。

    异常入口和返回的流程如下图:

异常入口和返回的流程示意图

当异常处理结束之后,调用了 ERET 指令返回时是否需要切换执行模式,需要查看 SPSR 寄存器。

SPSR.M[3:0] 字段记录了返回哪个异常等级

SPSR.M[4] 字段记录了返回哪个执行状态

0:表示 AArch64 执行状态

1:表示 AArch32 执行状态

1.4.5异常处理流程

异常处理流程主要包括以下几个步骤:

    1. 异常产生:当处理器执行指令时,如果遇到了错误或者特殊情况,就会产生异常。例如,访问非法地址、除零操作、外部中断等。

    2. 中断响应:当CPU检测到一个异常时,从异常向量表读取预定义的地址,执行对应的处理程序。

    3. 异常处理:每个类型的异常都有自己独立的处理例程。当CPU跳转到对应的预定义地址后,它会执行相应类型的处理例程来完成具体操作。例如,对于外部中断,可以保存当前现场状态并跳转到中断服务程序;对于非法指令,则可以直接终止程序并输出错误信息。

    4. 中断返回:CPU完成对异常进行处理后,需要返回到原来被打断的指令继续执行。ARMv8架构定义了一套异常返回机制,可以在处理程序中使用。

二、安全状态

ARMv8‑A 提供两种安全状态,安全和非安全。使用ns表示。(注:目前扩展为2bit: ns,nse)

为什么分安全状态和非安全状态?

        在ARMv8-A中,每个处理器核心都可以同时运行多个操作系统或应用程序。为了保证各个操作系统或应用程序之间的隔离和安全性,ARMv8-A提供了两种不同的处理器状态:安全状态和非安全状态。

        安全状态是一种特殊的处理器模式,它可以访问所有的系统资源,包括内存、寄存器和外设等。在这种状态下,可以执行所有的指令,并且可以访问所有的内存地址空间。但是,在安全状态下运行的软件需要满足一定的安全要求,比如必须经过认证、授权等。

        非安全状态是一种普通的处理器模式,它不能访问系统中的所有资源。在这种状态下运行的软件只能访问被分配给它们的资源和内存地址空间。这样可以保证系统中不同软件之间互相隔离,从而提高了系统的安全性和稳定性。

        通过使用这两种不同的处理器状态,ARMv8-A能够提供更高的系统安全性和隔离性。

PS:特权组件是指只能被特权级别高于或等于当前执行级别的软件访问的组件。这些特权组件是ARM体系结构中重要的组成部分,可以提供强大的功能支持和保护机制。

Normal World(对应于非安全状态)具有以下特权组件:

    1. Guest OS kernels。此类内核包括在非安全 EL1 中运行的 Linux 或 Windows。在管理程序下运行时,操作系统内核可以作为来宾或主机运行,具体取决于管理程序模型。

    2. Hypervisor。在EL2上运行,它始终是非安全的。虚拟机管理程序在存在并启用时,可为操作系统内核提供虚拟化服务。

Secure World具有以下特权组件:

    1. Secure firmware。在应用处理器上,该固件必须是在启动时运行的第一件事。它提供了多种服务,包括平台初始化、可信操作系统的安装以及安全监视器调用的路由。

    2. Trusted OS 受信任的操作系统为普通世界提供安全服务,并为执行安全或受信任的应用程序提供运行时环境。

     在ARM处理器中,正常世界和安全世界之间通过一些特殊的接口进行通信,例如SMC(Secure Monitor Call)和HVC(Hypervisor Call)等。这些接口可以确保正常世界和安全世界之间的数据传输是安全可靠的。

、执行状态

    ARMv8 架构定义了两种执行状态:

  1. AArch64:执行A64 指令集
  2. AArch32:执行A32/T32 指令集

    下图显示了 AArch64 和 AArch32 中异常级别的组织。

     AArch64:

     AArch32:

在 AArch32 状态下,Trusted OS 软件在 Secure EL3 中执行,而在 AArch64 状态下,它主要在Secure EL1 中执行。

ARMv7的五个特权级别:

1. 用户模式(User Mode):最低特权级别,用于运行普通应用程序。

2. FIQ模式(FIQ Mode):比用户模式高一级的特权级别,用于处理快速中断请求。

3. IRQ模式(IRQ Mode):比FIQ模式高一级的特权级别,用于处理标准中断请求。

4. 监管者模式(Supervisor Mode):比IRQ模式高一级的特权级别,用于执行系统管理任务和操作系统内核代码。

5. 系统模式(System Mode):最高特权级别,可访问所有资源和硬件设备,并可以执行所有指令。

        在ARMv7中,每个特权级别都有自己的寄存器集合和访问权限。这些权限包括对内存、设备和其他资源的读写权限、对指令集的使用权限以及对其他特权级别的切换权限等。通过这些不同的特权级别,ARMv7能够实现多任务操作系统和安全性保护等功能。

参考链接:

【ARMv8基础篇】异常等级_arm异常等级-CSDN博客

超详细的ARM处理器异常处理(含视频教学~) - 知乎

ARMv8的异常等级(Exception Level)以及执行状态(AArch64/AArch32)-CSDN博客

ARM64简介 - 知乎

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle 修改数据库的字符集

Oracle 修改数据库的字符集 alter system enable restricted session; alter database "cata" character set ZHS16CGB231280; alter database "cata" national character set ZHS16CGB231280; alter system enable restricted session; alter database…

docker-compose安装 人大金仓数据库

下载官网安装包 将安装包重命名为: kingbase.tar 再导入镜像仓库 docker load -i kingbase.tar目录创建data文件夹创建docker-compose文件 version: 3 services: kingbase: image: kingbase:v1 container_name: kingbaseports: - "54321:54321" volumes: -…

AlphaFold3: Google DeepMind的的新突破

AlphaFold 3的论文今天在Nature期刊发表啦!这可是AI在生物领域最厉害的突破的最新版本。AlphaFold-3的新招就是用扩散模型去"画出"分子的结构。它一开始先从一团模模糊糊的原子云下手,然后慢慢透过去噪把分子变得越来越清楚。 Alphafold3 我们活在一个从Llama和Sora那…

今日刷三题(day12):兑换零钱(一)+最长回文子串+编辑距离(一)

题目一:兑换零钱(一) 题目描述: 给定数组coins,coins中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个aim,代表要找的钱数&…

代码随想录算法训练营DAY47|C++动态规划Part8|198.打家劫舍、213.打家劫舍II、198.打家劫舍III

文章目录 198.打家劫舍思路CPP代码 ⭐️213.打家劫舍II解决环的问题思路总结CPP代码 ⭐️198.打家劫舍III思路递归三部曲——确定参数和返回值递归三部曲——确定终止条件递归三部曲——确定单层遍历的逻辑 打印dp数组CPP代码暴力递归记忆化递归 198.打家劫舍 力扣题目链接 文章…

安卓开发--按键跳转页面,按键按下变色

前面已经介绍了一个空白按键工程的建立以及响应方式,可以参考这里:安卓开发–新建工程,新建虚拟手机,按键事件响应。 安卓开发是页面跳转是基础!!!所以本篇博客介绍利用按键实现页面跳转&#…

【C++】STL-list的使用

目录 1、list的使用 1.1 list的构造 1.2 list的遍历 1.3 list capacity 1.4 list element access 1.5 容量相关 list是一个带头双向循环链表 1、list的使用 1.1 list的构造 1.2 list的遍历 list只有两种遍历方式,因为没有operator[] 因为list的双向链表&am…

初识C语言——第十六天

C语言中的语句结构类型:顺序/选择/循环 分支语句 if else switch 循环语句 while for do whlie goto语句 代码练习:找两个整数的最大公约数和最小公倍数 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h>//int main() //{ // int age 60; // if (ag…

景源畅信数字:抖音小店的入住门槛大不大?

近年来&#xff0c;随着短视频平台的崛起&#xff0c;抖音小店逐渐成为了众多商家和创业者关注的焦点。那么&#xff0c;抖音小店的入住门槛究竟大不大呢?本文将从四个方面对这一问题进行详细阐述。 一、注册流程 抖音小店的注册流程相对简单&#xff0c;只需按照官方指引完成…

漫威争锋Marvel Rivals申请测试资格教程 最新获取测试资格教程

即将震撼登场的《漫威争锋》&#xff08;Marvel Rivals&#xff09;标志着PvP射击游戏领域的全新突破&#xff0c;由漫威官方网站全力支持推出。这款游戏定于5月11日早晨9点启幕其封闭Alpha测试章节&#xff0c;这场测试盛宴将持续整整十天。在首波测试浪潮中&#xff0c;玩家有…

以目录创建的conda环境添加到jupyter的kernel中

场景&#xff1a;由于某些原因&#xff0c;服务器上的conda环境不能通过--name的方式创建&#xff0c;只能通过指定目录即-p的方式&#xff0c;在这种情况下该环境在conda env list中没有显示&#xff0c;无法在jupyter kernel中搜到&#xff0c;只能手动添加。 1.进入环境 # …

百面算法工程师 | 模型评价指标及优化策略

本文给大家带来的百面算法工程师是深度学习模型评价指标的面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的评价方案&#xff0c;并提供参考的回答及其理论基础&…

扩散模型~

推荐&#xff1a;write_own_pipeline.ipynb - Colab (google.com) 基本管道 一直显示NVIDIA有问题&#xff0c;所以就把.to("cuda")去掉了&#xff0c;使用Colab运行的&#xff0c;代码如下&#xff1a; from diffusers import DDPMPipelineddpm DDPMPipeline.fr…

【有趣的透镜】1.透镜初相识

1.透镜的外形和材料 (1)透镜由玻璃或者塑料制成&#xff1b; (2)透镜一般为圆型&#xff0c;其单面或双面为球面&#xff1b; 2.透镜的类型和折射 (1)球面外凸为凸透镜(聚光)&#xff0c;球面内凹为凹透镜(散光)&#xff1b; (2)透镜是基于光的折射&#xff0c;只要光从一…

【api接口开通教程】YouTube Data API v3申请流程

一、背景调查 1.1 API接口介绍 采集youtube数据&#xff0c;大体分为两种方案&#xff1a;一种是基于爬虫&#xff0c;一种是基于API接口。 说人话就是&#xff1a;爬虫相当于走后门、爬窗户&#xff08;利用技术手段窃取&#xff0c;人家没说给&#xff0c;但我硬拿&#x…

兔子繁衍问题<C语言>

问题&#xff1a;一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死&#xff0c;请问第1个月出生的一对兔子&#xff0c;至少需要繁衍到第几个月时兔子总数才可以达到N对&#xff1f; 分析&#xff1a; 可以观…

学习记录:AUTOSAR R20-11的阅读记录(三)【CP(5.1-5.5)】

接上回&#xff1a;学习记录&#xff1a;AUTOSAR R20-11的阅读记录&#xff08;二&#xff09;【AP】 五、CP 在AUTOSAR_TR_ClassicPlatformReleaseOverview.pdf里面对CP文档进行分类&#xff1a; Release DocumentationCommunicationMemorySystem ServicesMCALIOLibrariesDi…

这 7 道 Redis 基础问题,很常见!!

后端项目如果用到分布式缓存的话&#xff0c;一般用的都是 Redis。不过&#xff0c;Redis 不仅仅能做缓存&#xff0c;还能用作分布式锁、延时队列、限流等等。 什么是 Redis&#xff1f; Redis[1] &#xff08;REmote DIctionary Server&#xff09;是一个基于 C 语言开发的…

数据治理的难题:如何化解?

在数字化转型的大潮中&#xff0c;数据治理成了每个企业都绕不开的话题。但是&#xff0c;数据治理这条路并不好走&#xff0c;充满了各种挑战。这些挑战不仅来自于技术&#xff0c;还有组织文化、流程和法律法规等方面。 挑战一&#xff1a;数据孤岛 在企业内部&#xff0c;…

ORA-02020:过多的数据库链接在使用

一、问题描述 今天同事说&#xff0c;有一个查询功能&#xff0c;同时查了几个子平台的dblink&#xff0c;页面返回报错。 提示ORA-02020&#xff1a;过多的数据库链接在使用&#xff1b; bad SQL grammar 二、解决办法 1&#xff09;分析业务需求 分析业务场景 &#xff0c;发…