我能否在Windows中的用户模式程序中读取CPU性能计数器?

11

我想要在所有最新的x86硬件上编程和读取硬件性能计数器

在Linux上,有各种perf_events系统来完成这个任务(以及从未修改的程序外部执行它的perf实用程序)。

Windows中是否有类似的内置功能?如果没有内置功能,则第二好的方法可能是使用第三方代码,但不需要我签名驱动程序。


1
https://msdn.microsoft.com/en-us/library/windows/desktop/aa373214(v=vs.85).aspx - Michael Petch
1
@BeeOnRope 我看问题太快了,否则我会发布这个链接的:https://msdn.microsoft.com/zh-cn/library/windows/desktop/dd796399(v=vs.85).aspx - Michael Petch
你能使用WinRing0.sys吗? - harold
最新已知的WinRing0源代码可在此处获取:https://github.com/QCute/WinRing0 请注意,使用此驱动程序与您的“来自用户模式”的目标相矛盾,因为这是一个内核驱动程序。我认为除了使用内核驱动程序外,没有其他方法。 - Simon Mourier
@Simon - 一旦加载驱动程序,它就启用了用户模式rdpmc指令。因此,您需要内核驱动程序翻转CR4.PCE位,以允许rdpmc和计数器编程,但然后您可以在用户模式下进行读取。我仍然非常感兴趣任何不使用内核驱动程序的方法,但这比没有好(大多数情况下是可接受的,因为其他人已经通过签名障碍)。 - BeeOnRope
显示剩余12条评论
1个回答

11

简短回答

不,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。


它是否可以在虚拟机封装的操作系统中(如VmWare等)无缝运行? - user3666197
1
虚拟机通常不支持所有计数器,因此您可能会看到一组与报告的处理器系列不一致的支持计数器。 - harold
2
太好了。我不知道那个LICENSE文件,已经用WinRing0.sys(更确切地说是它的64位版本WinRing0x64.sys)使一切正常了,所以对我来说很简单。我的担心更多的是关于该驱动程序的法律和源代码可用性的不确定情况,但如果它是干净的,那就没问题了。不过我想知道我们是否会看到一个新的签名版本...@WouterHuysentruit - BeeOnRope
1
@BeeOnRope 最近几天,我成功地创建了一个应用程序+驱动程序,在Windows 7上读取Kabylake / Skylake的所有性能计数器,同时对从ml64输出的masm应用程序进行基准测试;它看起来像是Linux perf stat。我很快会将其发布为答案。 - Lewis Kelsey
看起来像是一个 dec jnz 循环,它是宏融合的并且在 uop 缓存中。但请记住,后三个计数器属于不同的运行,这很烦人。 - Lewis Kelsey
显示剩余3条评论

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