115人参与 • 2024-08-06 • arm开发
最近一直在学习 armv8-a 的东西,记录一下与异常相关的指令。下面的内容基于aarch64讨论,暂不考虑 aarch32。
与异常生成相关的指令如下所示。下面主要学习 svc
和 hvc
。
svc
(supervisor call) 产生一个路由到 el1 的异常,可以调用系统服务这些。此时,esr_elx.ec = 0x15
。
个人认为这个应该就是用于实现虚拟化相关的指令,要通过 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 就是异常类型!
eret
是异常返回指令,它会使用当前异常级别的 elr
和 spsr
。
执行这个指令时,会从 spsr
中恢复 pstate
,然后跳转到 elr
中存放的地址。
肯定是不能在 el0 里面调用这个指令的!
这部分有点难,主要学习了一下 isb
。
dsb
用于同步执行流(execution stream)和内存访问(memory accesses)。
有时候看到操作完 gicv3 的系统寄存器后,还会专门执行 isb
指令。
isb
全称是 instruction synchronization barrier
,指令同步屏障。
isb
会刷新cpu的流水线,比如清掉一些预取的指令。只有当 isb
完成后,才会从缓存或内存中读取 isb
之后的指令。
对于一些系统控制器,它们会控制系统行为。
比如说gicv3中的一些系统寄存器(cpu接口寄存器这些),对它们进行写操作之后是很有必要使用 isb
同步一下的。个人觉得,gicv2 因为里面的寄存器都是mmio,所以应该不会使用 isb
同步。
在该指令之后的指令也会受此影响,所以需要同步一下再往下面执行。
备注:图片来自 armv8-a 手册。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论