ARM(2)ARMv8基础知识

目录

一、异常

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.mzph.cn/bicheng/9095.shtml

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

相关文章

又一个限时免费生成图片的AI平台

网址 https://jimeng.jianying.com/ai-tool/image/generate 抖音官方的文升图,用抖音登录就可以,每天送60积分,目前看文生图好像是限时免费。 随手试了一下,速度很快,质量也还可以,背靠大厂,…

[MQTT]Mosquitto的內網連接(intranet)和使用者/密碼權限設置

[MQTT | Raspberry Pi]Publish and Subscribe with RSSI Data of Esp32 on Intranet 延續[MQTT]Mosquitto的簡介、安裝與連接測試文章,接著將繼續測試在內網的兩台機器是否也可以完成發佈和訂閱作業。 同一網段的兩台電腦測試: 假設兩台電腦的配置如下: A電腦為發…

【JAVA基础之装箱和拆箱】自动装箱和自动拆箱

🔥作者主页:小林同学的学习笔录 🔥mysql专栏:小林同学的专栏 目录 1.包装类 1.1 概述 1.2 Integer类 1.3 装箱和拆箱 1.4 自动装箱和自动拆箱 1.5 基本类型与字符串之间的转换 1.5.1 基本类型转换为字符串 1.5.2 字符串转…

(24)实时采集微信消息(基于独立窗体)-微信UI自动化(.Net+C#)

整理 | 小耕家的喵大仙 出品 | CSDN(ID:lichao19897314) Q Q | 978124155 往期知识回顾 (1)开启探索微信自动化之路-微信UI自动化(.NetC#) (2)初始化微信窗体UI自动化实例-微信UI自动化(.NetC#) (3)采用热键终止微信采集任务-微信UI自动…

JavaScript初了解

JS的三种书写位置:行内,内嵌,外部 JS的注释的书写:单行注释:// ctrl/ 多行注释:/**/ ShiftAltA JavaScript输入输出语句

【热门话题】如何通过AI技术提升内容生产的效率与质量

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 如何通过AI技术提升内容生产的效率与质量引言一、自然语言处理(NLP&…

【备战软考(嵌入式系统设计师)】11 - 硬件电路基础

逻辑门电路 首先我们需要先了解三个最基础的门电路,可以说我们一切的电子产品的基石就是这哥仨,它们就与,或,非。 与门和或门有两个输入端,一个输出端;非门有一个输入端一个输出端。 在我们数字电路中&a…

【爬虫基础1.1课】——requests模块

目录索引 requests模块的作用:实例引入: 特殊情况:锦囊1:锦囊2: 这一个栏目,我会给出我从零开始学习爬虫的全过程。感兴趣的小伙伴可以关注一波,用于复习和新学都是不错的选择。 那么废话不多说&#xff0c…

Leetcode—394. 字符串解码【中等】

2024每日刷题&#xff08;131&#xff09; Leetcode—394. 字符串解码 实现代码 class Solution { public:string decodeString(string s) {string curstr;int curNum 0;stack<pair<string, int>> st; for(char c: s) {if(isdigit(c)) {curNum curNum * 10 (c…

【Linux网络编程】HTTPS协议

【Linux网络编程】HTTPS协议 目录 【Linux网络编程】HTTPS协议HTTPS介绍加密常见的加密方式HTTPS的工作过程探究&#xff08;重点&#xff09;常见问题完整流程总结 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2024.5.9 前言&#xff1a;本篇博客将会介绍HTTPS协议 HTTPS…

proteus使用问题

1、无法和视频里面一样新建工程 2、实验效果和视频不也一样 自己的电路图(灯不亮)&#xff1a;

C语言—深入理解指针(1)

1.内存和地址 1.1 内存 计算机上CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;需要的数据是在内存中读取的&#xff0c;处理后的数据也会放回内存中&#xff0c;那我们买电脑的时候&#xff0c;电脑上内存是8GB/16GB/32GB 等&#xff0c;其实管理方式也…

Python从0到POC编写--实用小脚本02

爆破脚本&#xff1a; 爆破脚本也是我们经常使用的东西 这里就简单讲讲后台爆破脚本的编写吧 在编写之前&#xff0c;我们先通过访问网站去看看情况 首先我们可以先登录看看 输入账号 admin &#xff0c;密码 12345 后 登录失败&#xff0c;提示 用户名或密码错误 在输入…

探秘Tailwind CSS:前端开发的加速器(Tailwind CSS让CSS编写更简洁)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Tailwind CSS 📒📝 快速体验📝 深入学习⚓️ 相关链接 ⚓️📖 介绍 📖 在这个快速迭代的互联网时代,前端开发效率和设计质量的双重要求,使得开发者们不断寻求更高效的工具和方法。今天,我们要介绍的是一个能够极大…

java面向对象实现文字格斗游戏细节完善版

为了完善上一篇的文字格斗游戏的细节&#xff0c;所以加了些代码&#xff0c;使得交互更加的具体有趣! 效果 大家可以多运行几次代码&#xff0c;得到不同的战况&#xff01;&#xff01; 代码实现 1.bean类 import java.util.Random;public class TextGame {private Strin…

[性能优化] ScrollView视图优化为循环列表

问题描述&#xff1a; 原先商城的物品栏中的item 是load在一个scrollView 下&#xff0c;用于滑动查看。仅仅在父级panel下是使用了NGUI原生的scrollview 组件&#xff0c;随着商场物品列表中新物品的增多。panel下加载的实例也非常庞大。而大部分的实例用户也无法看到&#x…

python代码无法点击进入,如何破???

python代码无法点击进入&#xff0c;如何破&#xff1f;&#xff1f;&#xff1f; 举个栗子&#xff1a; model.chat是无法进入的&#xff0c;这时可以使用如下的命令进行操作&#xff1a; ?model.chat

Day31:单元测试、项目监控、项目部署、项目总结、常见面试题

单元测试 保证独立性。 Assert&#xff1a;断言&#xff0c;一般用来比较是否相等&#xff0c;比如 Assert.assertEquals 在JUnit测试框架中&#xff0c;BeforeClass&#xff0c;Before&#xff0c;After和AfterClass是四个常用的注解&#xff0c;它们的作用如下&#xff1a; …

Vue--》从零开始打造交互体验一流的电商平台(一)

今天开始使用 vue3 ts 搭建一个电商项目平台&#xff0c;因为文章会将项目的每处代码的书写都会讲解到&#xff0c;所以本项目会分成好几篇文章进行讲解&#xff0c;我会在最后一篇文章中会将项目代码开源到我的github上&#xff0c;大家可以自行去进行下载运行&#xff0c;希…