昔のWindowsが最新CPUで動かない理由: 速すぎるから
(os2museum.com)Michal Necasekという人物が知人から、[AMD Ryzen 7 3800X(2019年発売)CPUを使うシステムでは仮想マシンでWindows 3.11を動かせなかった]という話を聞き、その原因を調査した記事です。(英語)
調査の結果、原因はNDIS(Network Driver Interface Specification)モジュールにあるループ遅延補正ロジックでした。該当ロジックは次のような方式で動作していました。
-
開始時に現在時刻をミリ秒単位で取得する。
-
2^20(=1,048,576)回の
LOOP命令を実行する。 -
もう一度現在時刻をミリ秒単位で取得し、この値から開始時の時刻を引いて経過時間を求める。
-
[2^20 / 経過時間] を計算して、1ミリ秒あたりのループ回数を求める。
問題は、2^20回のループが1ミリ秒以内に終わる場合、経過時間が0ミリ秒と計算されるため、[0による除算] エラーが発生することでした。そのため起動に失敗していたのです。Windows 3.11が開発・発売されていた1993年当時、PCプラットフォームで最も高速なCPUは66 MHzのIntel Pentiumプロセッサでしたが、計算してみると、そのプロセッサがそれだけのループを回すには最良の条件でも94ミリ秒以上かかったはずだとのことです。これは当時のプロセッサが1サイクルで LOOP 命令を実行できなかったためでもあります。しかし現代のCPUは、クロック速度や命令あたりのサイクル数など複数の面から見て、このような昔のOSを動かすには速すぎるというわけです。
原文にはほかにも興味深い内容があります。Windows 95では上記ロジックが少し変更されてさらに多くの場所で使われていたことや、IntelプロセッサではPentium III 1GHzモデルでも上記ロジックの実行に6ミリ秒かかった一方、AMDプロセッサではK6-2 350MHzモデルでも問題が発生するなど、CPU内部の動作差によって問題の発生有無が変わっていたことが説明されています。なお、この問題は1999年に発売されたWindows 98 SEでようやく完全に解決されたそうです。
まだコメントはありません。