【发布时间】:2016-06-28 05:20:52
【问题描述】:
我们知道,ARM 有一些分组寄存器,例如 sp 和 lr。换句话说,在 irq 模式下,sp_usr(和 lr_usr)是不可见的,即被 sp_irq。所以,我的问题是中断处理程序如何保存sp_usr。有些人可能认为这是不必要的,因为 sp_usr 在处理中断期间会自动保持不变,因为它在 irq 模式下是不可见且不可访问的。然而,这并非总是如此。考虑以下场景:
a) 线程 A 正在用户空间中运行。
b) 发生外部中断。
c) 处理程序运行,发现具有更高优先级的线程 B 现在已经获得了它一直在等待的资源,因此决定重新调度。
d) 保存线程 A 的上下文。现在线程 B 运行,首先以 SVC 模式运行,然后返回 user 模式。 这只是 sp_usr 的值被线程 B 覆盖的时刻。
e) 线程 B 调用类似 sleep 的东西。线程 A 将从中断点恢复运行。
那么,如果线程A中断时sp_usr没有保存,那么线程A如何恢复它的上下文呢?
【问题讨论】:
-
显然,SP & LR 需要存储,稍后恢复。当 CPU 处于用户模式或系统模式时,它们应该被存储。
-
你应该明确你正在查看的ARM架构版本,这可能会影响答案的细节。
-
@Sean Houlihane 我正在使用 ARMv7 Cortex-A9