【问题标题】:What register state is saved on a context switch in Linux?Linux 的上下文切换中保存了哪些寄存器状态?
【发布时间】:2010-06-09 14:17:37
【问题描述】:

您会在 Linux 中的哪个位置查找在上下文切换中保存了哪些寄存器?例如,我想知道在内核模式驱动程序代码中使用 FP 或向量寄存器是否安全(主要对 x86-64 和 ARM 感兴趣,但我希望得到与架构无关的答案)。

【问题讨论】:

  • 您想使用 FP 寄存器将信息传递回用户模式进程吗?
  • 想必,上下文切换不是必须保存所有寄存器吗?否则你永远不能使用它不保存的寄存器,因为你永远不知道它的值什么时候会被覆盖。
  • @Justin:许多操作系统(包括 windows 和 linux)仅在 FPU/SSE 寄存器第一次被进程使用后才保存它们。这是因为这是一个昂贵的过程,相对来说很少见。
  • 我不想将信息传递回用户模式;我想知道我是否可以在我的驱动程序中使用额外的寄存器(或做 FP 数学)。
  • @Justin:如果 FPU 状态未初始化,则抛出异常。操作系统捕捉到这个,设置一个“这个线程使用 FPU 标志”,初始化 FPU 状态,并恢复线程。

标签: linux linux-device-driver


【解决方案1】:

由于似乎没有人回答这个问题,让我冒险。

看看 _math_restore_cpu 和 __unlazy_fpu 方法。

您可以在这里找到它们:

类似 x86 的处理器具有用于保存 (fnsave) 和恢复 (frstor) FPU 状态的单独指令,因此看起来操作系统需要保存/恢复它们。

我认为除非 FPU 单元已被用户模式进程使用,否则 linux 上下文切换不会为您保存它。

因此,您需要自己(在您的驱动程序中)进行确认。您可以在驱动程序中使用 kernel_fpu_begin/end 来执行此操作,但通常不是一个好主意。

为什么这不是一个好主意?来自 Linus 本人:http://lkml.indiana.edu/hypermail/linux/kernel/0405.3/1620.html

引用:

您可以在 x86 上“安全地”使用

kernel_fpu_begin(); ... kernel_fpu_end();

并确保 所有 FP 的东西 介于这两件事之间,并且 你不做任何事情 可能会出错或休眠。

kernel_fpu_xxx() 宏确保 抢占被关闭等,所以 以上内容应该始终是安全的。

即便如此,当然,在 内核假设你实际上 一个 FPU,当然。内核内 FP 仿真包是 应该与内核 FP 指令一起工作。

哦,因为内核没有链接 使用 libc,你不能使用任何东西 甚至遥不可及。这一切都必须是 gcc 可以在线执行的操作, 没有任何函数调用。

换句话说:规则是你 真的不应该在 核心。有办法做到这一点,但 他们往往是一些真实的 特殊情况,尤其是做 MMX/XMM 工作。即唯一“合适的”FPU 用户实际上是 RAID 校验和 MMX 的东西。

莱纳斯

无论如何,你真的要依赖英特尔的浮点单元吗? http://en.wikipedia.org/wiki/Pentium_FDIV_bug(开个玩笑:-))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-09
    • 2018-11-24
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多