Dies ist ein Artikel, in dem jemand namens Michal Necasek der Ursache für ein Problem nachgeht, von dem er von einem Bekannten hörte: [Auf einem System mit einer AMD Ryzen 7 3800X CPU (Markteinführung 2019) ließ sich Windows 3.11 in einer virtuellen Maschine nicht starten]. (Englisch)
Die Untersuchung ergab, dass die Ursache in der Loop-Delay-Kalibrierungslogik des NDIS-Moduls (Network Driver Interface Specification) lag. Diese Logik arbeitete folgendermaßen:
-
Beim Start wird die aktuelle Zeit in Millisekunden ermittelt.
-
Der
LOOP-Befehl wird 2^20 (=1.048.576) Mal ausgeführt. -
Anschließend wird erneut die aktuelle Zeit in Millisekunden ermittelt, und durch Subtraktion der Startzeit wird die verstrichene Zeit berechnet.
-
Durch Berechnung von [2^20 / verstrichene Zeit] wird die Anzahl der Loops pro Millisekunde bestimmt.
Das Problem war, dass bei einer Ausführung von 2^20 Loops in weniger als 1 Millisekunde die verstrichene Zeit als 0 Millisekunden berechnet wurde, wodurch ein Fehler durch [Division durch Null] auftrat. Deshalb schlug der Bootvorgang fehl. Als Windows 3.11 im Jahr 1993 entwickelt und veröffentlicht wurde, war die schnellste CPU auf der PC-Plattform ein Intel-Pentium-Prozessor mit 66 MHz. Einer Berechnung zufolge hätte selbst dieser Prozessor unter optimalen Bedingungen mehr als 94 Millisekunden benötigt, um so viele Loops auszuführen. Ein Grund dafür war auch, dass damalige Prozessoren den LOOP-Befehl nicht in einem einzigen Zyklus ausführen konnten. Moderne CPUs sind jedoch, gemessen an Taktfrequenz und Zyklen pro Instruktion, für den Betrieb eines so alten Betriebssystems schlicht viel zu schnell.
Im Originalartikel finden sich noch weitere interessante Punkte. So wird erklärt, dass diese Logik in Windows 95 leicht verändert wurde und an mehr Stellen zum Einsatz kam. Außerdem brauchte ein Intel-Pentium-III-Modell mit 1 GHz für die Ausführung dieser Logik noch 6 Millisekunden, während auf AMD-Prozessoren bereits bei einem K6-2-Modell mit 350 MHz Probleme auftraten. Damit wird gezeigt, dass das Auftreten des Problems je nach Unterschieden in der internen CPU-Funktionsweise variierte. Vollständig behoben wurde das Problem übrigens erst mit Windows 98 SE, das 1999 veröffentlicht wurde.
Noch keine Kommentare.