【ARMv8/v9 系统寄存器 6 -- EL 异常等级判定寄存器 CurrentEL 使用详细将介绍】

本文主要是介绍【ARMv8/v9 系统寄存器 6 -- EL 异常等级判定寄存器 CurrentEL 使用详细将介绍】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • ARMv8/v9 EL 等级获取
      • EL 等级获取函数实现
      • EL 等级获取测试

ARMv8/v9 EL 等级获取

下面这个宏定义是用于ARMv8/v9架构下,通过汇编语言检查当前执行在哪个异常级别(Exception Level,EL)并据此跳转到不同的标签。

异常级别是ARM架构中定义的用于隔离和保护系统资源的机制,不同的级别有不同的权限,一般来说:

  • EL0是用户模式,
  • EL1是操作系统内核模式,
  • EL2是虚拟机监控器模式,
  • EL3是安全监控模式。

下面代码是UEFI中实现如何判断当前EL等级的代码如下:

#define  EL1_OR_EL2_OR_EL3(SAFE_XREG) \mrs    SAFE_XREG, CurrentEL ;\  // 从"CurrentEL"系统寄存器中读取当前的异常级别到SAFE_XREG寄存器cmp    SAFE_XREG, #0x8      ;\  // 比较当前的异常级别是否为EL2 (0x8)b.gt   3f                   ;\  // 如果当前异常级别大于EL2,跳转到标签3b.eq   2f                   ;\  // 如果当前异常级别等于EL2,跳转到标签2cbnz   SAFE_XREG, 1f        ;\  // 如果当前异常级别不为0(即不是EL0),跳转到标签1b      .                    ;\  // 如果没有进入任何异常级别,就停在当前位置(这种情况应该不会发生,这里的跳转是一个死循环)// 我们不应该到达这里

这段宏定义使用了几个汇编指令:

  • mrs:将系统寄存器的值移动到一个通用寄存器中。
  • cmp:比较两个值。
  • b.gt:如果比较的结果是大于,则跳转。
  • b.eq:如果比较的结果是等于,则跳转。
  • cbnz:如果寄存器的值不为零,则跳转。
  • b:无条件跳转。

使用这个宏可以根据当前的异常级别执行不同的代码路径。例如,如果当前是EL1、EL2或EL3,它可以执行一些特定于这些级别的安全检查或配置。下面以

EL 等级获取函数实现

如下是我自己实现的获取当前 EL等级的汇编代码和C代码:

  • 异常等级判断汇编代码:
.macro EL1_OR_EL2_OR_EL3 labelmrs    \label, CurrentELcmp    \label, #0x8b.gt   3fb.eq   2fcbnz   \label, 1fb      .
.endm
  • 获取当前异常等级汇编代码:
func get_arm_elnEL1_OR_EL2_OR_EL3 x1
1: mov x0, #1ret
2: mov x0, #2ret
3: mov x0, #3ret
endfunc get_arm_eln

EL 等级获取测试

int get_eln(void *data)
{uint32_t el = get_current_el();log_info("current el is:%d\n", el);return 0;
}

由于当前我的代码是运行在EL3等级上的,所以理论上应该打印出当前异常等级为3, 测试结果如下:
在这里插入图片描述

这篇关于【ARMv8/v9 系统寄存器 6 -- EL 异常等级判定寄存器 CurrentEL 使用详细将介绍】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/993556

相关文章

Java使用Mail构建邮件功能的完整指南

《Java使用Mail构建邮件功能的完整指南》JavaMailAPI是一个功能强大的工具,它可以帮助开发者轻松实现邮件的发送与接收功能,本文将介绍如何使用JavaMail发送和接收邮件,希望对大家有所... 目录1、简述2、主要特点3、发送样例3.1 发送纯文本邮件3.2 发送 html 邮件3.3 发送带

IDEA连接达梦数据库的详细配置指南

《IDEA连接达梦数据库的详细配置指南》达梦数据库(DMDatabase)作为国产关系型数据库的代表,广泛应用于企业级系统开发,本文将详细介绍如何在IntelliJIDEA中配置并连接达梦数据库,助力... 目录准备工作1. 下载达梦JDBC驱动配置步骤1. 将驱动添加到IDEA2. 创建数据库连接连接参数

使用DeepSeek搭建个人知识库(在笔记本电脑上)

《使用DeepSeek搭建个人知识库(在笔记本电脑上)》本文介绍了如何在笔记本电脑上使用DeepSeek和开源工具搭建个人知识库,通过安装DeepSeek和RAGFlow,并使用CherryStudi... 目录部署环境软件清单安装DeepSeek安装Cherry Studio安装RAGFlow设置知识库总

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

Python FastAPI入门安装使用

《PythonFastAPI入门安装使用》FastAPI是一个现代、快速的PythonWeb框架,用于构建API,它基于Python3.6+的类型提示特性,使得代码更加简洁且易于绶护,这篇文章主要介... 目录第一节:FastAPI入门一、FastAPI框架介绍什么是ASGI服务(WSGI)二、FastAP

Spring-AOP-ProceedingJoinPoint的使用详解

《Spring-AOP-ProceedingJoinPoint的使用详解》:本文主要介绍Spring-AOP-ProceedingJoinPoint的使用方式,具有很好的参考价值,希望对大家有所帮... 目录ProceedingJoinPoijsnt简介获取环绕通知方法的相关信息1.proceed()2.g

Maven pom.xml文件中build,plugin标签的使用小结

《Mavenpom.xml文件中build,plugin标签的使用小结》本文主要介绍了Mavenpom.xml文件中build,plugin标签的使用小结,文中通过示例代码介绍的非常详细,对大家的学... 目录<build> 标签Plugins插件<build> 标签<build> 标签是 pom.XML

2025最新版Python3.13.1安装使用指南(超详细)

《2025最新版Python3.13.1安装使用指南(超详细)》Python编程语言自诞生以来,已经成为全球最受欢迎的编程语言之一,它简单易学易用,以标准库和功能强大且广泛外挂的扩展库,为用户提供包罗... 目录2025最新版python 3.13.1安装使用指南1. 2025年Python语言最新排名2.

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

JAVA虚拟机中 -D, -X, -XX ,-server参数使用

《JAVA虚拟机中-D,-X,-XX,-server参数使用》本文主要介绍了JAVA虚拟机中-D,-X,-XX,-server参数使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录一、-D参数二、-X参数三、-XX参数总结:在Java开发过程中,对Java虚拟机(JVM)的启动参数进