Short answer: Kernel code can use floating point if this use is surrounded by kernel_fpu_begin()
/kernel_fpu_end()
. These function handle saving and restoring the fpu context. Also, they call preempt_disable()
/preempt_enable()
, which means no sleeping, page faults etc. in the code between those functions. Google the function names for more information.
If I understand correctly, whenever a KM is running, it is using a hardware context (or hardware thread or register set -- whatever you want to call it) that has been preempted from some application thread.
No, a kernel module can run in user context as well (eg. when userspace calls syscalls on a device provided by the KM). It has, however, no relation to the float issue.
If you write your KM in c, the compiler will correctly insure that the general-purpose registers are properly saved and restored (much as in an application), but that doesn't automatically happen with floating-point registers.
That is not because of the compiler, but because of the kernel context-switching code.