我要问的有点笨拙(因为这是一种非常糟糕的解决问题的方法) - 我理解这一点,并且不打算将其用作长期解决方案,仅用于概念验证。
也就是说,我正在从事一个使用 QEMU 作为基础的项目,将进程(最终是线程)从一台机器迁移到另一台机器。 我在本机上启动该过程,使用 ptrace 暂停它,然后复制 CPU 的寄存器和堆栈并将这些值推送到新创建的 QEMU 实例中(具有相同的底层架构,即 x86-64 --> x86_64、ARM64 --> ARM64)。 然后我(最终)在QEMU恢复执行。
我已经到了需要将寄存器+堆栈传递到QEMU的阶段,但是我已经遇到了一点障碍;理想情况下,我会分解QEMU并将整个程序编译为我自己程序的一部分,但这就是概念验证发挥作用的地方。 QEMU是一个庞大的程序,分解/重建Makefiles是我现在不太热衷于接近的事情。 所以。。。
我是否可以在我的程序中用寄存器 + stack 填充结构,创建一个指向该结构的指针,将该指针转换为 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 main 函数 (linux-users/main.c) 中的点,我可以在它到达解析选项的点之前从 argv 弹出最后一个指针;稍后我将在程序执行中使用此信息。 问题只是如何首先将此结构放入主函数中。
如果我理解得很好,你想序列化你的结构,然后在另一端反序列化它们。以下代码片段形式回答了这个问题 结构的序列化要解决问题,你必须编辑你自己的序列化和反序列化函数,因为它们取决于你的 strut 的结构体。只需跳过 q 变量,即可为您的结构变量打开一个适合文本序列的位置。
#include <iostream> #include <cstring> #define BUFSIZE 512 #define PACKETSIZE sizeof(MSG) using namespace std; typedef struct MSG { int type; int priority; int sender; char message[BUFSIZE]; }MSG; void serialize(MSG* msgPacket, char *data); void deserialize(char *data, MSG* msgPacket); void printMsg(MSG* msgPacket); int main() { MSG* newMsg = new MSG; newMsg->type = 1; newMsg->priority = 9; newMsg->sender = 2; strcpy(newMsg->message, "hello from server "); printMsg(newMsg); char data[PACKETSIZE]; serialize(newMsg, data); MSG* temp = new MSG; deserialize(data, temp); printMsg(temp); return 0; } void serialize(MSG* msgPacket, char *data) { int *q = (int*)data; *q = msgPacket->type; q++; *q = msgPacket->priority; q++; *q = msgPacket->sender; q++; char *p = (char*)q; int i = 0; while (i < BUFSIZE) { *p = msgPacket->message[i]; p++; i++; } } void deserialize(char *data, MSG* msgPacket) { int *q = (int*)data; msgPacket->type = *q; q++; msgPacket->priority = *q; q++; msgPacket->sender = *q; q++; char *p = (char*)q; int i = 0; while (i < BUFSIZE) { msgPacket->message[i] = *p; p++; i++; } } void printMsg(MSG* msgPacket) { cout << msgPacket->type << endl; cout << msgPacket->priority << endl; cout << msgPacket->sender << endl; cout << msgPacket->message << endl; }此链接也很有用:stackoverflow.com/questions/1653681/serialization-deserialization-of-a-struct-to-a-char-in-c