如何禁用浮点单元(FPU)?

我想在x86系统中禁用FPU / MMX / SSE指令,并且我将实现一个Device-Not-Availableexception处理程序。 我已经提到了Control register的维基页面 ; 看来我必须在cr0寄存器中设置一些标志。 如何在cr0中设置这些标志,并在启动时进行这项工作?

Solutions Collecting From Web of "如何禁用浮点单元(FPU)?"

用于管理FPU状态的Linux内核代码可以在arch / x86 / kernel / traps.c , do_device_not_available() 。 默认情况下,Linux内核会禁用所有进程的FPU,并在第一次访问时启用它。 这允许内核减少不使用FPU的进程的上下文切换开销。 但是,这也意味着在启动时设置一次TS是不够的; 您必须更改管理TS标志的Linux内核代码以保持此状态。

通过为禁用标志添加一个提前检查到do_device_not_available()并引发一个信号或采取其他一些行动,可以禁止访问FPU。 请注意,如果在该特定CPU上首次使用FPU之后执行此操作,则FPU可能会保持可用状态一段时间,直到FPU寄存器被上下文切换出去,并且FPU被重新禁用。 如果你想避免这种情况,你将不得不使用stts()重新禁用FPU。

请注意,由于Linux ABI假定您有一个FPU(仿真FPU或硬件FPU – 如果您既没有内核也不会启动),这可能会在应用程序中导致意外的行为。 此外,任何使用FPU的内部内核代码(不知道是否有)也可能会中断。 实施这个需要您自担风险。