硬件处理器计数器复位不正确(Hardware Processor Counters Incorrec

2019-09-19 06:16发布

我写了一个程序,它读取的英特尔芯片(第2页的APERF / MPERF计数器http://www.intel.com/content/dam/doc/manual/64-ia-32-architectures-software-developer-vol -3b部分-2-手册.pdf )。

这些计数器可读经由readmsr / writemsr指令/写的,并且我目前简单地经由设备驱动器以规则的间隔读取它们在Windows 7中的计数器是64位,以及与每个处理器时钟大约递增,所以你” ð希望他们能在很长的时间溢出,但是当我读了柜台,就好像它们正在被另一个程序重置其值跳动。

有没有办法追查什么程序将计数器复位? 难道别的东西会导致不正确的值将被读取? 相关组件和相应的C函数我使用如下附接。 从RDMSR 64位结果保存到EAX:EDX,所以要确保我不是在r_x寄存器错过任何数字,我运行命令多次来检查他们。

C:

long long test1, test2, test3, test4;
test1 = TST1();
test2 = TST2();
test3 = TST3();
test4 = TST4();
status = RtlStringCbPrintfA(buffer, sizeof(buffer), "Value: %llu %llu %llu %llu\n", test1, test2, test3, test4);

部件:

;;;;;;;;;;;;;;;;;;;
PUBLIC TST1 
TST1 proc
    mov ecx, 231 ; 0xE7
    rdmsr
    ret ; returns rax
TST1 endp

;;;;;;;;;;;;;;;;;;;
PUBLIC TST2 
TST2 proc
    mov ecx, 231 ; 0xE7
    rdmsr
    mov rax, rbx
    ret ; returns rax
TST2 endp

;;;;;;;;;;;;;;;;;;;
PUBLIC TST3 
TST3 proc
    mov ecx, 231 ; 0xE7
    rdmsr
    mov rax, rcx
    ret ; returns rax
TST3 endp

;;;;;;;;;;;;;;;;;;;
PUBLIC TST4 
TST4  proc
    mov ecx, 231 ; 0xE7
    rdmsr
    mov rax, rdx
    ret ; returns rax
TST4 endp

打印出的结果是一样的东西下面,但都没有改变的唯一寄存器是RAX寄存器,它不单调增加(可以跳来跳去):

Value: 312664 37 231 0
Value: 252576 37 231 0
Value: 1051857 37 231 0

Answer 1:

我无法弄清楚什么是我的重设专柜,但我能够确定的频率。 英特尔文档指出,当一个计数器溢出,其他计数器也将。 因此,即使计数器复位不断,APERF和MPERF的比率仍确实代表处理器的频率。



Answer 2:

看来,Windows 7和Windows 8的读取和复位AMD处理器的可写APERF / MPERF计数器。 所以,你想在寄存器0xc00000E7 / E8访问只读APERF / MPERF计数器。

但有一个新的问题。 在一些最新的AMD处理器(家庭0x16处理器)的,这些寄存器并不总是支持。 要确定是否这些寄存器都支持,你必须阅读CPUID Fn8000_0007_EDX的EffFreqRO位。 如前所述,这一切只适用于AMD处理器。



文章来源: Hardware Processor Counters Incorrectly Resetting
标签: c assembly x86 msr