1

在 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 是对的吗?

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

4

1 回答 1

2

内核只有一处保存 FPU 状态,因此不允许有内核 FPU 代码中断其他内核 FPU 代码。

irq_fpu_usable函数仅针对实际中断其他内核 FPU 代码的内核 FPU 代码打印警告,但实际上,无法控制中断何时运行。

因此,在中断上下文中使用 FPU 是不可能的。(这也没有任何意义,因为 FPU 代码仅可用作性能优化,并且中断不应运行太久以至于需要进行此类优化。)

于 2013-11-22T23:22:49.810 回答