我正在研究虚拟机的多处理器记录重放功能。我有一个由虚拟 CPU 在虚拟机中完成的非确定性内存访问的日志。
其中很大一部分指向内核空间内存,即高于 0Xc0000000。
例如,这里列出了在虚拟机中运行 SPLASH 基准测试后 10 个最常访问的内核内存地址
0xfffb5000
0xc1779db0
0xc18b6910
0xc1771a44
0xc1771a40
0xc1779e00
0xc18b67e0
0xc18b693c
0xc18b67f0
0xfffa1000
我想知道是否有某种方法可以找到这些内存地址中的确切内容...是内核堆栈,vsyscall页面,调度程序的就绪列表...
这样我就可以想出一些方法来解决这个开销加快记录重放...
欢迎提示在内核代码中查看的位置
谢谢
答案1
在物理机上,我会查看 /boot/System.map* (无论该文件在您的发行版中被称为什么)。
我的猜测是 KVM 虚拟机内也是如此。
答案2
KVM-QEMU 支持调试 - 您可以连接到虚拟机并gdb
查看其中发生的情况(当然,您需要正确设置调试符号)。
答案3
好吧,一些地址指向内核中的静态数据,例如 seqlocks 使用的增量器。
内核objdump
显示了大约一半的地址,但对于存储在堆栈和堆上的地址,objdump 没有用。
cat /proc/kallsysm
显示包含它的模块导出的所有变量/函数。
我认为我们不知道这些位置存储了什么......