x64とは
x64、またはx86-64は、x86アーキテクチャを64ビットに拡張した命令セットアーキテクチャです。このアーキテクチャは、AMDが開発したAMD64命令セットと、それに続いて
インテルが採用したIntel 64命令セット(以前はIA-32eやEM64Tと呼ばれていました)を含みます。これらは互換性のある命令セットの総称であり、広義にはx86にx64が含まれることもあります。
インテルはIntel 64の他に、
IA-64という64ビット命令セットアーキテクチャも開発・展開していましたが、これはx64やx86とは全く互換性がありません。
近年、x64アーキテクチャにはいくつかの重要な動きがあります。2023年4月には、
インテルがx64のLegacyモードを切り捨て、Longモードのみにサブセット化する
X86-Sの提案を公表しました。これは回路を単純化し、性能向上を阻害するボトルネックの解消を目指すものです。また、2023年7月には、x64にr16-r31の16本のレジスタを追加するAPXを発表しました。APXに対応したCPUでは従来のx64対応のアプリケーションやOSも動作しますが、APX対応のOSやアプリケーションはx64対応のCPUでは動作しません。レジスタの追加により、性能向上が期待されています。今後、x64からAPXへの移行が計画されており、開発環境としてIntelがエミュレータsdeを提供しています。既にGCCやLLVM CLangなどの
コンパイラや
Linuxで開発が開始されています。
AMD64
AMD64は、AMDのOpteron、Athlon 64、Turion 64、そして
Ryzenなどに実装されています。これはx86アーキテクチャの64ビット拡張として、従来のIA-32ソフトウェアとの互換性を保ちつつ、より高性能なエンタープライズ製品の需要に応えるために開発されました。この計画は2000年8月に発表され、最初のプロセッサは2003年4月に出荷されました。
開発経緯
PC用アーキテクチャとして広く普及したx86は、技術革新とともに性能が向上し、エンタープライズ市場でも受け入れられるようになりました。しかし、
インテルはIA-32の性能向上によって、自社開発の64ビットアーキテクチャである
IA-64との競合を懸念し、x86の拡張を
32ビットに留めました。これに対し、AMDはx86との互換性を保ちつつ64ビットに拡張したアーキテクチャを開発し、市場の需要に応えました。
仕様
x64は、64ビットの汎用レジスタを持ち、
32ビットのx86よりも広いアドレス空間をサポートします。これにより、より大きなデータを容易に扱うことができます。また、x64は
32ビットのプログラムコードとの完全な後方互換性を持っており、
32ビットのx86
実行ファイルを互換性や性能の損失なしに動作させることができます。ただし、x64の性能を最大限に活用するには、x64ネイティブコードを出力する
コンパイラが必要です。
アーキテクチャの特徴
レジスタの追加と拡張
AMDはx86命令セットを64ビット化する際に、x86命令の先頭にプリフィックス(REXプリフィックス)をつける手法を使いました。これは
インテルが16ビットCPUを
32ビット化する際に使った手法と同じです。
AMD64では、汎用レジスタ(GPR)がIA-32の8本から16本に拡張され、各レジスタのビット幅も
32ビットから64ビットに拡張されました。また、128ビットのXMMレジスタの本数も8本から16本に増やされました。これにより、特に深いループを持つ演算処理が多いソフトウェアで、性能向上が期待されます。さらに、呼出規約も効率化され、一部の引数はレジスタ渡しに変更されました。
アドレス空間の拡張
AMD64アーキテクチャは、初期の仕様で48ビットの仮想アドレス幅を持ち、追加機能で57ビットに拡張されました。これにより、IA-32よりも大幅に広い仮想アドレス空間を利用できます。これにより、アプリケーションが利用可能なメモリ空間が大幅に拡張され、大規模なデータ処理が容易になりました。
命令ポインタ相対のデータアクセス
命令ポインタ(RIPレジスタ)を基準にデータを参照できるようになり、位置独立コード(PIC)が効率的に動作するようになりました。これにより、共有
ライブラリや実行時に読み込まれるコードの効率が向上します。
SSE命令
AMD64アーキテクチャは、
インテルのSSEおよびSSE2をコア命令として採用しています。これらの命令セットは、単精度および倍精度のパックド/スカラー演算機能を提供し、SSE2は整数パックド演算機能も提供します。これらの命令は
32ビットモードでも使用でき、家庭用コンピュータでも広く使われるようになりました。
No-Executeビット
NXビットは、仮想アドレス空間のどのページが実行可能かを指定します。これにより、ウイルスなどがバッファーオーバランを利用してシステムを乗っ取るのを防ぎます。AMDが最初にリニアアドレッシングモードで実装しました。
古い機能の削除
AMD64のLongモードには、セグメントアドレッシングや
仮想86モードなど、古いシステムプログラミング機能は含まれていません。これらの機能はLegacyモードでは依然として実装されており、従来の
32ビット、16ビット
オペレーティングシステムは修正なしに動作します。
動作モード
Longモード
AMD64で拡張された部分に対応する動作モードです。ネイティブの64ビットモードと、互換性のための
32ビットモードが含まれます。64ビットのOSで使用され、x86コードを実行しても性能低下は発生しません。
Legacyモード
16ビットOSや
32ビットOSで使用されるモードで、プロセッサはx86の
32ビットプロセッサとして振る舞います。64ビットのプログラムはLegacyモードでは起動できません。
AMD64を採用するCPU
AMDの様々なプロセッサシリーズでAMD64が採用されています。これには、Athlon 64、Opteron、Turion 64、Sempron、Phenom、
Ryzen、EPYCなどが含まれます。
Intel 64
Intel 64は、
インテルによるAMD64の実装であり、IA-32アーキテクチャの64ビット拡張です。
インテルは当初、AMDが開発したAMD64アーキテクチャを採用することを否定していましたが、後に採用しました。開発
コードネームはYamhillで、当初はCT、IA-32e、EM64Tなどと呼ばれていましたが、最終的にIntel 64と改称されました。
Intel 64を採用するCPU
インテルでは、
Xeon、Core iシリーズ、Pentium、Atomなど、幅広いプロセッサでIntel 64が採用されています。当初、一部のモデルでは機能が制限されていましたが、後にすべてのモデルでIntel 64が使用可能になりました。
命令セット
REXプリフィックス
REXプリフィックスは、64ビットのオペランドサイズの指定や新しいレジスタへのアクセスに使用されます。また、64ビットレジスタを8ビットレジスタとしてアクセスする場合にも使用されます。一方で、REXプリフィックスを付けると8ビットレジスタとして AH, BH, CH, DHにアクセスできない制約があります。一部の命令はデフォルトで64ビットのオペランドサイズを持ち、REXプリフィックスを必要としません。
暗黙のゼロ拡張
32ビットレジスタにデータを書き込むと、そのレジスタの上位
32ビットはゼロになります。これはコードサイズ最適化に使用できますが、16ビットや8ビットレジスタへの書き込みではこの拡張は発生しません。
即値
即値は
32ビットのままですが、64ビットに符号拡張されて使用されます。ただし、MOV命令のみ64ビットの即値が使用できます。
変位
変位も
32ビットのままですが、64ビットに符号拡張されて使用されます。ただし、RAXレジスタに対するMOV命令のみ64ビットの変位が使用できます。
64ビットモードで廃止されたx86命令
AAA、AAD、AAM、AASなどの命令は64ビットモードでは廃止されています。
64ビットモードで再割り当てされたx86命令
ARPL命令はMOVSXD命令に、一部のINC/DEC命令はREXプリフィックスに再割り当てされました。LDS、LES命令はVEXプリフィックス、BOUND命令はEVEXプリフィックスに再割り当てされました。
AMD64とIntel 64の差異
AMD64とIntel 64はほとんど同じですが、システムコール命令やMSR(model-specific registers)の定義にわずかな違いがあります。これらの違いは、
オペレーティングシステムや
コンパイラ開発者のみが意識する必要があります。
差異
Intel 64では、SYSCALLとSYSRET命令は64ビットモードのみに存在しますが、SYSENTERとSYSEXIT命令は
32ビットと64ビットの両方に存在します。一方、AMD64では、SYSCALLとSYSRET命令は
32ビットと64ビットの両方に存在しますが、SYSENTERとSYSEXIT命令は
32ビットモードにしか存在しません。
以前あった差異
初期のAMD64にはCMPXCHG16B命令がなく、LAHF, SAHF命令も64ビットモードではサポートされていませんでした。Intel 64も同様に、PREFETCHW命令やXDビットをサポートしていませんでした。これらの差異は、後のバージョンで解消されました。
メモリ管理
コードセグメントディスクリプタ
64ビットモードでは、コードセグメントディスクリプタのPビット、Dビット、DPLフィールド、Cビット、およびLビットのみが有効です。
データセグメントディスクリプタ
64ビットモードでは、データセグメントディスクリプタはPビットのみが有効です。
正規形(canonical form)
64ビットモードでは、仮想アドレスは64ビットですが、実際の実装では、48ビットの仮想アドレス空間のみを使用しています。ビット48から63は、ビット47の値を符号拡張する必要があります。このルールに従ったアドレスを正規形と呼びます。正規形ではないアドレスを使用すると例外エラーが発生します。
Longモードでのページ変換
Longモードでは、物理アドレス拡張(PAE)が必須です。AMD64では、PML4とPML5が追加されました。ページ変換は4Kバイト、2Mバイト、1Gバイトのページサイズをサポートします。
特権レベル
特権レベルは4階層ありますが、通常はレベル0(カーネルモード)とレベル3(ユーザーモード)の2種類しか使用されません。
コールゲートによるシステムコール
コールゲートは特権レベルを切り替える仕組みで、64ビットモードでは64ビットのオフセットが使用できるように拡張されました。
高速システムコール
高速に特権レベルを切り替える命令として、AMDはSYSCALLとSYSRET命令を実装しました。これらの命令は、MSRから特権レベルのチェック無しにCS、SS、RIPをロードします。
マイクロアーキテクチャの世代
x86-64アーキテクチャには、x86-64-v2、x86-64-v3、x86-64-v4の3つのマイクロアーキテクチャレベルがあります。
多くの
オペレーティングシステムがx64アーキテクチャのLongモードをサポートしています。これには、FreeBSD、NetBSD、OpenBSD、
Linux、Mac OS X、Windowsなどが含まれます。
FreeBSD
FreeBSDはamd64という名前でx64をサポートしており、Tier 1プラットフォームとして扱われています。
NetBSD
NetBSDはamd64としてx64をサポートしており、
32ビットコードの実行もサポートしています。
OpenBSD
OpenBSDはAMD64をサポートしており、W^X(Write XOR Execute)機能が容易に実装できるNXビットがあるため、AMD64プラットフォームを好んでいます。
LinuxはLongモードでx64アーキテクチャを動作させる最初の
オペレーティングシステム・カーネルとなりました。
Mac OS X
Mac OS Xは、v10.6で64ビットカーネルをサポートし、ユニバーサルバイナリなどの仕組みを用いて、
32ビットと64ビット両方のアプリケーションをサポートします。
Windows
Microsoft Windowsは、Windows XP Professional x64 Editionでx64に対応しました。x64版Windowsには、1プロセスあたり8TBまたは128TBのユーザーモード仮想アドレス空間、WOW64による
32ビットアプリケーションの実行機能、LLP64データモデルなどが搭載されています。
参考文献
Intel 64 and IA-32 Architectures Software Developer Manuals
AMD64 Architecture Programmer's Manual
関連項目
プロセッサ
命令セット
レジスタ (コンピュータ)
アドレッシングモード
32ビット
x86
IA-32
64ビット
x64 / IA-64
Windows NT系#
32ビットと64ビット
外部リンク
AMD64 プラットフォーム
アーキテクチャ技術資料
*
インテル 64 アーキテクチャー