【问题标题】:On ARM, how to save the sp_usr register if a thread running in user mode is interrupted在 ARM 上,如果在用户模式下运行的线程被中断,如何保存 sp_usr 寄存器
【发布时间】:2016-06-28 05:20:52
【问题描述】:

我们知道,ARM 有一些分组寄存器,例如 splr。换句话说,在 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

标签: linux arm mode


【解决方案1】:

sp_usr 必须在上下文切换到线程 B 之前保存,然后当线程 B 进入睡眠状态并恢复线程 A 的上下文时。如果线程 A 的 sp_usr 未保存,则它会丢失。通常在上下文切换中,当前 sp 保存在当前任务控制块中。当新任务被选中时,sp 将从新任务控制块中恢复。

看到这个帖子:ARM. Access user R13 and R14 from Supervisor mode

这在很大程度上取决于您使用的 arm 架构!

【讨论】:

    猜你喜欢
    • 2011-09-14
    • 1970-01-01
    • 2013-11-07
    • 2015-12-28
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2017-08-06
    • 2020-05-17
    相关资源
    最近更新 更多