【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,跳转到标签3
        b.eq   2f                   ;\  // 如果当前异常级别等于EL2,跳转到标签2
        cbnz   SAFE_XREG, 1f        ;\  // 如果当前异常级别不为0(即不是EL0),跳转到标签1
        b      .                    ;\  // 如果没有进入任何异常级别,就停在当前位置(这种情况应该不会发生,这里的跳转是一个死循环)
                                       // 我们不应该到达这里

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

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

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

EL 等级获取函数实现

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

  • 异常等级判断汇编代码:
.macro EL1_OR_EL2_OR_EL3 label
    mrs    \label, CurrentEL
    cmp    \label, #0x8
    b.gt   3f
    b.eq   2f
    cbnz   \label, 1f
    b      .
.endm
  • 获取当前异常等级汇编代码:
func get_arm_eln
   EL1_OR_EL2_OR_EL3 x1
1: mov x0, #1
   ret
2: mov x0, #2
   ret
3: mov x0, #3
   ret
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, 测试结果如下:
在这里插入图片描述

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

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

相关文章

分布式系统的一致性与共识算法(三)

顺序一致性(Sequential Consistency) ZooKeeper 一种说法是ZooKeeper是最终一致性,因为由于多副本、以及保证大多数成功的ZAB协议,当一个客户端进程写入一个新值,另外一个客户端进程不能保证马上就能读到这个值,但是能保证最终能…

Ardupilot Rpanion iperf网络性能测试

Ardupilot Rpanion iperf网络性能测试 1. 源由2. 分析3. 安装4. 测试4.1 第一次测试4.1.1 iperf测试参数A4.1.1.1 测试链路14.1.1.2 测试链路24.1.1.3 测试链路3 4.1.2 iperf测试参数B - 测试链路34.1.2.1 测试数据4.1.2.2 数据简单分析4.1.2.3 数据深入分析4.1.2.4 模拟测试网…

AI作画算法详解:原理、应用与未来发展

随着人工智能技术的不断发展,AI作画逐渐成为了一个热门话题。AI作画,即利用人工智能算法生成绘画作品,不仅仅是技术的展示,更是艺术与科技结合的创新体现。本文将深入探讨AI作画的核心算法原理,并通过实例帮助读者更好…

三大平台直播视频下载保存方法

终于解决了视频号下载的问题,2024年5月15日亲测可用。 而且免费。 教程第二部分,有本地电脑无法下载的解决方案。 第一部分:使用教程(正常) 第1步:下载安装包 下载迅雷网盘搜索:大海福利合集…

Pygame中播放音频的方法

在Pygame中,通过mixer模块以及该模块中的music模块实现播放音频的功能。 1 mixer模块与music模块简介 mixer模块包含了用于导入与播放音频的类,而mixer模块中的music模块可以直接将音频文件导入到内存中用于播放。 2 mixer模块与music模块的使用 2.1…

Rust中使用Rocket框架返回html网页,返回一个基于 Handlebars (HBS) 模板的响应

在Rust中使用Rocket框架返回网页,通常涉及创建一个路由,该路由将返回一个HTML页面。Rocket是一个快速、易用且可扩展的Web框架,它允许你以一种简洁的方式定义路由和处理请求。 一、使用Rocket框架返回一个简单的HTML页面: 添加依…

Go微服务开源框架kratos的依赖注入关系总结

该文章为学习开源微服务框架kratos的学习笔记!官方文档见:简介 | Kratos Kratos 一套轻量级 Go 微服务框架,包含大量微服务相关框架及工具。 一、Kratos 项目结构简介 通过 Kratos 工具生成的 Go工程化项目模板如下: applicati…

如何查看SNMP设备的OID

什么是OID和MIB OID OID 代表对象标识符。 OID 唯一地标识 MIB 层次结构中的托管对象。 这可以被描述为一棵树,其级别由不同的组织分配。MIB MIB(管理信息基)提供数字化OID到可读文本的映射。 使用MIB Browser扫描OID 我的设备是一台UPS SN…

C#语音播报(通过CoreAudioAPI完成对扬声器的控制)

1,效果: 作用: 可对当前内容(例如此例中的重量信息)进行语音合成播报 。可设置系统扬声器音量与状态(是否静音),同时根据扬声器状态同步更新当前控件状态与值,实现强制PC扬声器按照指定的音量进行播报&…

原生IP介绍

原生IP,顾名思义,即初始真实IP地址,是指从互联网服务提供商获得的IP地址,IP地址在互联网与用户之间直接建立联系,不需要经过代理服务器代理转发。 原生IP具备以下特点。 1.直接性 原生IP可以直接连接互联网&#xff…

Docker mysql主从同步

1. 在主节点注册一个账号,用于子节点访问主节点 #mysql 1主2从,先创建主节点 ,注意 \ 后面不要带空格 docker run --name mysql-m \ -v /usr/local/mysql/data:/var/lib/mysql \ -v /usr/local/mysql/conf:/etc/mysql/conf.d \ -v /usr/local/mysql/log:…

STK中的光照计算模型

本文简要阐述STK中光照计算的模型。 在航天任务中,通常需要分析地面站、飞行器在一定时间内的光照情况,具体包括: 地面站处在光照区和阴影区的具体时间范围;考虑地形遮挡后,地面站的光照区和阴影区的变化情况&#x…

实战+代码!Selenium + Phantom JS爬取天天基金数据

功能: 通过程序实现从基金列表页,获取指定页数内所有基金的近一周收益率以及每支基金的详情页链接。再进入每支基金的详情页获取其余的基金信息,将所有获取到的基金详细信息按近6月收益率倒序排列写入一个Excel表格。 思路: 1.…

物联网设计竞赛_5_Jetson Nano连接摄像头解决运行卡顿问题

我在命令行用camorama命令打开摄像头的时候发现摄像头非常流畅 当我用python的cv2库打开摄像头的时候发现摄像头显示图片异常卡顿,在网上多方寻觅无果后,经过偶然尝试,我发现了卡顿原来是视频帧率问题 淘宝官方资料看我的摄像头只有30fps, …

Gone框架介绍17 - 创建一个可运行在生产环境的Web项目

gone是可以高效开发Web服务的Golang依赖注入框架 github地址:https://github.com/gone-io/gone 文档原地址:https://goner.fun/zh/guide/auto-gen-priest.html 请帮忙在github上点个 ⭐️吧,这对我很重要 ;万分感谢!&a…

练习队列的相关操作:循环队列

1. 思路解析 循环队列就是在只有有限的空间时使用队列实现循环存储数据&#xff0c;有双向链表和数组两种选择&#xff0c;这里我们使用数组实现循环队列&#xff08;因为链表我不会 >-<&#xff09; 2. 相关函数及其实现 2.1 判空与判满 判空&#xff1a;直接返回头尾…

景源畅信数字:做抖音切片的方法分享?

一提起抖音切片&#xff0c;很多人可能会想到那些让人眼前一亮的短视频。它们通常短小精悍&#xff0c;内容丰富多彩&#xff0c;能够迅速吸引观众的注意力。但是&#xff0c;如何制作出这样的切片视频呢?这就是我们今天要探讨的问题。 一、选材与剪辑 制作抖音切片&#xff0…

每日一日 kotori和气球

kotori和气球 (nowcoder.com) 题目描述&#xff0c;就是只要相邻的气球不相同即可&#xff0c; 解题思路 使用高中的排列组合&#xff1a;第一个位置 可以填n种情况 其次后推不可与前一个相同所以可以 填n -1中情况&#xff0c;结果相乘即可 可以使用bigInteger实现 或者说…

记录计全支付切换到RabbitMQ时启动报错的问题

记录计全支付切换到RabbitMQ时启动报错的问题 首先在application.yml中切换到RabbitMQ配置安装RabbitMQ、Erlang、延时插件 rabbitmq_delayed_message_exchange&#xff0c;延迟插件必装 首先在application.yml中切换到RabbitMQ配置 # 第一处rabbitmq:addresses: 127.0.0.1:56…

微信视频号开店需要多少钱?2024年最新入驻条件,商家必看!

哈喽~我是电商月月 视频号小店逐渐走入大众视野&#xff0c;观众多&#xff0c;但里面的商家却很少&#xff0c;很多想创业做电商的朋友&#xff0c;就把目光锁定到了视频号平台&#xff0c;那现在视频号小店的入驻费用肯定是新手&#xff0c;最关心的事情了&#xff01; 今天…