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