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