• 未定義との遭遇

ソフトウェア開発で使うツールの1つに「デバッガ」がある。これは、プログラムの実行を制御して、実行過程を観測するためのもの。デバッガには、大きく「ソフトウェア」、「ハードウェア」、「エミュレータ」の3つがある。ソフトウェア・デバッガは、デバッグ対象のバイナリプログラムを実機で動かすもの。ブレークポイントを使って、ソフトウェアを止め、レジスタやメモリ内容などの途中経過を調べられる。また、ブレークポイントと停止条件などを組み合わせて、複雑な機能を実現することもできる。

ハードウェア・デバッガとは、ICE(In-Circuit Emulator)などのハードウェアを使って、ブレークポイントやさまざまな条件による停止などを行うもの。多くの場合、CPUの代わりにICEを接続し、実機の上でソフトウェアの実行をICEがCPU代わりに実行する。CPUを代行するため、細かい動作(たとえばCPU内フラグのオンオフ)を検出できるなど、ソフトウェアエミュレータよりも高い機能を持つ。反面、ハードウェアが必要なためコストがかかる。

エミュレータ・デバッガは、対象実機を、他のマシンの上でエミュレーションを行い、その中でデバッグを行うもの。ハードウェア・デバッガ同等の細かい処理が可能だが、ハードウェア・デバッガに比べるとターゲットプログラムの実行効率が低い。

さて、ハードウェア・デバッガやエミュレータ・デバッガは、CPUメーカーまたは関連企業が提供を行うが多くの場合、有償で、対象CPUも限られる。ソフトウェアデバッガもCPUメーカーが提供するものがあるが、オープンソースのGDB(GNU DEBUGER)が多数のプロセッサに対応している。

ソフトウェアデバッガの基本は、プログラム中の命令位置で実行を止めるブレークポイントである。デバッガは、バイナリ命令の並びにある命令をすべて理解している。指定した命令の位置でプログラムを止められれば、たとえば、特定のレジスタやメモリに書き込む命令でプログラムを止め、何が行われたのかを判定できる。ソフトウェア・デバッガは、機械語命令の最初のアドレスを認識して、そのバイトを待避したのち、デバッガ側のルーチンへと移行する命令を書き込む。ビット CPUは、実行環境が単純だったため、1バイトのRST(リスタート)命令やTRAP命令を書き込むことで、ブレークポイントを実現していた。

16ビット CPUになると、メモリ保護や特権レベル、仮想記憶などが導入される。そうなると、単純な命令では、特権レベル間の移動ができなくなった。そこで利用されたのが、未定義命令によるシステム割り込みの発生を利用することになった。これなら、優先順位が最も低いモードから、最上位のレベルへと移行できる。

x86で見つかったのは、4バイト命令のUD0(0x0f 0xFF r32 r/m32)、UD1(0x0F 0xB9 r32 r/m32)だった。当初のx86では、UD0またはUD1を使うデバッガが作られた。UDは、UnDefined(未定義)の略とされる。

のちにインテルは、UD2(0x0F 0x0B)をソフトウェアデバッガ用に定義したUD2は、2バイト命令であるため扱いやすく、オペランド部分がページ境界にまたがってエラーを起こさない。UD2は、64ビットモードでも利用可能だ。UD0、UD1は、ユーザーの活動がインテルを動かした結果であり、インテルはそれに応じて、利便性の高いUD2を追加定義した。

さらに、インテルは、UDB(0xD6)も定義した。これは、レガシーモード(32ビットモード)、互換モード(カーネルは64ビットだが、アプリケーション実行環境は32ビット)では未定義命令として利用できないが、64ビットモードでは1バイト命令としてカーネル、OSなどのデバッグ用として利用できる。

なお、80386からデバッグレジスタが導入され、ブレークポイントの設定をCPUの機能として行えるようになった。UD2、UDBそしてデバッグレジスタは、ソフトウェアデバッグに対するインテルの回答だといえる。x86/x64は、ソフトウェア開発で、ホストでもあり、ターゲットであることが多く、さらにクロス開発では、組み込み系からWindows系、Linux系以外のオペレーティングシステムまでをカバーする。その意味では、x86/x64マシンは、世界最大のソフトウェア開発環境といえるだろう。

今回のタイトルネタは、1977年のアメリカ映画「未知との遭遇」(原題Close Encounters of the Third Kind。第3種接近遭遇)である。第3種接近遭遇とは、"The UFO Experience: A Scientific Inquiry" Joseph Allen Hynek, 1972(邦訳「UFOとの遭遇」南山宏訳、大陸書房、1978)で定義された、3段階の遭遇の1つ。第3種接近遭遇は、UFOの乗務員との人類の接触を意味する。

監督はスピルバーグ、1977年11月の公開で、同年5月には、ルーカスのスターウォーズ(現在はエピソード4とされている)が公開されており、ここから映画界は、宇宙SFブームとなった。