阅读: 11
据云海说,Intel PT没有虚拟化,VMware Guest中没法用这个。参看:
————————————————————————–
Vmware workstation support intel processor tracing feature – [2016-05-31]
https://communities.vmware.com/t5/VMware-Workstation-Pro/Vmware-workstation-support-intel-processor-tracing-feature/td-p/2742688
Does VMware Workstation Pro 15 support Intel Processor Tracing (Intel PT) – [2018-10-20]
https://communities.vmware.com/t5/VMware-Workstation-Pro/Does-VMware-Workstation-Pro-15-support-Intel-Processor-Tracing/td-p/511703
————————————————————————–
检查vmware.log,包含:
————————————————————————–
Host VT-x Capabilities
Processor trace in VMX yes
Guest VT-x Capabilities
Processor trace in VMX no
————————————————————————–
即是说Host支持PT,Guest不支持。有人提过修改.vmx,增加:
pt.enable = “TRUE”
pt.available = “TRUE”
实测无效。
虽然Guest不支持PT,但后续仍用Guest演示相关命令,未做特别说明时,均默认在Guest中。
$ perf record -e intel_pt//ub date
event syntax error: ‘intel_pt//ub’
\___ Cannot find PMU `intel_pt’. Missing kernel support?
Run ‘perf list’ for a list of valid events
若内核不旧,这种报错一般是因为CPU不支持PT所致。”perf list”未见”intel_pt”。
$ ls -la /sys/bus/event_source/devices/intel_pt/
ls: cannot access ‘/sys/bus/event_source/devices/intel_pt/’: No such file or directory
$ ls -la /sys/devices/intel_pt/caps/*
ls: cannot access ‘/sys/devices/intel_pt/caps/*’: No such file or directory
同样表示当前系统不支持PT。但这些办法都是表象,绝对可靠的办法是用CPUID指令,
参看:
《Intel 64 and IA-32 Architectures Software Developer Manuals》
https://cdrdv2-public.intel.com/812392/325462-sdm-vol-1-2abcd-3abcd-4.pdf
————————————————————————–
Table 3-8. Information Returned by CPUID Instruction
817/5082 EAX=0x7
827/5082 EAX=0x14
33.2.8.2 IA32_RTIT_CTL MSR (0x570)
4187/5082
33.3.1 Detection of Intel Processor Trace and Capability Enumeration
Table 33-11. CPUID Leaf 14H Enumeration of Intel Processor Trace Capabilities
4196/5082
Processor support for Intel Processor Trace is indicated by
CPUID.(EAX=07H,ECX=0H):EBX[bit 25] = 1. CPUID function 14H is dedicated to
enumerate the resource and capability of processors that report
CPUID.(EAX=07H,ECX=0H):EBX[bit 25] = 1.
————————————————————————–
如下代码用内联汇编执行cpuid指令并检查返回值,以此判断当前CPU是否支持PT:
————————————————————————–
/*
* gcc -Wall -pipe -O3 -s -o check_pt check_pt.c
*/
#include <stdio.h>
#define BIT(x) (1ULL << (x))
int main ( int argc, char * argv[] )
{
int a = 0x7,
b,
c = 0,
d;
asm
(
“cpuid”
: “=a” (a), “=b” (b), “=c” (c), “=d” (d)
: “0” (a), “2” (c)
);
printf( “ebx=%#x\n”, b );
if ( !( b & BIT(25) ) )
{
printf( “Intel PT not supported\n” );
}
else
{
printf( “Intel PT supported\n” );
}
return 0;
} /* end of main */
————————————————————————–
$ ./check_pt
ebx=0x9c27ab
Intel PT not supported
Ubuntu、Debian有cpuid命令,可在bash中直接检查cpuid结果:
$ apt install cpuid
$ cpuid -1 -r -l 7
CPU:
0x00000007 0x00: eax=0x00000000 ebx=0x009c27ab ecx=0x00000000 edx=0xbc000400
-1表示只检查第1个核,-r表示显示寄存器值,”-l 7″相当于指定eax=7
检查ebx的bit25(从0开始计数)是否为1,为1表示支持Intel PT。具体到本例,检查ebx最高字节bit1,为0表示不支持Intel PT。
cpuid命令已对返回的寄存器值做了解码,无需手工检查bit:
$ cpuid -1 | grep “Intel processor trace”
Intel processor trace = false
可不用cpuid命令,有其他原生方案:
$ grep intel_pt /proc/cpuinfo > /dev/null;echo $?
1
$ lscpu | grep intel_pt > /dev/null;echo $?
1
为0表示grep命中,支持PT;为1表示grep无命中,不支持PT。
假设CPU支持PT,可通过IA32_RTIT_CTL MSR (0x570) bit0启用、禁用PT,有必要检查之:
$ rdmsr -x0 -a 0x570
$ rdmsr -x0 -p 0 0x570
0000000000000000
-a表示所有CPU,”-p n”指定第n个CPU(从0计),bit0为0,表示禁用PT。
总之,有许多大同小异的办法检查当前CPU是否支持PT、是否启用PT。即使CPU支持,也可能出现内核太旧而不支持PT,这是另一回事了,优先检查CPU是否支持。前述手段也适用于WSL1,可藉此检查Host CPU。
版权声明
本站“技术博客”所有内容的版权持有者为绿盟科技集团股份有限公司(“绿盟科技”)。作为分享技术资讯的平台,绿盟科技期待与广大用户互动交流,并欢迎在标明出处(绿盟科技-技术博客)及网址的情形下,全文转发。
上述情形之外的任何使用形式,均需提前向绿盟科技(010-68438880-5462)申请版权授权。如擅自使用,绿盟科技保留追责权利。同时,如因擅自使用博客内容引发法律纠纷,由使用者自行承担全部法律责任,与绿盟科技无关。