我想要在所有最新的x86硬件上编程和读取硬件性能计数器。
在Linux上,有各种perf_events
系统来完成这个任务(以及从未修改的程序外部执行它的perf
实用程序)。
Windows中是否有类似的内置功能?如果没有内置功能,则第二好的方法可能是使用第三方代码,但不需要我签名驱动程序。
我想要在所有最新的x86硬件上编程和读取硬件性能计数器。
在Linux上,有各种perf_events
系统来完成这个任务(以及从未修改的程序外部执行它的perf
实用程序)。
Windows中是否有类似的内置功能?如果没有内置功能,则第二好的方法可能是使用第三方代码,但不需要我签名驱动程序。
简短回答
不,Windows中没有内置的设备。同样,Linux的perf
命令也无法在Windows 10的Linux子系统上运行。
详细回答
要访问这些计数器,您需要结合以下指令:
不幸的是,这些指令只能从内核模式调用,因此您将需要与驱动程序进行交互。虽然编写驱动程序代码本身很容易,但是签署驱动程序并不那么容易(特别是您提到您想以个人身份执行此操作)。
这就是为什么我建议您查看现有项目,例如Open Hardware Monitor和Intel的pcm项目。
Open Hardware Monitor
这个开源项目使用C#编写,包括由OpenLibSys.org开发的WinRing0.sys(32位)/ WinRing0x64.sys(64位)驱动程序的二进制文件和C源代码。如果您想在自己的项目中使用此驱动程序,只需要包含他们的版权声明即可。
PCM
这个开源项目使用C++编写,还包含类似驱动程序的源代码(请参见WinMSRDriver目录),但您必须自己构建它,因此您将再次遇到签署问题。
无论如何,我提到此项目是因为它可能包含许多对您感兴趣的代码。
用户模式访问
现在,一旦你加载了那个驱动程序(Open Hardware Monitor会在应用程序启动时自动提取并加载驱动程序,这很不错),你就可以通过使用Windows API函数CreateFile
/ DeviceIoControl
和当然还有CloseHandle
从你的用户模式应用程序调用那些驱动程序IOCTL。
LICENSE
文件,已经用WinRing0.sys
(更确切地说是它的64位版本WinRing0x64.sys
)使一切正常了,所以对我来说很简单。我的担心更多的是关于该驱动程序的法律和源代码可用性的不确定情况,但如果它是干净的,那就没问题了。不过我想知道我们是否会看到一个新的签名版本...@WouterHuysentruit - BeeOnRope
rdpmc
和计数器编程,但然后您可以在用户模式下进行读取。我仍然非常感兴趣任何不使用内核驱动程序的方法,但这比没有好(大多数情况下是可接受的,因为其他人已经通过签名障碍)。 - BeeOnRope