Jusqu’ici la couche d’émulation Intel embarquée au cœur de Windows On ARM était limitée au 32 bits. Le support du 64 bits fait son apparition dans une nouvelle build Windows Insiders. Mais comment fonctionne une telle émulation sur Windows et sur Mac…

L’arrivée des Mac sous processeurs Apple M1 à architecture ARM a bouleversé le marché. D’abord parce que ces processeurs se sont révélés bien plus véloces qu’attendu avec des performances qui sont un vrai camouflet pour les processeurs Qualcomm qui équipent les Surface Pro X par exemple mais aussi pour les processeurs mobiles d’Intel et AMD. Ensuite parce que Rosetta 2, la couche d’émulation Intel embarquée dans la version ARM de macOS Big Sur, s’est avérée bien plus capable et performante que la couche d’émulation Intel de Windows on ARM limitée aux instructions x86 32 bits et donc aux anciennes générations de logiciels Windows.

Rosetta 2 vs WoA x86 émulation

Il est vrai que les deux systèmes d’exploitation n’abordent pas la problématique de la même façon. Ainsi Rosetta 2 n’est pas à proprement parler une couche d’émulation mais plutôt une couche de traduction. Rosetta 2 utilise en effet un compilateur « Ahead of Time » (AOT). Lors de l’installation de l’application x86 sur les machines Apple à processeur M1, ce compilateur traduit et recompile le code binaire en ARM.
Parce que les applications sont un peu plus complexes qu’un simple exécutable, Rosetta 2 combine en réalité une pré-compilation « AOT » et une traduction à la volée « Just In Time » (JIT) pour adresser tous les scénarios et étendre sa compatibilité à un maximum de logiciels Mac Intel.

L’approche de Microsoft est un peu différente. Elle s’appuie sur une traduction JIT associée à un cache intelligent. Selon la documentation Microsoft, « la couche WOW64 de Windows 10 permet au code x86 de s’exécuter sur la version ARM64 de Windows 10. L’émulation x86 fonctionne en compilant des blocs d’instructions x86 en instructions ARM64 avec des optimisations pour améliorer les performances. Un service met en cache ces blocs de code traduits pour réduire la charge de la traduction d’instructions et permettre une exécution optimisée lors de l’exécution du code. Les caches sont générés pour chaque module afin que d’autres applications puissent les utiliser lors du premier lancement. Cela permet aux utilisateurs de machines Windows à processeurs ARM d’exécuter une application Win32 x86 existante sans aucune modification. L’application ne sait même pas qu’elle s’exécute sur un PC Windows sur ARM, sauf si elle appelle des API spécifiques (IsWoW64Process2). ».
Pour ce qui est des applications UWP (diffusées via le Windows Store), les choses sont subtilement différentes : si le développeur a soumis une version ARM de son app, c’est celle-ci qui est déployée sur Windows on ARM pour une exécution native sinon c’est la version x86 qui est déployée avec émulation par WOW64.

L’émulation x64 débarque enfin dans Windows on ARM

Contrairement à ce que le nom WOW64 suggère, cette émulation était jusqu’ici limitée aux seules applications 32 bits de l’univers Windows. Or cela fait plusieurs années que l’univers Windows a basculé en 64 bits et que bien des logiciels récents n’existent plus qu’en 64 bits.

Mais les choses sont en train de changer. Microsoft a en effet dévoilé cette semaine une nouvelle version de Windows 10 on ARM embarquant une nouvelle version de l’émulation WOW64 supportant à la fois le jeu d’instructions x86 et le jeu d’instructions x64. Le nouveau JIT embarqué semble être le fruit de plus de deux ans de travail chez Microsoft. Pour l’instant, cette version de Windows n’est qu’en pré-bêta et uniquement accessible aux « Windows Insiders » disposant d’une machine Windows à base de processeurs ARM (Surface Pro X, Samsung Galaxy Book S, Lenovo Yoga 5G).

Avec toute l’attention recueillie par les processeurs ARM depuis le lancement des Mac à processeurs Apple M1, l’avenir de Windows on ARM semble aujourd’hui plus assuré qu’il y a quelques semaines encore. Le support des logiciels x64 enlève l’une des principales limitations à l’adoption d’une Surface Pro X. Et l’avènement d’une nouvelle génération de processeurs Qualcomm (8cx Gen 2 5G) pourrait engendrer l’apparition d’une nouvelle génération de PC en ARM. De façon ironique, plus il y aura de PC sur ARM, plus les développeurs feront l’effort de recompiler leurs logiciels Windows en ARM et moins la couche d’émulation WOW64 sera utile. Déjà, l’arrivée des Mac M1 a contribué indirectement à encourager certains développeurs Windows à recompiler leurs logiciels en ARM à l’instar d’Adobe qui a sorti simultanément ces derniers jours des versions ARM pour Mac et pour Windows de Photoshop et Lightroom. Ainsi va l’informatique…

Des performances comparables ?

Il est pour l’instant assez difficile de comparer les performances de Rosetta 2 et celle de WOW 64. Parce qu’il n’existe pas de versions officielles de Windows on ARM pour les processeurs M1 et que les processeurs M1 d’Apple sont significativement plus performants que les processeurs Qualcomm actuellement utilisés sur les PC ARM (comme la Surface Pro X), aucune comparaison directe révélatrice n’est possible.
Certes, des geeks ont bien réussi à faire tourner Windows on ARM sur des Mac M1 mais en utilisant une couche QEMU intermédiaire qui ralentit l’exécution. Les quelques tests réalisés ont surtout démontré la supériorité du processeur M1 d’Apple sur le processeur Qualcomm/Microsoft SQ2. WOW64 fonctionne sur cette « bidouille » mais est freiné par la couche QEMU.
Malgré les différences d’implémentation, il est probable – surtout avec les optimisations apportées par cette nouvelle version Beta de Windows 10 – que les performances des couches d’émulation Intel d’Apple et Microsoft soient en réalité assez similaires. Il faudrait disposer d’une version Windows on ARM officielle pour les Mac M1 (avec les drivers optimisés pour) pour en avoir la preuve. Ce qui n’arrivera peut-être jamais…