众所周知,ARM有一些库存寄存器,例如 sp 和 lr 。换句话说,在 irq 模式下, sp_usr (和 lr_usr )是不可见的,即被 sp_irq 。所以,我的问题是中断处理程序如何保存 sp_usr 。有些人可能会认为这是不必要的,因为 sp_usr 在处理中断期间会自动保持不变,因为它在 irq 模式下不可见且无法访问。然而,这并非总是如此。请考虑以下情形:
a)线程A正在用户空间中运行。
b)发生外部中断。
c)处理程序运行,并发现具有更高优先级的线程B现在已经获得了它一直在等待的资源,因此决定重新安排。
d)保存线程A的上下文。现在,线程B首先以 SVC 模式运行,然后返回用户模式。 这就是线程B覆盖sp_usr值的那一刻。
e)线程B调用 sleep 之类的东西。线程A将从中断点恢复运行。
因此,如果在线程A中断时未保存 sp_usr ,线程A将如何恢复其上下文?
答案 0 :(得分:1)
sp_usr必须在上下文切换到线程B之前保存,然后当线程B进入休眠状态并恢复线程A的上下文时。如果未保存线程A的sp_usr,则它将丢失。通常在上下文切换中,当前sp保存在当前任务控制块中。选择新任务后,将从新任务控制块恢复sp。
请参阅此主题:ARM. Access user R13 and R14 from Supervisor mode
这很大程度上取决于您使用的是哪种手臂架构!