Pourquoi les anciennes versions de Windows ne fonctionnent pas sur les CPU modernes : parce qu’ils sont trop rapides
(os2museum.com)Michal Necasek raconte avoir entendu par une connaissance qu’[il était impossible de faire tourner Windows 3.11 dans une machine virtuelle sur un système équipé d’un CPU AMD Ryzen 7 3800X (sorti en 2019)], puis avoir enquêté pour en trouver la cause. (en anglais)
L’enquête a révélé que le problème venait de la logique de calibration du délai de boucle présente dans le module NDIS (Network Driver Interface Specification). Cette logique fonctionnait de la manière suivante.
-
Au démarrage, relever l’heure courante en millisecondes.
-
Exécuter l’instruction
LOOP2^20 (=1,048,576) fois. -
Relever à nouveau l’heure courante en millisecondes, puis soustraire l’heure de départ afin d’obtenir le temps écoulé.
-
Calculer [2^20 / temps écoulé] afin d’obtenir le nombre de boucles par milliseconde.
Le problème était que si les 2^20 boucles se terminaient en moins d’une milliseconde, le temps écoulé était calculé à 0 milliseconde, ce qui provoquait une erreur de [division par zéro]. C’est ce qui faisait échouer le démarrage. À l’époque du développement et de la commercialisation de Windows 3.11, en 1993, le CPU le plus rapide de la plateforme PC était l’Intel Pentium à 66 MHz ; d’après les calculs, même dans le meilleur des cas, ce processeur aurait eu besoin de plus de 94 millisecondes pour exécuter autant de boucles. Cela s’expliquait aussi par le fait que les processeurs de l’époque ne pouvaient pas exécuter l’instruction LOOP en un seul cycle. Les CPU modernes, en revanche, sont tout simplement bien trop rapides pour faire tourner ce genre d’ancien système d’exploitation, que l’on considère la fréquence d’horloge, le nombre de cycles par instruction ou d’autres aspects encore.
L’article original contient aussi d’autres points intéressants. Il explique notamment que, dans Windows 95, cette logique a été légèrement modifiée et utilisée à davantage d’endroits ; que sur les processeurs Intel, son exécution prenait encore 6 millisecondes sur un Pentium III à 1 GHz, alors que sur les processeurs AMD, le problème apparaissait déjà sur un K6-2 à 350 MHz, ce qui montre que l’apparition du bug variait selon les différences de fonctionnement interne des CPU. À noter que ce problème n’a été complètement corrigé qu’avec Windows 98 SE, sorti en 1999.
Aucun commentaire pour le moment.