我正在尝试使用RDPMC
指令来计算已停用的指令,并且正如英特尔软件开发人员手册第 3 卷附录 A(在性能监控部分)提到的那样:
• Instructions Retired — 事件选择 C0H,Umask 00H 此事件计算退出时的指令数。对于由多个微操作组成的指令,此事件计算指令的最后一个微操作的退出。带有 REP 前缀的指令算作一条指令(不是每次迭代)。多操作指令的最后一个微操作退出之前的故障不计算在内。
我使用此处的答案来启用 Linux Kernel-Mode 模块的性能计数器。
从这里可以看到(描述RDPMC
):
将 ECX 寄存器中指定的 40 位性能监控计数器的内容加载到寄存器 EDX:EAX 中。EDX 寄存器加载计数器的高 8 位,EAX 寄存器加载低 32 位。Pentium® Pro 处理器有两个性能监控计数器(0 和 1),它们分别通过在 ECX 寄存器中放置 0000H 或 0001H 来指定。
之后,我将 0 放入RAX
并执行RDPMC
(在用户模式下),但RDPMC
多次执行后EDX:EAX
仍然为零。
所以我的问题是:
- 如何在用户模式下计算特定进程的退休指令?
Event select C0H
和和有什么区别?Umask 00H
我想知道如何使用C0H
和00H
?