在HIGH_LEVEL IRQL上执行的内核例程中,我一直试图通过直接调用FXSAVE和FXRSTOR来管理浮点状态。由于KeSaveExtendedProcessorState和KeRestoreExtendedProcessorState在这个级别上不可用,我不得不求助于这个方法。
以下是我当前的实现:
在汇编代码中,我定义了两个过程SaveFxState和RestoreFxState:
SaveFxState PROC
; Save the floating point state
mov rax, rcx
fxsave [rax]
ret
SaveFxState ENDP
RestoreFxState PROC
; Restore the floating point state
mov rax, rcx
fxrstor [rax]
ret
RestoreFxState ENDP
字符集
这些过程通过外部“C”链接公开到我的C++代码:
extern "C" {
void SaveFxState(void* saveArea);
void RestoreFxState(void* saveArea);
}
型
我使用这些程序如下:
FXSAVE_FORMAT g_FxSaveArea;
SaveFxState(&g_FxSaveArea);
// Floating-point operations are here
RestoreFxState(&g_FxSaveArea);
型
有人可以确认这种方法在HIGH_LEVEL IRQL上管理浮点状态是否正确和安全吗?我将感谢任何改进的见解或建议。
1条答案
按热度按时间jjjwad0x1#
我一直在进行内核编程,需要执行浮点运算。在内核模式下这样做的挑战之一是在高级irql中保留浮点和SIMD状态。我想分享一个我发现使用_fxsave64和_fxrstor64 intrinsic有效的方法。
必要条件:确保您有充分的理由在内核中使用浮点,因为它可能会引入难以调试的问题。
解决方案:首先,声明一个缓冲区来保存FPU状态。此缓冲区应为16字节
字符集
接下来,在_fxsave64和_fxrstor64之间 Package 浮点代码:
型
注意事项:
我希望这对任何面临类似挑战的人都有帮助!欢迎反馈或进一步的见解!