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

时间:2010-06-09 14:17:38

标签: linux linux-device-driver

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

1 个答案:

答案 0 :(得分: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(开个玩笑: - ))。