【问题标题】:Address space identifiers using qemu for i386 linux kernel使用 qemu for i386 linux 内核的地址空间标识符
【发布时间】:2012-02-14 04:27:33
【问题描述】:

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

我正在开发一个模块,从“PinTool”和“qemu-linux-user”等模拟器获取正在运行的程序的实际跟踪,并将此跟踪提供给模拟器。

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

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

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

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

我被困在第 2 步。我如何区分 qemu 的不同进程,qemu 只是一个模拟器,对来宾操作系统一无所知??

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

对不起,如果问题很长。我知道我可以抽象出某些部分,但我觉得其中的某些部分解释了问题的背景。

【问题讨论】:

    标签: linux cpu-architecture qemu


    【解决方案1】:

    在第一种情况下,使用 qemu-linux-user 执行单个程序的用户态仿真,由于内存是线性的,并且仿真器中不涉及虚​​拟内存,因此任务非常简单。整个系统仿真的第二种情况要复杂得多,因为您基本上必须从内核结构中解析地址。

    如果您可以直接从 QEmu 中获取虚拟地址,那么您的工作会轻松一些;那么您只需要识别流程和其他所有功能,就像在单流程案例中一样。您可以通过伪造对 get_pid() 的系统调用来获取 PID。

    否则,这一切似乎有点类似于从物理内存转储中调试系统。此任务有some tools。不过,它们可能对于每条指令都运行得太慢,但您可以在那里寻找提示。

    【讨论】:

    • 是的,我使用 qemu-linux-user 进行用户模式仿真,使用 qemu-system-i386 进行完整的系统仿真。对于完整的系统仿真,问题正是您所指出的。知道 qemu 正在解析其指令的进程的 pid。我在 qemu 的反汇编指令阶段获得了虚拟地址。
    • 有人可以在 linux 调度程序中指出我可以在某个输出端口上输出当前进程的 pid 的位置吗?
    猜你喜欢
    • 1970-01-01
    • 2011-09-08
    • 2014-11-13
    • 2013-08-21
    • 2011-06-30
    • 2019-07-03
    • 2014-04-27
    • 1970-01-01
    • 2019-02-19
    相关资源
    最近更新 更多