Hsi*_*hiu 5 linux x86 exception-handling
我想在x86系统中禁用FPU/MMX/SSE指令,我将为Device-Not-Available异常实现一个处理程序.我已经提到了Control register wiki页面 ; 看来我必须在cr0寄存器中设置一些标志.如何在cr0中设置这些标志并在启动时执行此操作?
用于管理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被重新禁用.如果您希望避免这种情况,则必须使用显式重新禁用FPU stts().
请注意,由于Linux ABI假设您有FPU(模拟FPU或硬件FPU - 如果您既没有内核也无法启动),这可能会导致应用程序出现意外行为.此外,任何使用FPU的内部内核代码(不确定是否有)都可能会破坏.实施此风险需要您自担风险.