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

发布于 2024-11-09 15:19:09 字数 201 浏览 0 评论 0原文

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

I want to disable FPU/MMX/SSE instructions in x86 system, and I will implement a handler for the Device-Not-Available exception. I have referred to Control register wiki page; It seems that I have to set some flags in cr0 register. How to set these flags in cr0 and Do this work do at boot time?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一页 2024-11-16 15:19:09

用于管理 FPU 状态的 Linux 内核代码可以在 arch/x86/kernel/traps.cdo_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 的内部内核代码(不确定是否有)也可能会被破坏。实施此操作的风险由您自行承担。

The Linux kernel code for managing FPU state can be found in arch/x86/kernel/traps.c, do_device_not_available(). By default, the Linux kernel disables the FPU for all processes, and enables it on first access. This allows the kernel to reduce context switch overhead for processes that don't use the FPU. However, it also means that setting TS once at startup is insufficient; you must alter the Linux kernel code that manages the TS flag to maintain this state.

By adding an early check to do_device_not_available() for a disable flag and raising a signal or taking some other action, you can disable access to the FPU. Note that if you're doing this after the process's first use of the FPU on that particular CPU, the FPU may remain usable for some time, until the FPU registers are context-switched out, and the FPU is re-disabled. If you wish to avoid this, you will have to explicitly re-disable the FPU with stts().

Note that as the Linux ABI assumes you have a FPU (either emulated FPU or hardware FPU - if you have neither the kernel will not boot), this may cause unexpected behavior in applications. Additionally, any internal kernel code using the FPU (not sure if there is any) is likely to break as well. Implement this at your own risk.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文