原因是CPU对BTS记录的大小做了调整。
typedef struct tagBtsRecord{ DWORD dwFrom; DWORD dwTo; DWORD dwFlags;} BtsRecord, *PBtsRecord;
Pentium M和P4时,这个结构在32位模式时每个字段都是32位的,64位时各个字段都是64位的。
但是后来的CPU统一使用64位了,不管是否工作在32位模式还是64位模式。
也就是说,需要把上面的结构扩展成64位。可以通过cpuid指令来检查CPU的这种特征:
以EAX=1执行CPUID指令,然后判断ECX寄存器的bit 2,即DTES64位:
64-bit DS Area. A value of 1 indicates the processor supports DSarea using 64-bit layout
目前的手册说的不是很清楚,建议你看一下LINUX内核的源代码
非常谢谢老师的回答,我已经搞定啦,呵呵!
参考以下地址的Linux源代码:http://lwn.net/Articles/259339/
64 bit DS Area,应该就是指DebugStore和BtsRecord都是64位的。