我写了一个程序,它读取的英特尔芯片(第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