Home | Notifications | New Note | Local | Federated | Search | Logout
hikalium@hikalium@misskey.hikalium.dev (2026-05-01 08:43:51) この投稿は、hikaliumとLLMの間で交わされたx86アーキテクチャに関するハードウェア談義を元に、LLM自身が内容を整理して生成し、hikaliumがレビューしたものです。Reply
---
# x86アーキテクチャの昔話:コプロセッサ、割り込み、例外が織りなすハードウェアの歴史
現代のCPUは、浮動小数点計算からマルチタスクの切り替えまで何でも内部でこなしてくれます。しかし、CPUとFPUが物理的に分かれていた時代、ハードウェアとOSの境界線では、今では少し考えられないような連携や妥協が行われていました。当時のIntelアーキテクチャの興味深いポイントと、システムの進化の歴史をまとめました。
## 1. コプロセッサ不在例外と無限フリーズ
80386の時代、浮動小数点計算を行うには80387という別売りのコプロセッサをマザーボードに挿す必要がありました。FPUを持たないPCのために、CPUにはコプロセッサ不在例外(NM) という仕組みがあり、FPU命令を検知するとOSに処理を飛ばし、ソフトウェアエミュレータを起動させていました。
しかし、もしOSがCPUのレジスタ(CR0のEMフラグ)にFPUエミュレータの準備完了という設定をしていなかったらどうなるでしょうか。実はCPUは、FPUがないのに専用のデータバスに命令を投げ、永遠に来ない返事(READY#信号)を待ち続けて完全フリーズしてしまいます。
これは欠陥というわけではなく、システム起動時のBIOS(POST)などによるハードウェア調査をCPUが邪魔しないよう、リセット時のデフォルト状態が「FPUあり(EM=0)」に設定されていたためです。FPUの存在を検知して適切に初期化を行う機能を持たない古いOSを動かした場合、結果として8086時代と同様の物理的なフリーズに行き着くという、互換性とハードウェア仕様の板挟みによる挙動でした。参考資料: Intel® 64 and IA-32 Architectures Software Developer's Manuals (Volume 3 - 2.5 Control Registers の EMフラグ解説より)## 2. 割り込みのハンドシェイク:データバスに命令を放り込む時代
CPUの外部からやってくる割り込みの処理も、時代とともに進化しています。8080やZ80の時代、PICと呼ばれる割り込みコントローラは、割り込みが入るとデータバス上に直接CALL命令の機械語を放り込んでいました。CPUの命令フェッチを外部から乗っ取り、強制的に処理をジャンプさせるという仕組みです。
これが8086以降になると、CPU内部にマイクロコードが実装されたことで、PICは割り込み番号だけをデータバスに渡せばよくなりました。ここで特徴的なのが、CPUとPICがタイミングを合わせるためのINTA#信号が必ず2回出されることです。
1回目の信号は、リアルタイムに変動する優先順位をカメラのシャッターのように固定し、マスターPICが数珠つなぎになったスレーブPICのIDを専用のCASピンに出力します。この1回目と2回目の間隔は、スレーブが自分のIDを解読し、データバスへの出力準備を完了するための不可欠な期間として機能します。そして2回目の信号で、準備が整ったPICからデータバス経由で番号を受け取ります。純粋な電気回路の遅延と連携を考慮して作られた、ハードウェアならではのプロトコルです。参考資料: Intel 8259A Programmable Interrupt Controller Datasheet (CASCADE LINES および Interrupt Sequence 解説より)## 3. FPUがないなら、無効命令例外でよかったのでは?
FPUがない環境でFPU命令を実行した際、なぜ一般的な無効命令例外(UD)を使わず、わざわざ専用の例外(NM)を用意したのでしょうか。
これにはCPUの中で機械語を解釈する命令デコーダの都合が関わっています。FPU命令はCPUの辞書に載っている正しい命令であり、単にハードウェア側が留守なだけなので、辞書にないことを示す無効命令として扱うのは論理的に不自然でした。
また、FPUの計算完了を待つWAIT命令というCPU自身のコントロール命令が存在します。これも特定の条件下(CR0のMPフラグとTSフラグがセットされている場合)では例外を発生させる必要がありますが、無効命令として扱うようにするとデコーダの条件判定が非常に複雑になってしまいます。例外の番号空間には限りがあるため、コンテキストスイッチのための独立した例外を新設するのではなく、NMを割り当てて再利用したのは総合的に良いトレードオフだっ