如果Linux softirq正在通过中断Linux内核模式运行,并且中断的任务正在使用FPU,则不允许在softirq中使用FPU。
如果被中断的任务是用户模式进程,则仍允许在softirq中使用FPU,但不能中断内核模式。
下面讨论代码。
问题是,为什么如此?
static inline bool interrupted_kernel_fpu_idle(void) { return !__thread_has_fpu(current) && (read_cr0() & X86_CR0_TS); }
只有一个地方可以存储FPU状态。 如果您中断的内核模式代码已经保存了用户模式的FPU状态,那么保存被中断的内核模式的FPU状态是没有用处的。