gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:47 28 4
gpt4 key购买 nike

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

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

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

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

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

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

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

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

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

最佳答案

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

如果你能直接从 QEmu 中获取虚拟地址,你的工作就容易多了;那么你只需要识别进程,其他所有功能就像在单进程情况下一样。您可以通过伪造对 get_pid() 的系统调用来获取 PID。

否则,这一切看起来有点类似于从物理内存转储中调试系统。有some tools为了这个任务。不过,它们可能太慢而无法针对每条指令运行,但您可以在那里寻找提示。

关于linux - 为 i386 linux 内核使用 qemu 的地址空间标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8927303/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com