在Linux内核中使用FPU假设FPU块包含kernel_fpu_begin
和kernel_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吗?
如果是,我想知道为什么我们不能?
答案 0 :(得分:2)
内核只有一个地方可以保存FPU状态,因此不允许内核FPU代码中断其他内核FPU代码。
irq_fpu_usable
函数仅为内核FPU代码打印警告,实际正在中断其他内核FPU代码,但实际上,无法控制中断运行的时间。< / p>
因此,在中断上下文中使用FPU实际上是不可能的。 (它也没有意义,因为FPU代码仅作为性能优化有用,并且中断永远不会运行这么长时间以至于需要这样的优化。)