2015-08-09 2 views
0

Est-ce que quelqu'un sait qu'il est possible de migrer un processus d'un système basé sur un bras vers x86? Les deux fonctionnent sous Linux mais le problème est dans ARM l'état du processus est différent de celui du x86.Migration entre arm et x86

Répondre

1

Pas vraiment. Les exécutables x86 ne fonctionneront pas sur ARM, ou vice versa, sans une sorte de traduction ou d'émulation binaire.

La conversion binaire ne fonctionnera pas pour la migration de processus car tous les états de processus ne correspondront pas entre les deux architectures. Par exemple, le processus de traduction peut combiner certaines instructions dans le processus de traduction, de sorte qu'un processus qui est au milieu d'une paire d'instructions qui a été combinée n'aura aucun état équivalent dans l'exécutable traduit.

Emulation pourrait théoriquement travail, mais tu serais encore prendre le coup de la performance de l'émulation bien sûr, et vous auriez aussi besoin de développer une sorte d'émulateur qui vous permettra de commencer à partir d'un état arbitraire (pour les migrations) . Je ne suis pas au courant de tout ce qui conviendrait ici.

+0

Je devinais cela aussi. En ce qui concerne le démarrage du processus, je pense que libhoudini peut démarrer et exécuter un binaire ARM sur x86. Mais je pensais à la migration. Les performances de l'émulateur (qemu) ne correspondent pas à mes besoins. Donc pensait s'il y a un moyen de transformer directement l'état du processus. Mais le problème est la différence dans l'ensemble de registres. – Abdullah

1

ARM ne peut pas exécuter les instructions x86 et x86 ne peut pas exécuter les instructions ARM. Le problème n'est pas seulement un ensemble de registres différent: c'est un ABI complètement différent. Le mappage des registres ARM sur x86 n'est même pas proche de la résolution du problème. Vous avez besoin d'une couche d'émulation complète pour exécuter les binaires ARM sur x86. Les mêmes appels système auront des numéros différents dans au moins certains cas, donc même émuler un processeur ARM ne suffit pas. Vous devez émuler l'ABM ARM si le processus va effectuer des appels système à un noyau x86-64. Votre seule véritable option est de migrer entre le matériel ARM et une VM/émulateur ARM sur le matériel x86, ou vice-versa. Soit ARM Linux s'exécutant dans une machine virtuelle émulée complète, soit une émulation en mode utilisateur qui traduit les appels système. Ce dernier pourrait probablement être plus accéléré par un compilateur JIT qui a généré du code machine x86 au lieu d'interpréter insn par insn. (JIT fonctionnerait pour les deux, mais avoir à traduire un noyau ARM-linux complet dans une VM complète serait plus utile pour la couche JIT.)

Comme le dit le tweakwuff, la migration devrait être faite en termes de native. état de la machine du processus, p.ex. par une bibliothèque de point de contrôle utilisée par votre programme ARM. Cela vous évitera de rencontrer des problèmes avec la représentation binaire-traduite de votre état ARM étant incohérent.