与异常相关的指令
最近一直在学习 ARMv8-A 的东西,记录一下与异常相关的指令。下面的内容基于AArch64讨论,暂不考虑 AArch32。
与异常生成相关的指令如下所示。下面主要学习 SVC
和 HVC
。
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
是异常返回指令,它会使用当前异常级别的 ELR
和 SPSR
。
执行这个指令时,会从 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
之后的指令。
Instruction Synchronization Barrier flushes the pipeline in the PE, so that all instructions following the ISB are fetched from cache or memory, after the instruction has been completed.
对于一些系统控制器,它们会控制系统行为。
比如说GICv3中的一些系统寄存器(CPU接口寄存器这些),对它们进行写操作之后是很有必要使用 ISB
同步一下的。个人觉得,GICv2 因为里面的寄存器都是MMIO,所以应该不会使用 ISB
同步。
It ensures that the effects of context changing operations executed before the ISB instruction are visible to the instructions fetched after the ISB. Context changing operations include changing the ASID, TLB maintenance instructions, and all changes to the System registers.
在该指令之后的指令也会受此影响,所以需要同步一下再往下面执行。
In addition, any branches that appear in program order after the ISB instruction are written into the branch prediction logic with the context that is visible after the ISB instruction. This is needed to ensure correct execution of the instruction stream.文章来源:https://www.toymoban.com/news/detail-833262.html
备注:图片来自 ARMv8-A 手册。文章来源地址https://www.toymoban.com/news/detail-833262.html
到了这里,关于ARMv8-A 与异常相关的指令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!