我是ARMv8架构的新手,在阅读v8异常向量时,我无法理解在存在SP_ELx向量集时添加SP_EL0级别向量的重要性。我试图找到一个有用的用例。据我所知,默认情况下,如果异常在同一级别进行,则使用相同异常级别的堆栈,例如,如果定义了EL2(Hyp)模式,那么如果在EL2级别发生异常,则将使用在EL2定义的堆栈但不会确定如果我配置使用EL0级别堆栈在什么用例下这可能有用?有人能给出一个用例并解释一下吗?
同样在浏览规范时,似乎这两种不同的堆栈使用思想来自Cortex-M架构,但我对线程和处理程序模式也不是很清楚。任何人都可以解释一下吗?
只是想在此添加ARMv7没有线程和处理程序的概念,所以我不清楚ARMv8中的要求。
由于
答案 0 :(得分:1)
SP_EL0是“正常”堆栈指针。任何EL中运行的代码都应该在SP_EL0上运行。 SP_EL1 / 2/3是该模式的“异常”堆栈指针。当发生异常,故障或中断时,处理器切换到该堆栈(并可能切换EL)。您的异常处理程序代码应该执行保存异常状态所需的操作,并使自己进入SP_EL0以完成异常处理。
也就是说,除了异常处理程序的早期阶段外,您的EL0用户代码,EL1内核代码,EL2虚拟机管理程序和EL3监视器都应该使用SP_EL0。如果你在SP_ELx(非零)时采用嵌套异常,你可以吹掉你的堆栈,ELR,FAR等,这就是你想要保存它们并尽快回到SP_EL0的原因。 / p>