只是想运行一下kvm_service_time.stp,提示这个错误:
semantic error: while resolving probe point: identifier 'kernel' at ./kvm_service_time.stp:25:7 source: probe kernel.trace("kvm_exit")
探针kernel.trace("kvm_exit")不存在,运行命令:stap -vl 'kernel.trace("*")'。发现确实没有kvm_exit。现在面临两个选择:寻找systemtap,kernel.trace的原理,看看如何获得kernel的trace信息。另一个选择:直接进入内核查看kvm_exit。我决定选择后者。
在kvm_service_time.stp中,我发现了头文件:vmx.h。里面定义了exit reason的类型。这个应该是关键,运行命令:find /usr -name 'vmx.h'。获得如下信息:
/usr/include/x86_64-linux-gnu/asm/vmx.h
在内核源码中运行命令:grep -nr 'include <asm/vmx.h>' ./。获得如下信息:
./tools/arch/x86/include/uapi/asm/kvm_perf.h:5:#include
./tools/perf/arch/x86/util/kvm-stat.c:3:#include
./arch/x86/include/uapi/asm/kvm_perf.h:5:#include
./arch/x86/include/asm/virtext.h:20:#include
./arch/x86/kvm/vmx.c:42:#include
./arch/x86/kvm/mmu.c:47:#include
./arch/x86/kvm/trace.h:5:#include
arch/x86/kvm/trace.h看起来像我要的东西。kvm trace的用法。
为什么对trace这么感兴趣,因为trace其实就是探针(具体请看“工作中什么能力最重要”)。这个也许就是理解原理的一条捷径!