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(开玩笑:-)).
| 归档时间: |
|
| 查看次数: |
3034 次 |
| 最近记录: |