it编程 > 硬件开发 > arm开发

ARMv8-A 与异常相关的指令

115人参与 2024-08-06 arm开发

与异常相关的指令

最近一直在学习 armv8-a 的东西,记录一下与异常相关的指令。下面的内容基于aarch64讨论,暂不考虑 aarch32。
与异常生成相关的指令如下所示。下面主要学习 svchvc
在这里插入图片描述

1. svc

svc (supervisor call) 产生一个路由到 el1 的异常,可以调用系统服务这些。此时,esr_elx.ec = 0x15

2. hvc

个人认为这个应该就是用于实现虚拟化相关的指令,要通过 hypercall 调用虚拟机管理器的一些服务。因为 hypervisor 的 el2 就是 non-secure,所以要使用 hvc 应该是只能从 non-secure el1 调用,应该就是指 guest os 的内核态了。

hvc (hypervisor call) 指令用于生成针对 el2 的异常。就是说,调用这个指令后,会产生一个异常,陷入到 el2,通常也就是 hypervisor 会处理这个异常。
在 el1 运行的非安全软件会调用 hypervisor 请求一个服务,让 hypervisor 帮忙做一些事情。但是 el0 和 secure el1 是不可以通过 hvc 陷入 el2 调用 hypervisor 的服务的,产生的异常也是 undefined。按理来说,只有 non-secure el1 才可以顺利执行 hvc 指令。

执行 hvc 指令之后,产生异常,走到异常向量表。通过 esr_elx 判断异常的原因,esr_elx.ec = 0x16,判断是 hvc类型的异常后,就可以进入我们自己定义好的 hypercall 处理程序啦。

esr_elx 还是一个挺重要的寄存器的。它包含了陷入 elx 异常的 syndrome (综合征?) 信息。ec 就是异常类型!

在这里插入图片描述

3. eret (异常返回指令)

eret 是异常返回指令,它会使用当前异常级别的 elrspsr
执行这个指令时,会从 spsr 中恢复 pstate,然后跳转到 elr 中存放的地址。

肯定是不能在 el0 里面调用这个指令的!

与内存屏障相关的指令

这部分有点难,主要学习了一下 isb

1. dmb

2. dsb

dsb 用于同步执行流(execution stream)和内存访问(memory accesses)。

3. isb

有时候看到操作完 gicv3 的系统寄存器后,还会专门执行 isb 指令。
isb 全称是 instruction synchronization barrier,指令同步屏障。

isb 会刷新cpu的流水线,比如清掉一些预取的指令。只有当 isb 完成后,才会从缓存或内存中读取 isb 之后的指令。

对于一些系统控制器,它们会控制系统行为。
比如说gicv3中的一些系统寄存器(cpu接口寄存器这些),对它们进行写操作之后是很有必要使用 isb 同步一下的。个人觉得,gicv2 因为里面的寄存器都是mmio,所以应该不会使用 isb 同步。

在该指令之后的指令也会受此影响,所以需要同步一下再往下面执行。

备注:图片来自 armv8-a 手册。

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

2018年亚马逊云科技推出基于Arm的定制芯片实例

08-06

【keil】解决Error: CreateProcess failed, Command: ‘C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin -o ..\o

08-06

OpenHarmony 5.0 纯血鸿蒙系统

08-06

Banana Pi BPI-M5 Pro 低调 SBC 采用 Rockchip RK3576 八核 Cortex-A72/A53 AIoT SoC

08-06

HarmonyOS应用开发者基础认证

08-06

初识HarmonyOS

08-06

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论