有没有更好的办法从访问用户模式堆栈指针(R13_usr)异常中比这在特权模式下访问用户堆栈指针(R13_usr)(例外)
STM SP,{SP}^
NOP
LDM SP,{SP}
注意:根据ARMv5,nop是用于后退/前向兼容性原因ARMv4 ARM
有没有更好的办法从访问用户模式堆栈指针(R13_usr)异常中比这在特权模式下访问用户堆栈指针(R13_usr)(例外)
STM SP,{SP}^
NOP
LDM SP,{SP}
注意:根据ARMv5,nop是用于后退/前向兼容性原因ARMv4 ARM
ARMv4及更高版本具有系统模式,其全部目的是为了具有用户寄存器的完整视图的特权模式,所以除非您想兼容与真正古老的硬件(橡子阿基米德,任何人?)你可以选择只是切换模式,并直接在用户环境中做东西。对于简单的检索SP这是一个有点忙,但它是避免触摸存储器选项:
mrs r0, cpsr
orr r1, r0, #0xf
msr r1, cpsr
mov r2, sp
msr r0, cpsr ; back to whatever the previous mode was with user SP in r2
mov sp, r2
在ARMv7的与虚拟化扩展(的Cortex-A7/A15/A17)有新开户寄存器访问指令,所以事情变得微不足道:
.arch_extension virt
mrs sp, r13_usr
这不是我的意思。问题有点误导。我的想法是,我正处于中断服务程序中,并希望将正在运行的任务保存在自己的堆栈中。我可以“松开”IRQ堆栈,所以用USER-SP覆盖它,然后在其上保存上下文。 – mjjoker
@mjjoker是的,这一点都不清楚,坦率地说,我想知道它是如何工作的 - 如果用户堆栈地址未映射到特权页表中,该怎么办?如果用户代码破坏了自己的堆栈指针呢?当没有有效的用户上下文时,如果您从SVC或其他非用户模式中获取中断,该怎么办?这里似乎会出现很多非明显的假设,而且听起来好像你正在试图以一种架构并非真正为之设计的方式来做事。 – Notlikethat
- 检查堆栈损坏并始终出现问题 - 我没有执行中断嵌套,因此一次只有一个服务例程,并且始终是有效的用户环境 - 我没有使用MMU/MPU,因此没有页表和/或映射 这些都是有效的点,但我希望我想到的一切 – mjjoker
目前问,这个问题不能回答。 **更好的方式**完全是主观的。这并不是说你没有一个好问题的起源,但你真的需要考虑你想要的东西。关于为什么需要'sp_usr'的一些背景可能会有所帮助。 –