在Windows系统中如何禁用软件SMI(系统管理中断)

3

从Windows 10 1809开始,操作系统会生成大量的软件SMI。
我们在独立的处理器核心上运行实时应用程序,每个SMI都会产生不可预测的延迟。在1809之前,总是可以在BIOS中禁用SMI。
Windows中的调用堆栈如下:

hal!HalEfiGetEnvironmentVariable+0x56       
hal!HalGetEnvironmentVariableEx+0xb572      
nt!IopGetEnvironmentVariableHal+0x2a        
nt!IoGetEnvironmentVariableEx+0x85          
nt!ExpGetFirmwareEnvironmentVariable+0x91   
nt!ExGetFirmwareEnvironmentVariable+0x110ce3
nt!NtQuerySystemEnvironmentValueEx+0x6e     

通过向端口0xb2发送OUT指令可以生成SMI。从NVRAM中读取UEFI变量需要使用SMI。当BIOS处于传统模式下时,将没有SMI。

是否可以配置Windows,以便它不使用SMI访问UEFI变量?


1
我认为你做不到,因为它是UEFI\BIOS流程的一部分。 - Baget
2个回答

2
简短的回答是不行,不能配置Windows以防止在UEFI变量访问时生成SW SMIs,因为这些SMIs并非由Windows生成。这些SMIs是在固件内部生成的。
所有支持UEFI的操作系统都通过GetVariable()和SetVariable()服务读取/写入UEFI变量,这些服务是由UEFI固件通过系统表向操作系统公开的运行时服务之一 - 请参见UEFI规范第8节。大多数固件中变量服务的当前实现是在SMM中处理实际的Get/Set变量请求,出于安全原因。
因此,设备的固件负责生成SW SMIs,而不是操作系统。但是,操作系统和某些系统服务/应用程序绝对需要使用UEFI变量,因为这是UEFI感知操作系统在UEFI固件上运行的方式。

1
@prl,Windows 不会 访问端口0xb2。固件 会在响应UEFI变量访问时输出到0xb2。虽然Ubuntu和Windows都能够在没有变量的情况下启动,但我不会称它们为不必要的-很可能一些功能无法正常工作。Windows不经常访问UEFI变量;在启动期间有大量的读/写操作,但之后就会保持安静,并且只在必要时进行访问。我认为在Windows中禁用变量或阻止0xb2访问并保持其稳定是不现实的。我会专注于查找系统中谁在访问变量。 - sun2sirius
1
@sun2sirius 感谢您的回答。很明显,SMM是读取UEFI的唯一安全模式,但它会导致实际性能下降。我知道操作系统可以在加载/关闭期间读写NVRAM,但为什么要在运行时使用它呢?如果没有隐藏的注册表键,则禁用SMI的唯一方法是在此类API调用上添加钩子。 - Vladimir Pustovalov
1
@vladimir-pustovalov,你可能想尝试向上调用堆栈,以查看是谁在进行UEFI变量的内核调用。我刚刚构建了一个测试BIOS,显示了所有变量访问,并启动了Windows-我看到了一次突发的启动,然后几分钟后又有一次突发。但之后就再也没有发生过了,我等了一个多小时。 - sun2sirius
1
你也可以查看GetEnvironmentVariable()调用的堆栈帧,以查看变量名称和GUID - 这可能会让你知道为什么要访问它。这绝对不是正常的。然后,你可以找到读取该变量的组件,并尝试禁用或更好地配置它。 - sun2sirius
1
让我们在聊天中继续这个讨论 - sun2sirius
显示剩余8条评论

1
在支持AMD-V(例如AMD处理器、Hygon处理器)的处理器上,答案是肯定的,但是在内核模式下。有两个指令叫做stgiclgi,其中stgi设置GIF,而clgi清除GIFGIF用于控制中断行为,以便可以进入绝对原子操作。根据AMD-V的定义,Internal SMIs(例如I/O Trapping)将被丢弃,而External SMIs(例如来自外部硬件的SMIs或APIC发送的IPIs)将在清除GIF时保持挂起。在执行这些指令之前,请确保启用了EFER MSR中的SVME位。
如果您想以更通用的方式实现它,而不依赖于AMD-V,您可以尝试将代码放入SMI处理程序中,在那里后面发生的SMI将被锁存,而处理器处于SMM状态。
参考资料:
第2卷《系统编程》,第10.3.3章“异常和中断”,第15.17章“全局中断标志,STGI和CLGI指令”,AMD64体系结构程序员手册。
https://www.amd.com/system/files/TechDocs/24593.pdf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接