您会在 Linux 的哪个位置查找上下文切换中保存的寄存器?例如,我想知道在内核模式驱动程序代码中使用 FP 或向量寄存器是否安全(主要对 x86-64 和 ARM 感兴趣,但我希望得到一个独立于体系结构的答案)。
1 回答
由于似乎没有人回答这个问题,让我冒险。
看看 _math_restore_cpu 和 __unlazy_fpu 方法。
你可以在这里找到它们:
- http://www.cs.fsu.edu/~baker/devices/lxr/http/ident?i=math_state_restore
- http://www.cs.fsu.edu/~baker/devices/lxr/http/ident?i=__unlazy_fpu
类似 x86 的处理器具有用于保存 (fnsave) 和恢复 (frstor) FPU 状态的单独指令,因此看起来操作系统需要保存/恢复它们。
我认为除非用户模式进程使用了 FPU 单元,否则 linux 上下文切换不会为您保存它。
所以你需要自己做(在你的驱动程序中)以确保。您可以在驱动程序中使用 kernel_fpu_begin/end 来执行此操作,但通常不是一个好主意。
- http://www.cs.fsu.edu/~baker/devices/lxr/http/ident?i=kernel_fpu_begin
- http://www.cs.fsu.edu/~baker/devices/lxr/http/ident?i=kernel_fpu_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(开个玩笑:-))。