【发布时间】:2015-06-18 17:32:09
【问题描述】:
我要问的是有点 hacky(因为这是解决问题的一种非常糟糕的方法)-我理解这一点,并且不打算将其用作长期解决方案,仅用于证明-概念。
也就是说,我正在开展一个项目,该项目使用 QEMU 作为将进程(最终是线程)从一台机器迁移到另一台机器的基础。我在本机机器上启动进程,使用 ptrace 暂停它,然后复制 CPU 的寄存器和堆栈并将这些值推送到新创建的 QEMU 实例(具有相同的底层架构,即 x86-64 --> x86_64,ARM64 --> ARM64)。然后我(最终)在 QEMU 中恢复执行。
我已经到了需要将寄存器 + 堆栈传递到 QEMU 的阶段,但是我遇到了一些障碍;理想情况下,我会拆分 QEMU 并将整个程序编译为我自己程序的一部分,但这就是概念验证发挥作用的地方。 QEMU 是一个庞大的程序,分解/重建 Makefile 是我现在不太热衷于处理的事情。所以...
我是否可以在我的程序中用寄存器 + 堆栈填充一个结构,创建一个指向该结构的指针,将该指针转换为 char*,然后将该 char* 指针传递给 execlp,以便重新转换(修改版)QEMU?目标是从 QEMU 中访问这些值。例如:
struct regs_and_stack my_struct = {...};
struct regs_and_stack *my_struct_ptr = &my_struct;
execlp("qemu", "qemu", "test", "100000", (char*)my_struct_ptr);
如果需要,我可以发布我的其余代码以更好地了解全局。一如既往,感谢您的帮助!!!
编辑
我已经确定了 qemu 主函数 (linux-users/main.c) 中的点,在该点我可以从 argv 中弹出最终指针,然后再到达它通过选项解析的点;稍后我将在程序执行中使用这些信息。问题是首先如何将这个结构体放入主函数中。
【问题讨论】:
-
这个问题似乎太宽泛了。只是一个小提示:请注意,您必须迁移进程的整个状态。这将包括堆和分配块的确切布局(想想动态结构中的指针。
-
我不明白您要做什么,但我怀疑它不会这样做。
execlp以空字符结尾的字符串作为参数。qemu期望特定的字符串作为参数。所以我不明白通过传递一些二进制数据会得到什么。 -
@Olaf - 我忘记了堆,但它是可行的;更广泛的项目涉及完整的操作系统,因此我必须实现它并根据需要转换堆栈/堆。问题实际上是关于将指针传递给结构 - 抱歉添加了太多无关信息!
-
@EugeneSh。 - 我已经确定了 qemu 中需要修改的主要功能;我计划在将它传递给程序的其余部分之前从 argv 列表中弹出这个指针。在我继续前进之前,我只需要将这个结构体放入 qemu 中,这似乎是一种可能的快速而肮脏的方法。
-
不,这行不通。因为 1) 它不是同一个指针。 2)数据可能根本没有终止,或者在中间终止。如果你真的想通过命令行将一些数据传递给 qemu - 以文本方式进行。