【发布时间】:2015-01-13 04:07:29
【问题描述】:
我想知道是否有一种方法可以通过 C#.NET 测试主机系统 CPU 中是否存在 AES-NI。
让我先说一下,这个问题不是询问如何使用来自 .NET 的 AES-NI。事实证明,简单地使用AESCryptoServiceProvider 将使用 AES-NI(如果可用)。该结果基于我将AESCryptoServiceProvider 的性能与 TrueCrypt 中提供的基准进行比较的独立基准,TrueCrypt 确实支持 AES-NI。在使用和不使用 AES-NI 的两台机器上,结果惊人地相似。
我希望能够对其进行测试的原因是能够向用户表明他们的计算机支持 AES-NI。这将是相关的,因为它可以减少涉及诸如“但我的朋友也有 Core i5 但他的速度要快得多!”之类的问题的支持事件。如果程序的用户界面可以向用户表明他们的系统支持或不支持 AES-NI,那么它也可能表明“性能较慢是正常的,因为该系统不支持 AES-NI。”
(我们要感谢英特尔对不同处理器步进的所有困惑!:-))
有没有办法检测这些信息,也许是通过 WMI?
【问题讨论】:
-
不知道答案,但我首先要看的也是一些 OS WMI 调用。
-
与论坛网站不同,我们不使用“谢谢”、“感谢任何帮助”或Stack Overflow 上的签名。请参阅“Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?.
-
从看起来你需要调用汇编指令 CPUID 并将 EAX 设置为 1,这将在 EDX 和 ECX 中输出一些用于处理器功能的位标志。您关心 ECX 中的第 25 位设置为 1,这意味着它支持 AES-NI。唯一的问题是我无法找到通过托管代码或 WMI 从 CPUID 获取 ECX 值的方法。我得到的最接近的是 WMI 调用
Win32_Processor的ProcessorID属性,它是 CPUID 调用后 EAX 和 EDX 寄存器的位掩码,但它不包括您关心的 ECX。