在Linux中的上下文切换中保存了什么寄存器状态?

fed*_*ral 3 linux linux-device-driver

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

小智 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上"安全地"使用它

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(开玩笑:-)).