Поскольку никто не ответил на этот вопрос, позвольте мне рискнуть.
Взгляните на методы _math_restore_cpu и __unlazy_fpu.
Вы можете найти их здесь:
Процессоры, подобные x86, имеют отдельные инструкции для сохранения (fnsave) и восстановления (frstor) состояния FPU, и поэтому оно выглядит как ОСобременен их сохранением / восстановлением.
Я полагаю, если модуль FPU не был использован процессом пользовательского режима, переключение контекста Linux не сохранит его для вас.
Так что вам нужно сделать это самостоятельно (в своем драйвере), чтобы быть уверенным.Вы можете использовать kernel_fpu_begin / end, чтобы сделать это в вашем драйвере, но обычно это не очень хорошая идея.
Почему это не очень хорошая идея?От самого Линуса: http://lkml.indiana.edu/hypermail/linux/kernel/0405.3/1620.html
Цитируется:
Вы можете сделать это "безопасно" на x86, используя
kernel_fpu_begin ();... kernel_fpu_end ();
и убедитесь, что all материал FP находится между этими двумя вещами, и что вы не делаете что-либо , которое можетошибка или сон.
Макросы kernel_fpu_xxx () обеспечивают отключение вытеснения и т. д., поэтому вышеприведенное всегда должно быть безопасным.
Даже тогда, конечно, использование FP в ядре предполагаетчто у вас на самом деле есть FPU, конечно.Пакет эмуляции FP в ядре не должен работать с инструкциями ядра FP.
О, и поскольку ядро не связывается с libc, вы ничего не можете использовать даже удаленнофантазии.Все это должно быть то, что gcc может делать в строке без каких-либо вызовов функций.
Другими словами: правило таково, что вам действительно не следует использовать FP в ядре.Есть способы сделать это, но они имеют тенденцию быть для некоторых реальных особых случаев, особенно для выполнения работы MMX / XMM.Т.е. единственным «правильным» пользователем FPU на самом деле является MMX с контрольной суммой RAID.
Linus
В любом случае, вы действительно хотите полагаться на модуль с плавающей запятой Intel?http://en.wikipedia.org/wiki/Pentium_FDIV_bug (шучу: -)).