アーキテクチャについて
「アーキテクチャ (Architecture)」は、製品の設計や仕様を意味する言葉です。
また、「命令セットアーキテクチャ (ISA : Instruction Set Architecture)」は、CPU 命令セットの仕様という意味になります。
よく「arch」という単語を見ることがありますが、これはアーキテクチャの略です。
arch が x86_64 または amd64 というのは、Intel/AMD の 64bit アーキテクチャであることを意味しています。
コンパイラは、指定されたアーキテクチャの仕様に基づいて、バイナリコードを出力します。
また、「命令セットアーキテクチャ (ISA : Instruction Set Architecture)」は、CPU 命令セットの仕様という意味になります。
よく「arch」という単語を見ることがありますが、これはアーキテクチャの略です。
arch が x86_64 または amd64 というのは、Intel/AMD の 64bit アーキテクチャであることを意味しています。
コンパイラは、指定されたアーキテクチャの仕様に基づいて、バイナリコードを出力します。
Intel 系 CPU
Intel 系 CPU のアーキテクチャの歴史は、以下のようになっています。
x86 | Intel 8086, 80186, 80286... などの、16bit or 32bit プロセッサ、またはアーキテクチャの総称。 80x86 と総称された上、先頭の 80 も略して、x86 と呼ばれることが多いです。 |
---|---|
80386 (i386) | Intel 80386 から、32bit がサポートされました。 IA-32 は、Intel の 32bit 命令セットアーキテクチャの名称です。 |
IA-64 | Intel によって開発された、x86 と互換性のない 64bit 命令セットアーキテクチャ。 このプロセッサ上では、x86 はエミュレーションで動作するため、動作が遅くなるので、普及しなかった。 |
AMD64 (x86-64) | AMD によって開発された、x86 との互換性がある、64bit 命令セットアーキテクチャ。 現在の名称は AMD64 ですが、当初は x86-64 という名称だったため、この名前もまだ使用されています。 |
Intel 64 | 64bit アーキテクチャとしては、x86 と互換がある AMD の方が受け入れられたため、結果的に Intel も、ほぼ同じ仕様の命令セットアーキテクチャを採用した。 |
64bit アーキテクチャ
Intel と AMD の 64bit アーキテクチャを総称して、x64 と呼ぶ場合もあります。
アーキテクチャとして、amd64、x86-64、x64 といった名称が使われている場合、基本的にどれも同じだと思っておけば問題ありません。
Intel 64 も AMD64 も、基本的な部分はほぼ同じです。
ただし、それぞれが独自に追加した命令も一部あり、特に拡張的な機能については、各プロセッサで仕様が異なります。
一般的な命令でも、一部細かい差異はありますが、一般的なアプリケーションを作る場合、アセンブラや OS がそれをうまく処理してしてくれるので、プログラマが違いを意識する必要はほとんどありません。
アーキテクチャとして、amd64、x86-64、x64 といった名称が使われている場合、基本的にどれも同じだと思っておけば問題ありません。
Intel 64 も AMD64 も、基本的な部分はほぼ同じです。
ただし、それぞれが独自に追加した命令も一部あり、特に拡張的な機能については、各プロセッサで仕様が異なります。
一般的な命令でも、一部細かい差異はありますが、一般的なアプリケーションを作る場合、アセンブラや OS がそれをうまく処理してしてくれるので、プログラマが違いを意識する必要はほとんどありません。
マニュアル
Intel と AMD は、それぞれのアーキテクチャの仕様を、PDF で公開しています。
「intel architecture manual」「amd architecture manual」などで検索してみてください。
(最新のマニュアルについては、日本語版はありません)
AMD のマニュアルの方が、ざっくりと概要を説明しているので、最初に読むなら、AMD の方がわかりやすいです。
Intel のマニュアルの方は詳細に説明しているので、わかりにくいことがあれば、こちらを読んだほうが良いです。
ただし、両方とも、所々書き間違いが見受けられるので、出来るだけ見比べながら読んでいってください。
「intel architecture manual」「amd architecture manual」などで検索してみてください。
(最新のマニュアルについては、日本語版はありません)
AMD のマニュアルの方が、ざっくりと概要を説明しているので、最初に読むなら、AMD の方がわかりやすいです。
Intel のマニュアルの方は詳細に説明しているので、わかりにくいことがあれば、こちらを読んだほうが良いです。
ただし、両方とも、所々書き間違いが見受けられるので、出来るだけ見比べながら読んでいってください。
動作モード
Intel 64/AMD64 は、x86 との互換性があるため、従来の 16/32bit プログラムを、そのまま (再エンコードすることなく) 実行することができます。
x64 プロセッサで 16/32bit OS を動かすこともできますし、64bit OS 上で、64bit のプログラムと 16/32bit のプログラムを同時に動かすこともできます。
プロセッサがこれらのプログラムを動かすために、大きく分けて2つの動作モードがあり、さらにその下に、複数のサブモードがあります。
動作モードは、OS によって、個々のコードセグメント単位で有効にされます (つまり、プログラムごとに切り替えが可能)。
x64 プロセッサで 16/32bit OS を動かすこともできますし、64bit OS 上で、64bit のプログラムと 16/32bit のプログラムを同時に動かすこともできます。
プロセッサがこれらのプログラムを動かすために、大きく分けて2つの動作モードがあり、さらにその下に、複数のサブモードがあります。
- レガシーモード
従来の 16/32bit OS で、従来の 16/32bit アプリケーションを実行するためのモード。 - ロングモード (IA-32e モード)
64bit OS 上で、64bit または 16/32bit アプリケーションを実行するためのモード。
AMD では「ロングモード」、Intel では「IA-32e」モードと呼ばれます。
動作モードは、OS によって、個々のコードセグメント単位で有効にされます (つまり、プログラムごとに切り替えが可能)。
レガシーモード
以下の3つのサブモードがあります。
- プロテクトモード
プロテクトモード自体は、Intel 80286 でサポートされた動作モードであり、最大 4 GB のメモリ領域にアクセスできる。 - 仮想 8086 モード
プロテクトモード上で、8086 (16bit) のプログラムを実行する。 - リアルモード
8086 互換の動作をするモード。
最大 1 MB のメモリ領域にアクセスできる。
ロングモード
以下の2つのサブモードがあります。
ここの解説では、以降、x64 の 64bit モードで実行させるためのプログラムを作っていくことになります。
- 64bit モード
64bit OS 上で、64bit プログラムを実行する。
x64 で拡張されたレジスタにアクセスすることができます。 - 互換モード
64bit OS 上で、16/32bit プログラムを実行する。
ここの解説では、以降、x64 の 64bit モードで実行させるためのプログラムを作っていくことになります。