Процесс миграции между arm и x86

Кто-нибудь знает, можно ли перенести процесс из системы на основе рук в систему на основе x86. Оба работают под управлением Linux, но проблема в ARM, состояние процесса отличается от состояния x86.


person Abdullah    schedule 09.08.2015    source источник


Ответы (2)


Не совсем. Исполняемые файлы x86 не будут работать на ARM или наоборот без какой-либо двоичной трансляции или эмуляции.

Двоичный перевод не будет работать для миграции процессов, поскольку не все состояния процессов будут совпадать между двумя архитектурами. Например, процесс перевода может объединять некоторые инструкции в процессе перевода, поэтому процесс, находящийся в середине объединенной пары инструкций, не будет иметь никакого эквивалентного состояния в переведенном исполняемом файле.

Эмуляция может теоретически работать, но вы, конечно, по-прежнему столкнетесь с падением производительности эмуляции, и вам также потребуется разработать какой-то эмулятор, который позволит вам начать с произвольного состояния (для миграции ). Я не знаю ни одного, который был бы подходящим здесь.

person Community    schedule 09.08.2015
comment
Я тоже об этом догадывался. Что касается запуска процесса, я думаю, что libhoudini может запустить и запустить двоичный файл ARM на x86. Но я думал о миграции. Производительность эмулятора (qemu) не соответствует моим потребностям. Поэтому я подумал, есть ли способ напрямую преобразовать состояние процесса. Но проблема в разнице в наборе регистров. - person Abdullah; 09.08.2015

ARM не может выполнять инструкции x86, а x86 не может выполнять инструкции ARM. Проблема не просто в другом наборе регистров: это совершенно другой ABI. Сопоставление регистров ARM с x86 даже близко не решает проблему. Вам нужен полный уровень эмуляции для запуска двоичных файлов ARM на x86. Одни и те же системные вызовы будут иметь разные номера по крайней мере в некоторых случаях, поэтому даже простой эмуляции процессора ARM недостаточно. Вы должны эмулировать ARM ABI, если процесс будет выполнять системные вызовы ядра x86-64.

Ваш единственный реальный вариант — мигрировать между оборудованием ARM и виртуальной машиной/эмулятором ARM на оборудовании x86 или наоборот. Либо ARM linux, работающий внутри полностью эмулируемой виртуальной машины, либо эмуляция только в пользовательском режиме, которая транслирует системные вызовы. Последнее, вероятно, можно было бы ускорить с помощью JIT-компилятора, который генерировал машинный код x86 вместо интерпретации insn insn. (JIT будет работать для обоих, но необходимость перевода полного ядра ARM-linux в полную виртуальную машину потребует больше усилий для уровня JIT.)

Как говорит сумраквафф, миграция должна выполняться с точки зрения собственного состояния машины процесса, например. библиотекой контрольных точек, используемой вашей программой ARM. Это гарантирует, что вы не столкнетесь с проблемами, связанными с несогласованностью двоично-переведенного представления вашего состояния ARM.

person Peter Cordes    schedule 10.08.2015