ブラックボックスを解明する:Intel 80386マイクロコードの逆アセンブル

数十年にわたり、Intel 80386は現代のコンピューティングの礎石であり、32ビット時代を切り開き、マルチタスクOSの発展を可能にした複雑なメモリ管理を導入しました。しかし、そのアーキテクチャのマニュアルは十分に文書化されていた一方で、ハードウェアにマシンコードを実行させる低レベルの命令である内部マイクロコードは、完全なブラックボックスのままでした。

最近、研究者と愛好家による共同作業により、80386のマイクロコードの逆アセンブルに成功しました。この成果は単なるノスタルジーによるものではありません。高解像度のダイ画像、ニューラルネットワーク、そして丹念な論理分析を組み合わせ、伝説的なプロセッサの内部動作を明らかにするリバースエンジニアリングの傑作です。

ダイ画像からバイナリ・ブロブへ

この旅は、Ken Shirriffが提供した80386ダイの高解像度画像から始まりました。物理的なチップからデータを抽出することは、途方もない作業です。80386のマイクロコードROMは94,720ビットと非常に巨大であり、前身である8086の10,752ビットを圧倒しています。

シリコンダイの写真を、使用可能なバイナリ・ブロブ(binary blob)に変換するには、高度なパイプラインが必要です。チームは、ROM構造を特定しビットを抽出するために、画像処理、ニューラルネットワーク、および人間による自動化の組み合わせを採用しました。バイナリ・ブロブが確保された後、本当の挑戦が始まりました。データの意味を解読することです。

逆アセンブルの技術

(8086とは異なり)ガイドとなる地図や特許がない中で、チームはパターン認識とブラックボックス分析に頼らなければなりませんでした。そのプロセスには、いくつかの重要なブレイクスルーが含まれていました。

  1. 軸の整合: 彼らは、バイナリデータを一方の軸にマイクロオペレーション($μ-ops$)を、もう一方の軸にそれらのオペレーションの特定のビットを配置するように再構成する方法を特定しました。
  2. フィールドの特定: 8086のマイクロコードと、80386の既知の性能特性(例えば、2サイクルでALU演算を実行できる能力など)を分析することで、ソースおよびデスティネーションレジスタ、ならびに第2のALU入力のためのフィールドの存在を推論しました。
  3. 命令の写像: 命令デコーダ(複数の小さなPLAで構成)と保護テストPLAをデコードすることで、チームは、特定のx86命令をそれに対応するマイクロコードの塊(chunks)に関連付けることができました。

ハードウェア・アクセラレーション vs. マイクロコード

最も驚くべき発見の一つは、8086と80386の設計思想の違いです。8086はアルゴリズムの実装にマイクロコードを多用していましたが、80386は大幅に増加したトランジスタ数を利用して「ハードウェア・アクセラレータ」を実装しています。

80386では、マイクロコードの多くは、アルゴリズムを直接体現するのではなく、バレルシフタ、乗算/除算ハードウェア、保護テストユニットといったアクセラレータをセットアップするためのコーディネーターとして機能しています。この転換は、後のCPUにおける、より複雑で高性能な工業的設計への移行を象徴しています。

主な発見と異常値

命令の複雑さ

80386のマイクロコードには、デコーディングROMから215個のエントリポイントがあり、これは8086で見つかった60個から大幅に増加しています。この増加は、新しい命令、およびオペランドの型(レジスタ対メモリ)、CPUモード(リアルモード対保護モード)、およびREPプレフィックスの有無に基づいた異なるルーチンが必要とされることに起因しています。

「常時稼働」のマイクロコード

単純な命令に対してマイクロコードを完全にバイパスする「ファストパス(fast path)」を現代のCPUでよく用いるのとは異なり、80386は常に$μ-op$を実行しています。あらゆる単一の命令は、どれほど単純であっても、マイクロコードによって処理されます。

40年前の潜在的なバグ

おそらく最も興味深い発見は、IO権限ビットマップの処理における潜在的な欠陥です。逆アセンブルの結果、4バイトのポートアクセス時、マイクロコードは最初の3つのアドレスの権限ビットのみをチェックしている可能性があることが示唆されています。

4バイトのポートアクセスが発生すると、マイクロコードは最初の3つのアドレスの権限ビットのみをチェックしているように見えます。したがって、もしそのようなアクセスがIOポート空間の端で行われた場合...アクセスの最終バイトが誤って成功してしまう可能性があります。

このバグは目立たず、特定のCPUリビジョンにのみ存在する可能性がありますが、マイクロコード分析が、隠れたハードウェアの脆弱性を明らかにする上で永続的な価値を持つことを浮き彫りにしています。

結論

80386のマイクロコードを逆アセンブルすることは、好奇心と技術的な粘り強さの勝利です。それはプロセッサを謎めいたシリコンの塊から、読み取り可能な命令セットへと変貌させ、386が仮想86モードやメモリページングによってもたらされた複雑性の爆発をどのように処理したかを解明しました。結果に興味がある方は、完全な逆アセンブル結果は、x86 microcode repository on GitHubで公開されています。

Sources