Ah, l'art de la virtualisation accélérée… C'est un problème assez complexe, et les implémentations efficaces dépendent fortement de la plateforme. Les implémentations génériques (purement logicielles) sont:
- l'interprétation instruction par instruction, comme si on émulait une machine différente, mais la plupart des instructions s'émulent par l'instruction elle-même. Il y a quand-même l'overhead d'aller chercher l'instruction, faire un saut vers la routine qui l'implémente, traduire les modes d'adressage etc., donc c'est très lent.
- l'instrumentation par recompilation dynamique: la même chose, mais en JIT plutôt qu'en interpréteur pur. Cf. par exemple Valgrind. C'est très compliqué et ça reste lent.
Sur certains processeurs, il y a des jeux d'instructions pour la "virtualisation matérielle" qui permettent de faire ça en matériel de manière efficace, c'est le cas notamment des x86 récents. Maintenant, malheureusement, je ne sais pas ce qu'il en est exactement pour ARM, mais j'imagine que ça doit aussi dépendre de quel ARM tu as, sachant qu'il y a beaucoup d'extensions optionnelles au jeu d'instruction de base.