使用qemu的i386 linux内核地址空间标识符

使用qemu的i386 linux内核地址空间标识符,linux,cpu-architecture,qemu,Linux,Cpu Architecture,Qemu,朋友们,我正在开发一个内部架构模拟器,用于模拟在不同架构参数(如核心、内存层次和互连)上运行的代码的计时效果 我正在开发一个模块,它从“PinTool”和“qemu linux用户”之类的仿真器中获取运行程序的实际跟踪,并将此跟踪提供给仿真器 到目前为止,我的做法是这样的: 1) 获取二进制可执行文件的objdump并解析此信息。 2) 现在仿真器只需给我一个指令指针和其他信息,比如加载地址/存储地址 这种方法只有在节目内容已知的情况下才有效 但现在我一直在尝试跟踪在标准linux内核上运行的可

朋友们,我正在开发一个内部架构模拟器,用于模拟在不同架构参数(如核心、内存层次和互连)上运行的代码的计时效果

我正在开发一个模块,它从“PinTool”和“qemu linux用户”之类的仿真器中获取运行程序的实际跟踪,并将此跟踪提供给仿真器

到目前为止,我的做法是这样的: 1) 获取二进制可执行文件的objdump并解析此信息。 2) 现在仿真器只需给我一个指令指针和其他信息,比如加载地址/存储地址

这种方法只有在节目内容已知的情况下才有效

但现在我一直在尝试跟踪在标准linux内核上运行的可执行文件。现在的问题是基本内核映像不包含LKM(可加载内核模块)的代码。此外,启动内核时也不知道守护进程

因此,我的解决方案是: 1) 使用qemu模拟机器。 2) 当第一次遇到指令时,我将解析它并保存此信息。以后再说。 3) 创建一个助手函数,在执行指令时发送ip、加载/存储地址

我陷入了第二步。我如何区分qemu中的不同进程?qemu只是一个模拟器,对来宾操作系统一无所知

我可以修改来宾操作系统的调度程序,但我真的无法找到前进的方向


如果问题很长,很抱歉。我知道我可以抽象出某个部分,但感觉其中的某个部分给出了问题背景的解释。

在第一种情况下,使用qemu linux用户对单个程序执行用户模式模拟,任务非常简单,因为内存是线性的,模拟器中没有虚拟内存。整个系统仿真的第二种情况要复杂得多,因为您基本上必须解析内核结构之外的地址

如果您可以直接从QEmu中获取虚拟地址,那么您的工作就容易一些;然后,您只需要识别流程和其他所有功能,就像在单个流程中一样。您可以通过假装系统调用
get\u PID()
来获取PID


否则,这一切似乎有点类似于从物理内存转储调试系统。这项任务有很多方法。不过,它们可能太慢,无法针对每一条指令运行,但您可以在那里寻找提示。

ya,我使用qemu-linux用户进行用户模式模拟,使用qemu-system-i386进行完整的系统模拟。对于完整的系统仿真,问题正是您指出的。了解qemu正在解析其指令的进程的pid。我在qemu的反汇编指令阶段得到了虚拟地址。有人能指出linux调度器中我可以在某个输出端口上输出当前进程pid的位置吗。