Linux kernel 我们可以在中断上下文中使用FPU吗?
在Linux内核中使用FPU假设FPU块包含Linux kernel 我们可以在中断上下文中使用FPU吗?,linux-kernel,fpu,Linux Kernel,Fpu,在Linux内核中使用FPU假设FPU块包含kernel\u FPU\u begin和kernel\u FPU\u 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因以下
kernel\u FPU\u begin
和kernel\u FPU\u 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,对吗
如果是,我想知道为什么我们不能?内核只有一个地方可以保存FPU状态,因此不允许有中断其他内核FPU代码的内核FPU代码
irq\u fpu\u-available
函数仅为实际中断其他内核fpu代码的内核fpu代码打印警告,但实际上,无法控制中断何时运行
因此,在中断上下文中使用FPU是不可能的。
(这也没什么意义,因为FPU代码仅用于性能优化,中断的运行时间不应太长,因此需要进行此类优化。)您可以在中断上下文中使用FPU,但仅当您中断了一个用户模式程序或中断了一些不使用FPU的内核代码时。@CL.这是否意味着我不能在
softIRQ
上下文(例如在net\u rx\u action
中)中使用FPU?上述限制对硬中断上下文和软中断上下文没有区别。@CL.仅作最后澄清。我没有机会在softIRQ上下文中运行基于FPU的代码,对吗?。。