我们可以在中断上下文中使用FPU吗?

时间:2013-11-21 10:01:31

标签: linux-kernel fpu

在Linux内核中使用FPU假设FPU块包含kernel_fpu_beginkernel_fpu_end函数。第一个看起来像这样:

 41 static inline void kernel_fpu_begin(void)
 42 {
 43         WARN_ON_ONCE(!irq_fpu_usable());
 44         preempt_disable();
 45         __kernel_fpu_begin();
 46 }

如果由于以下原因导致FPU无法使用,则内核会发出警告:

 64 bool irq_fpu_usable(void)
 65 {
 66         return !in_interrupt() ||
 67                 interrupted_user_mode() ||
 68                 interrupted_kernel_fpu_idle();
 69 }
 70 EXPORT_SYMBOL(irq_fpu_usable);

所以,我是对的,我们不能在中断上下文中使用FPU吗?

如果是,我想知道为什么我们不能?

1 个答案:

答案 0 :(得分:2)

内核只有一个地方可以保存FPU状态,因此不允许内核FPU代码中断其他内核FPU代码。

irq_fpu_usable函数仅为内核FPU代码打印警告,实际正在中断其他内核FPU代码,但实际上,无法控制中断运行的时间。< / p>

因此,在中断上下文中使用FPU实际上是不可能的。 (它也没有意义,因为FPU代码仅作为性能优化有用,并且中断永远不会运行这么长时间以至于需要这样的优化。)