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

2024-04-26

我想在 x86 系统中禁用 FPU/MMX/SSE 指令,并且我将为设备不可用异常实现一个处理程序。我已经提到过控制寄存器 wiki 页面 http://en.wikipedia.org/wiki/Control_register;看来我必须在 cr0 寄存器中设置一些标志。如何在 cr0 中设置这些标志以及这项工作在启动时执行吗?


用于管理 FPU 状态的 Linux 内核代码可以在拱门/x86/kernel/traps.c http://lxr.linux.no/linux+v2.6.39/arch/x86/kernel/traps.c#L778, do_device_not_available()。默认情况下,Linux 内核对所有进程禁用 FPU,并在首次访问时启用它。这允许内核减少不使用 FPU 的进程的上下文切换开销。然而,这也意味着在启动时设置一次 TS 是不够的;您必须更改管理 TS 标志的 Linux 内核代码才能维持此状态。

通过添加早期检查do_device_not_available()对于禁用标志并发出信号或采取其他操作,您可以禁用对 FPU 的访问。请注意,如果您在该特定 CPU 上的进程首次使用 FPU 后执行此操作,则 FPU 可能会在一段时间内保持可用,直到 FPU 寄存器被上下文切换,并且 FPU 被重新禁用。如果您希望避免这种情况,则必须使用以下命令显式重新禁用 FPU:stts().

请注意,由于 Linux ABI 假定您有 FPU(模拟 FPU 或硬件 FPU - 如果两者都没有,内核将无法启动),这可能会导致应用程序出现意外行为。此外,任何使用 FPU 的内部内核代码(不确定是否有)也可能会被破坏。实施此操作的风险由您自行承担。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何禁用浮点单元(FPU)? 的相关文章

随机推荐