【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

相关文章

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

Java中使用Hutool进行AES加密解密的方法举例

《Java中使用Hutool进行AES加密解密的方法举例》AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个,下面:本文主要介绍Java中使用Hutool进行AES加密解密的相关资料... 目录前言一、Hutool简介与引入1.1 Hutool简介1.2 引入Hutool二、AES加密解密基础

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio