朋友们,我正在开发一个内部架构模拟器,用于模拟在核心,内存层次结构和互连等不同架构参数上运行的代码的时序效应。
我正在研究模块从“PinTool”和“qemu-linux-user”这样的模拟器中获取正在运行的程序的实际跟踪,并将此跟踪提供给模拟器。
直到现在我的方法是这样的: 1)获取二进制可执行文件的objdump并解析此信息。 2)现在模拟器必须只给我一个指令指针和其他信息,如load-address / store-address。
此类方法仅在节目内容已知时才有效。
但是现在我一直在尝试在标准linux内核上运行可执行文件的痕迹。现在的问题是基本内核映像不包含LKM(可加载内核模块)的代码。启动内核时也不知道守护进程。
所以,我对这个解决方案的方法是: 1)使用qemu来模拟机器。 2)当第一次遇到指令时,我将解析它并保存此信息。为以后。 3)创建一个辅助函数,在执行指令时发送ip,加载/存储地址。
我陷入了第二步。我如何区分qemu的不同进程,qemu只是一个模拟器而且对客户操作系统一无所知?
我可以修改来宾操作系统的调度程序,但我真的无法弄清楚前进的方向。
对不起,如果这个问题非常冗长。我知道我可以抽象出一些部分,但觉得它的某些部分可以解释问题的背景。
答案 0 :(得分:2)
在第一种情况下,使用qemu-linux-user执行单个程序的用户模式仿真,任务非常简单,因为内存是线性的,并且仿真器中不涉及虚拟内存。整个系统仿真的第二种情况要复杂得多,因为你基本上必须解析内核结构中的地址。
如果您可以直接从QEmu获取虚拟地址,那么您的工作会更容易一些;那么你只需要识别过程和其他所有功能就像在单进程情况下一样。您可以通过伪造系统调用get_pid()
来获取PID。
否则,这一切似乎与从物理内存转储调试系统有点类似。此任务有some tools。但是,它们可能对于每条指令来说都太慢了,但是你可以在那里寻找提示。