3

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

4

1 回答 1

6

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

看看 _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 在 x86 上“安全地”执行此操作

kernel_fpu_begin(); ... kernel_fpu_end();

并确保所有FP 的东西都在这两件事之间,并且你不要做任何可能出错或睡觉的事情。

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

当然,即便如此,在内核中使用 FP 当然也假设您实际上 一个 FPU。内核内 FP 仿真包 应该与内核 FP 指令一起使用。

哦,由于内核不与 libc 链接,所以你不能使用任何东西,即使是远程花哨的东西。这一切都必须是 gcc 可以在线完成的东西,无需任何函数调用。

换句话说:规则是你真的不应该在内核中使用 FP。有很多方法可以做到这一点,但它们往往适用于一些真正的 特殊情况,特别是用于 MMX/XMM 工作。即,唯一“正确”的 FPU 用户实际上是 RAID 校验和 MMX 的东西。

莱纳斯

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

于 2010-06-09T16:27:16.993 回答