是否有人知道是否可以将进程从基于 arm 的系统迁移到基于 x86 的系统。两者都在运行 linux,但问题在于 ARM 中的进程状态与 x86 不同。
2 回答
并不真地。x86 可执行文件不能在 ARM 上运行,反之亦然,没有某种二进制转换或仿真。
二进制转换不适用于进程迁移,因为并非所有进程状态都会在两种架构之间匹配。例如,翻译过程可能会在翻译过程中组合一些指令,因此处于组合的指令对中间的进程在翻译后的可执行文件中不会有任何等效状态。
仿真理论上可以工作,但是您当然仍然会受到仿真的性能影响,并且您还需要开发某种仿真器,让您从任意状态开始(用于迁移)。我不知道有什么适合这里的。
ARM 不能运行 x86 指令,x86 也不能运行 ARM 指令。问题不仅仅是不同的寄存器集:它是一个完全不同的 ABI。将 ARM 寄存器映射到 x86 甚至无法解决问题。您需要一个完整的仿真层才能在 x86 上运行 ARM 二进制文件。至少在某些情况下,相同的系统调用会有不同的编号,因此即使只是模拟 ARM CPU 也是不够的。如果进程要对 x86-64 内核进行系统调用,则必须模拟 ARM ABI。
您唯一真正的选择是在 ARM 硬件和 x86 硬件上的 ARM VM/模拟器之间迁移,反之亦然。在完全模拟的 VM 中运行的 ARM linux 或转换系统调用的纯用户模式模拟。后者可能会通过生成 x86 机器代码而不是逐个解释 insn 的 JIT 编译器来加快速度。(JIT 对两者都适用,但必须在完整的 VM 中翻译完整的 ARM-linux 内核对于 JIT 层来说需要更多的工作。)
正如duskwuff 所说,迁移必须根据进程的本机机器状态来完成,例如通过您的ARM 程序使用的检查点库。这将确保您不会遇到 ARM 状态的二进制转换表示不一致的问题。