x64
x64またはx86-64[
なお、インテルはIntel 64の
2023
2023
AMD64[編集 ]
開発 経緯 [編集 ]
PC
仕様 [編集 ]
64ビットの
アーキテクチャの特徴 [編集 ]
AMDがx86
- レジスタの
追加 と拡張 汎用 レジスタ (GPR)数 はIA-32の8本 (EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP) に更 にR8〜R15の8本 を追加 して16本 に増 やされ、各 レジスタのビット幅 も32ビットから64ビットに拡張 された。IA-32は汎用 レジスタが少 ないことからコンパイラによる最適 化 に限界 があり、これが最 も大 きな欠点 とされた。AMD64に最適 化 されたアプリケーションでは、レジスタ本数 の増加 によって性能 向上 が見込 まれ、特 に深 いループを持 った演算 主体 のソフトウェアでその傾向 が強 いと見込 まれる。さらに128ビットのXMMレジスタの本数 も8本 から16本 に増 やされた(Streaming SIMD命令 で使 われる)。呼出 規約 においても、引数 渡 しがIA-32では原則 としてスタックのみを使用 していたのが一部 の引数 についてレジスタ渡 しに変更 されたり、呼出 に際 して一部 のレジスタの上書 きを容認 するなど効率 が上 がっている。[9]- アドレス
空間 の拡張 - AMD64アーキテクチャでは、
初期 の仕様 で48ビット(仮想 アドレス空間 サイズで256テラバイト)、追加 機能 で57ビット(仮想 アドレス空間 サイズで512ペタバイト)の仮想 アドレス幅 を持 つ。IA-32アーキテクチャにおいて初期 のプロセッサでは、仮想 アドレス空間 は32ビットで表現 できる4GiBに制約 され、Pentium Pro以降 の実装 で追加 された物理 アドレス拡張 機能 を使用 することで64GiBの物理 メモリを接続 できるが、その場合 も仮想 アドレス幅 は広 がらず、仮想 アドレス空間 はやはり4GiBに制約 された。32bit版 Windowsシリーズにおいては、OSの仕様 でアプリケーションが利用 可能 なメモリはおよそ3GiBに制約 される[10]。これに対 しAMD64のLongモードでは、IA-32の物理 アドレス拡張 をベースに、仮想 アドレス空間 をまず48ビットへ拡張 し(現状 物理 アドレス空間 は52ビット)、将来 の拡張 で4エクサバイトまでの仮想 アドレス空間 をサポートできるようになっている。 関連 :2進 接頭 辞 - RIP
相対 データアクセス - プログラムカウンタ (RIP)
相対 でデータにアクセスすることができ、リロケータブルな共有 ライブラリのコードを作成 できる。また、共有 ライブラリを仮想 アドレス空間 のどこにでも配置 することができる(位置 独立 コード)。 - SSE
命令 - AMD64アーキテクチャでは
明確 にインテルのSSEとSSE2を基本 命令 セットに組 み込 んでいる。SSE2はx87の80ビット浮動 小数点 数 から 32ビット/64ビットの浮動 小数点 数 に置 き換 えたものである。SSE/SSE2命令 セットは追加 の8本 のXMMレジスタを扱 えるように拡張 された。SSEとSSE2がAMD64命令 セットに組 み込 まれており、それが従来 のx87 FPUやMMXや3DNow!の機能 をカバーする。x64版 Windowsでの64ビットプログラムでは、FPU/MMXレジスタをコンテキストスイッチの際 に保存 しないようにすると噂 されたが、実際 には保存 されるようになっている[11]。 - No-Executeビット
- NXビット(ページテーブルエントリのビット63)は
仮想 アドレス空間 のどのページが実行 可能 か、実行 不可 かを指定 することができる。NXビットがセットされたページにあるコードを実行 しようとするとメモリアクセス違反 となり、実行 できない。これは、リードオンリーページへの書 き込 みを実行 しようとしてもできないことと似 ている。No-Execute機能 は、ウイルスなどがバッファーオーバランなどを使用 して、オペレーティングシステムを乗 っ取 ろうとすることを難 しくする。 類似 の機能 は、セグメントの属性 として80286以降 のプロセッサーに存在 している。しかし、近代 的 なオペレーティングシステムではセグメント機能 は古 いものと見 なされ、セグメントのベースを0、リミットを4Gバイト(32ビットOSの場合 )に設定 することにより、実質 的 にセグメントを使用 していない。- AMDはリニアアドレッシングモードでNo-Execute
機能 を実装 した最初 のx86ベンダーである。No-Execute機能 は、PAEを有効 にすれば、32ビットOSでも使用 可能 である。 古 い機能 の削除 - x86アーキテクチャーにある
多 くのシステムプログラミング機能 は近代 的 なオペレーティングシステムでは使用 されておらず、それら古 い機能 は、AMD64のLongモードにはない。それらは、セグメントアドレッシング、タスクステートセグメントを使用 したタスクスイッチ、仮想 86モードなどである(ただし、FS, GSセグメントは、オペレーティングシステム構造 体 へのエクストラベースポインタとして残 されている)。これらの古 い機能 は、Legacyモードでは依然 として、完全 に実装 されているので、これまでの32ビット、16ビットオペレーティングシステムは、修正 なしにx64プロセッサー上 で動作 する。
動作 モード[編集 ]
アドレスサイズの |
オペランドサイズの |
レジスタの |
|||||
---|---|---|---|---|---|---|---|
Longモード | 64ビット モード | 64 | 32 | 64 | |||
32 | 32 | なし | 32 | ||||
16 | 16 | 16 | |||||
Legacyモード | プロテクト モード | 32 | 32 | なし | 32 | ||
16 | 16 | ||||||
16 | 16 | 16 | |||||
リアル モード |
このアーキテクチャは、LongモードとLegacyモードという
Longモード[編集 ]
AMD64で
Longモードを
Legacyモード[編集 ]
このモードは、16ビットOS(MS-DOS - Windows 3.1
AMD64を採用 するCPU[編集 ]
- AMD Athlon 64
- AMD Athlon 64 X2
- AMD Athlon 64 FX
- AMD Athlon II (
搭載 コア数 などから、'X2', 'X3', 'X4', XLTモデルに分 かれる) - AMD Opteron
- AMD Turion 64
- AMD Turion 64 X2
- AMD Sempron ("Palermo" E6 ステッピングと、"Manila"
以降 の全 モデル) - AMD Phenom (
搭載 コア数 から、'X3', 'X4'に分 かれる) - AMD Phenom II (
搭載 コア数 から、'X2', 'X3', 'X4' 'X6'に分 かれる) - AMD Bulldozer (マイクロアーキテクチャ) FX
- AMD APU
- AMD Ryzen
- AMD EPYC
Intel 64[編集 ]
Intel 64は、IA-32アーキテクチャの64ビット
開発 経緯 [編集 ]
インテルは、AMD64
Intel 64を採用 するCPU[編集 ]
インテルで
Intel 64を
- Xeon (Nocona
以降 、Sossaman除 、Xeon MPについてはCranford/Potomac以降 ) - Intel Core 2
- Intel Core i9
- Intel Core i7
- Intel Core i5
- Intel Core i3
- Intel Core M
- Intel Core Ultra 9
- Intel Core Ultra 7
- Intel Core Ultra 5
- Intel Core 7
- Intel Core 5
- Intel Core 3
- Pentium Dual-Core
- Intel Atom(model 230/330,N450/D510/D410)
- Pentium D
- Pentium 4(Prescottはmodel F
以降 、model 521/531/541/551/561/571) - Pentium Extreme Edition
- Celeron D(model 326/331/336/341/346/351/355/356)
- Celeron Dual-Core
- Celeron M (model 520/530)
- Celeron 200シリーズ(model 220)
- Celeron 400シリーズ
- Celeron 500シリーズ
- Intel Processor Uシリーズ(デスクトップ
向 け専用 ) - Intel Processor Nシリーズ(モバイル
向 け/ミニデスクトップ向 け兼用 )
AMD64とIntel 64の差異 [編集 ]
AMD64とIntel 64は、ほとんど
差異 [編集 ]
- Intel 64では、SYSCALL, SYSRET
命令 は64ビットモードにしかない。SYSENTER, SYSEXIT命令 は32ビット、64ビットの両方 にある。 - AMD64では、SYSCALL, SYSRET
命令 は32ビット、64ビットの両方 にあるが、SYSENTER, SYSEXIT命令 は32ビットモードにしかない。 - Intel 64には、AMD64で
定義 されたSYSCFG, TOP_MEM, TOP_MEM2がMSR(model-specific registers)にない。 - Intel 64では、64ビットモードでニア
分岐 命令 に66h(オペランドサイズ プリフィックス)を付 けた場合 サポート外 となる。AMD64では、仕様 書 通 り16ビットオペランドとして実行 される。 - BSF, BSR
命令 はソースが0の場合 、Intel 64では元々 のx86と同様 にデスティネーションは不定 (undefined)であるが、AMD64はデスティネーションを変更 しない。 - ハードウェア
仮想 化 支援 機能 のIntel VT-xとAMD-Vは互換 性 がない。仮想 化 ソフトウェアはそれぞれに対応 する必要 がある。 - Second Level Address Translation
機能 のIntel EPTとAMD RVIは互換 性 がない。仮想 化 ソフトウェアはそれぞれに対応 する必要 がある。
以前 あった差異 [編集 ]
- AMD64には、
元々 はCMPXCHG16B命令 はなかった。この命令 は16バイト(128ビット)のメモリ領域 を複数 のCPUコアで排他 的 に共有 することに使用 される。この命令 はWindowsで16TB以上 の仮想 メモリを使 うために必要 である。Socket AM2以降 のAMD64で対応 [19]。 初期 のAMD64, Intel 64は、64ビットモードでLAHF, SAHF命令 をサポートしていない。この2つの命令 はAHレジスタとフラグ間 の転送 命令 で、元々 は8ビットCPUである8080のプログラムを8086へ移植 するのを容易 にするために提供 されていた[20]。64ビットモードでは、使 い道 があまりない命令 のように見 える。しかし、PUSH/POP命令 の組 み合 わせと比較 して、メモリにアクセスせず高速 にフラグをコピーできるため、VMwareなどの仮想 化 ソフトウェアがこの2つの命令 に依存 している[21]。また、x87のステータスワードをフラグにコピーすることにも使用 される。初期 のIntel 64には、PREFETCHW命令 はなかった[22]。この命令 は、元々 はAMDの3DNow!で導入 されたキャッシュの最適 化 命令 である。Pentium 4のCedarMillコアからIntel 64はこの命令 を単 にNOP(No Operation)として処理 するようになった[23]。NOPとして処理 するIntel 64でもMicrosoft社 のCoreinfoツール[24]は、PREFETCHWに対応 と表示 する。2013年 のSilvermont、2014年 のBroadwellよりPREFETCHW命令 に正式 に対応 している。
(上記 3つは、Windows 8.1、Windows 10の64ビット版 が初期 のAMD64、Intel 64CPUにインストールできない制約 事項 となる[25][26])初期 のIntel 64は、XDビット(AMD64におけるNXビット)をサポートしていない。したがってWindows 8(32ビット版 、64ビット版 とも)がインストールできない制約 事項 となる。
その他 [編集 ]
- POPFQ
命令 には、REXプリフィックスは必要 ない。Intel社 のドキュメントにはこのことが正 しく記載 されていなかった。 同 じオペコードに対 するMOVDとMOVQの割 り当 てがIntel 64のドキュメントとAMD64のドキュメントで異 なる。一方 のドキュメント通 りのアセンブリソースがアセンブルできない[27]、逆 アセンブル結果 が想定 と異 なる[28]といったことが起 こり得 る。
命令 セット[編集 ]
- REXプリフィックス
次 のような命令 にはREXプリフィックスを使用 する。- 64ビットのオペランドサイズの
指定 新 しいR8〜R15レジスタ、追加 されたXMMレジスタなどへのアクセス- 64ビットレジスタであるRSP, RBP, RDI, RSIのビット0から7を、8ビットレジスタSPL, BPL, DIL, SILとしてアクセス。
一方 でREXプリフィックスを付 けると8ビットレジスタとして AH, BH, CH, DHにアクセスできない。これにより直交 性 が高 まった。
- 64ビットのオペランドサイズの
- また、
以下 の命令 は、デフォルトで64ビットのオペランドサイズであり、REXプリフィックスを必要 としない。- ニア
分岐 命令 - PUSH, POP
命令 - ENTER, LEAVE
命令
- ニア
暗黙 のゼロ拡張 - 32ビットレジスタにデータを
書 き込 むとその汎用 レジスタの上位 32ビット(ビット32から63)はゼロになる。 - これは、コードサイズの
最適 化 に使用 できる。 一方 、16ビットレジスタや8ビットレジスタにデータを書 き込 んでも、このゼロ拡張 は起 きない。
- NOP(No Operation:オペコード 90h)
命令 は、かつてはXCHG EAX, EAXと等価 であったが[29]64ビットモードではこの命令 を特別 に扱 い、暗黙 のゼロ拡張 を適用 せずRAXレジスタは変化 しない。 - CMOV(Conditional Move)
命令 では、64ビットモードでオペランドが32ビットの場合 、条件 が偽 でもデスティネーションレジスタの上位 32ビットはゼロになる。 即値 - 64ビットモードであっても、
即値 (Immediate value)は、32ビットのままであり、64ビットに符号 拡張 されて使用 される。ただし、MOV命令 のみ64ビットの即値 が使用 できる。 変位 - 64ビットモードであっても、
変位 (displacement)は、32ビットのままであり、64ビットに符号 拡張 されて使用 される。ただし、RAXレジスタに対 してのMOV命令 のみ64ビットの変位 が使用 できる。 - 64ビットモードで
廃止 されたx86命令 以下 のx86命令 は64ビットモードでは廃止 されたため、64ビットモードで実行 すると不正 命令 例外 が発生 する。- AAA, AAD, AAM, AAS (ASCII Adjust Addtion/Division/Multiply/Subtraction)
- BOUND (Check Array Bounds)
- CALL far, JMP far (Call far absolute, JMP far absolute)
- DAA, DAS (Decimal Adjust Addition/Subtraction)
- INTO (Interrupt to Overflow Vector)
- LDS, LES (Load Segment Register)
- POP DS, POP ES, POP SS, POPA
- PUSH CS, PUSH DS, PUSH, ES, PUSH SS, PUSHA
- オペコード 82h (Redundant encoding of opcode 80h: undocumented)
- SALC (Set AL According to CF: undocumented)
- LAHF, SAHF
命令 は、初期 のAMD64, Intel 64では64ビットモードで廃止 されたx86命令 であった。 - 64ビットモードで
再割 り当 てされたx86命令 -
- ARPL (Adjust Requestor Privilege Level)
命令 は、64ビットモードでは、新 しいMOVSXD命令 になった。 - 1バイトのINC, DEC
命令 は、64ビットモードでは、REXプリフィックスになった。一方 、2バイトのINC, DEC命令 は、64ビットモードでも使用 可能 である。 - 64ビットモードで
廃止 されたLDS, LES命令 は、のちにインテルによってAVX命令 のVEXプリフィックスとして割 り当 てられた。VEXプリフィックスに続 く2バイト目 を32ビットモードでは不正 であった11xxxxxxという形式 にすることにより、AVX命令 は32ビットモードでも使用 可能 である。Windows NTの仮想 DOSマシンでは、C4h C4h(LES AX, SPとデコードされる不正 命令 )を仮想 86モードから32ビットプロテクトモードの呼 び出 しに使用 していた[30]。AVXは仮想 86モード、リアルモードには対応 していない。 - 64ビットモードで
廃止 されたBOUND命令 は、のちにインテルによってAVX-512命令 のEVEXプリフィックスとして割 り当 てられた。EVEXプリフィックスに続 く2バイト目 を32ビットモードでは不正 であった11xxxxxxという形式 にすることにより、AVX-512命令 は32ビットモードでも使用 可能 である。
- ARPL (Adjust Requestor Privilege Level)
メモリ管理 [編集 ]
- コードセグメントディスクリプタ
- 64ビットモードでは、コードセグメントディスクリプタのP(Present)ビット、D(Default)ビット、DPL(Descriptor Privilege Level)フィールド、C(Conforming)ビット、および、
新 しく定義 されたL(Long)ビットのみが有効 である。L=1の場合 、64ビットモードでプロセッサーが動作 することを意味 する。それ以外 のベースアドレス、リミットなどは無視 される。
コードセグメントディスクリプタのフォーマット
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ベースアドレス[31:24] | G | D | L | AVL | リミット[19:16] | ||||||||||
P | DPL | S=1 | E=1 | C | R | A | ベースアドレス[23:16] | ||||||||
ベースアドレス[15:0] | |||||||||||||||
リミット[15:0] |
- データセグメントディスクリプタ
- 64ビットモードでは、データセグメントディスクリプタは、P(Present)ビットのみが
有効 である。それ以外 のベースアドレス、リミットなどは無視 される。ただし、FS,GSセグメントレジスタのみベースアドレスは有効 で、MSRを使用 して64ビットのベースアドレスを指定 することもできる。 - のちにインテルは、
特権 レベル0以外 でもFS,GSのベースアドレスを操作 可能 にするRDFSBASE, RDGSBASE, WRFSBASE, WRGSBASE命令 を追加 した。
データセグメントディスクリプタのフォーマット
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ベースアドレス[31:24] | G | D | 0 | AVL | リミット[19:16] | ||||||||||
P | DPL | S=1 | E=0 | ED | W | A | ベースアドレス[23:16] | ||||||||
ベースアドレス[15:0] | |||||||||||||||
リミット[15:0] |
正規 形 (canonical form)- 64ビットモードでは、
仮想 アドレスは64ビットであるものの、実際 の実装 では、264バイト(16EB)のすべてを使用 できるようにはなっていない。ほとんどのオペレーティングシステム、アプリケーションは、近 い将来 も含 めて、そのような大 きなアドレス空間 を使用 しない。フル64ビットという大 きなアドレス空間 のサポートは、複雑 さとアドレス変換 のコストを増 やすだけでメリットはない。そのため、AMDは最初 のAMD64の実装 では、48ビットの仮想 アドレス空間 のみを使用 することにした。さらに仮想 アドレスのビット48から63は、符号 拡張 によりビット47の値 がコピーされなければならないことにした。そうでない仮想 アドレスを使用 した場合 は、プロセッサーは例外 エラーを発生 する。このルールに従 ったアドレスは、正規 形 (canonical form)と呼 ばれる。正規 形 のアドレスは、0から00007FFF'FFFFFFFFとFFFF8000'00000000からFFFFFFFF'FFFFFFFFの範囲 であり、合計 で256TBの仮想 アドレス空間 が使用 可能 である。 - この
仕様 は、実際 に64ビット仮想 アドレスが使用 可能 になったときに重要 な意味 を持 つ。正規 形 ではないアドレスを使用 した場合 、例外 エラーが発生 するので、アプリケーションやOSが、未 使用 の上位 16ビットを別 の用途 に使用 できない。そのため、将来 、仮想 アドレス空間 が48ビットから拡張 されたときに問題 が起 こらない[31][32]。 - 2020
年 頃 までに、追加 機能 として仮想 アドレスに対 して初 めてとなる9ビットの拡張 が行 われ、57ビットまでの仮想 アドレスが使用 できるようになった。[33]仮想 アドレス空間 のサイズは512PBとなる。ビット57-63は引 き続 き未 使用 となり、正規 形 の仮想 アドレスではビット56からの符号 拡張 が必要 となる。 - Longモードでのページ
変換 (page translation) - Longモードでのページ
変換 には物理 アドレス拡張 (PAE)が必須 である。Longモードに入 る前 にCR4のPAEビットを1にセットする必要 がある。AMD64では、PDPE(page-directory-pointer entry), PDE(page-directory entry), PTE(page-table entry)を拡張 し、新 たにPML4(page-map level-4)を追加 した。いずれのページテーブルも、仮想 アドレスのうち9ビット分 を変換 する。PAEが有効 になっているため、CR4のPSE(page-size extensions)ビットは無視 される。CPUIDのファンクション8000_0001hで、EDXのビット26がセットされていると、そのCPUは、1Gbyteページ変換 に対応 している。 仮想 アドレスの57ビットへの拡張 に際 しては、PML4のさらに上位 にPML5(page-map level-5)を追加 した。ページテーブルのビット幅 は他 のページテーブルと同 じく9ビット分 となる。なお、これに伴 うページサイズの追加 および変更 はない。
- 4Kbyteページ
変換 : PML5(*), PML4, PDPE, PDE, PTEによって変換 される。ページのサイズは4Kbyteである。 - 2Mbyteページ
変換 : PML5(*), PML4, PDPE, PDEによって変換 される。ページのサイズは2Mbyteである。 - 1Gbyteページ
変換 (*): PML5(*), PML4, PDPEによって変換 される。ページのサイズは1Gbyteである。
- (*) CPUがサポートしている
場合 にのみ使用 可能 。
特権 レベル[編集 ]
- コールゲートによるシステムコール(CALL far, RET)
- コールゲートは80286で
特権 レベル(0,1,2,3)を切 り替 える仕組 みとして導入 された。64ビットモードでは、コールゲートは64bitのオフセットが使用 できるように拡張 された。 - コールゲートの
仕組 みはRISCには無 い。RISCにも対応 していたWindows NTではシステムコールにコールゲートを使用 せず、INT命令 やPentium IIで追加 されたSYSENTER, SYSEXIT命令 を使用 していた。
高速 システムコール(SYSCALL, SYSRET)特権 レベル3(ユーザーモード)と特権 レベル0(カーネルモード)を高速 に切 り換 える命令 として、AMDは64ビットモードではx86にあるSYSENTER, SYSEXIT命令 は実装 せず、AMD独自 のSYSCALL, SYSRET命令 のみを実装 した。SYSCALL命令 は、CS(コードセグメント), SS(スタックセグメント), RIP(インストラクションポインタ)をあらかじめセットされたMSRから特権 レベルのチェック無 しにロードする。このときRSP(スタックポインタ)はロードされない。オペレーティングシステムは新 しいSWAPGS命令 を使用 して、ユーザーモードのGSセグメントと、カーネルモードのGSセグメントを切 り替 え、GSセグメント経由 でカーネルモードのRSPをロードする。- なお、SYSCALLのオペコードは0Fh 05h、SYSRETのオペコードは0Fh 07hであり、これらはかつてx86に
存在 していた非公開 命令 LOADALLのオペコードを再割 り当 てしている。
マイクロアーキテクチャの世代 [編集 ]
Level | CPU features | Example instruction | Supported processors |
---|---|---|---|
x86-64 (x86-64-v1) |
CMOV | cmov | 2003 |
CX8 | cmpxchg8b | ||
FPU | fld | ||
FXSR | fxsave | ||
MMX | emms | ||
OSFXSR | fxsave | ||
SCE | syscall | ||
SSE | cvtss2si | ||
SSE2 | cvtpi2pd | ||
x86-64-v2 | CMPXCHG16B | cmpxchg16b |
|
LAHF-SAHF | lahf | ||
POPCNT | popcnt | ||
SSE3 | addsubpd | ||
SSE4_1 | blendpd | ||
SSE4_2 | pcmpestri | ||
SSSE3 | pshufb | ||
x86-64-v3 | AVX | vzeroall |
|
AVX2 | vpermd | ||
BMI1 | andn | ||
BMI2 | bzhi | ||
F16C | vcvtph2ps | ||
FMA | vfmadd132pd | ||
LZCNT | lzcnt | ||
MOVBE | movbe | ||
OSXSAVE | xgetbv | ||
x86-64-v4 | AVX512F | kmovw |
|
AVX512BW | vdbpsadbw | ||
AVX512CD | vplzcntd | ||
AVX512DQ | vpmullq | ||
AVX512VL | N/A |
オペレーティングシステムの互換 性 と扱 い[編集 ]
BSD[編集 ]
FreeBSD[編集 ]
FreeBSDは、2003
NetBSD[編集 ]
x64アーキテクチャーのサポートは2001
OpenBSD[編集 ]
OpenBSDは2004
Linux[編集 ]
LinuxはLongモードでx64アーキテクチャを
64ビット
Mac OS X[編集 ]
Mac OS X v10.4のうちv10.4.7
Mac OS X v10.5は、64ビットのPowerPCマシン
Mac OS X v10.6は、64ビットカーネルをサポートしたMac OS Xの
OS X Mountain Lionは、64ビットカーネルのみサポートするが、32ビット、64ビットの
Macは、x86/x64の32ビット・64ビットだけでなく、PowerPCとインテル・アーキテクチャのサポートなど、アーキテクチャの
Windows[編集 ]
Microsoft Windowsは、2005
Windows Vistaは2007
Windows Server 2008は2008
x64
- 1プロセスあたり8TB(Windows 8まで)
又 は128TB(Windows 8.1以降 )のユーザーモード仮想 アドレス空間 。x64のプログラムは、"large address aware"オプションを付 けてリンクされていれば、これらのすべてを使用 できる。ただし、補助 記憶 装置 (すなわち、ハードディスク)の容量 により使用 できる最大 値 は、制限 される。一方 、32ビット版 Windowsで提供 されているユーザーモード仮想 アドレス空間 は2GBである。 - オペレーティングシステム
用 の8TB(Windows 8まで)又 は128TB(Windows 8.1以降 )のカーネルモード仮想 アドレス空間 。一方 、32ビット版 Windowsで提供 されているカーネルモードアドレス空間 は2GBである。この増加 した空間 のメリットは、ファイルシステムのキャッシュやカーネルモードヒープに使用 できる。Windows 8までのWindowsはプロセッサーで実装 されている256TBのアドレス空間 のうち合計 16TBしか使用 できない。これは、初期 のAMD64がCMPXCHG16B命令 をサポートしていないためである[36]。 - WOW64を
使用 して、既存 の32ビットアプリケーション(.exeプログラム)とダイナミックリンクライブラリ(.dll)を実行 する機能 。さらに、32ビットアプリケーションが"large address aware"オプションを付 けてリンクされていれば、そのアプリケーションは64ビットWindows上 で、4GBの仮想 アドレス空間 を使用 できる。一方 、32ビットWindowsでは、デフォルトの仮想 アドレス空間 は2GBで、/3GBのブートオプションを付 けてWindowsを起動 し、"large address aware"オプションを付 けてリンクされたアプリケーションであれば3GBである。/3GBのブートオプションを付 けて起動 した32ビットのWindowsとは異 なり、64ビットWindowsではカーネルモード仮想 アドレス空間 が減 らない。そのため、32ビットアプリケーションは、x64用 に再 コンパイルしなくても、64ビットWindows上 で動作 させることにメリットがある。 - 32ビット、および、64ビットのアプリケーションは、"large address aware"オプションを
付 けてリンクされていなければ、仮想 アドレス空間 は2GBに制限 される。 - Windows XP/Vistaでは128GB, Windows 7では192GB、Windows 8では512GB、Windows Server 2003では1TB、Windows Server 2008では2TB、Windows Server 2012では4TBまでのRAMを
使用 可能 。 - LLP64データモデルを
採用 。intとlongは32ビット、long longは64ビット、ポインタとポインタから派生 したデータ型 は64ビットである。 - カーネルモードデバイスドライバは64ビットでなければならない。32ビットのカーネルモードデバイスドライバは 64ビット
版 Windowsでは動作 しない。ユーザーモードデバイスドライバは、32ビット、64ビットのどちらも64ビット版 Windowsで動作 する。 - 16ビットWindows(Win16)アプリケーションとDOSアプリケーションは64ビット
版 Windowsでは動作 しない。これは、64ビットモードに仮想 86モードがないため、64ビット版 Windowsから仮想 DOSマシンサブシステム(NTVDM)を削除 したためである。 - NX(No Execute)ページ
保護 機能 の完全 な実装 。この機能 は32ビット版 WindowsでもPAEモードで起動 すれば使用 できる。 - x86
版 のWindows NTファミリーでFSセグメントが使 われている代 わりに、x64ではGSセグメントがオペレーティングシステムが定義 する2つの構造 体 を指 している。ユーザーモードでのスレッドインフォメーションブロック(NT_TIB)とカーネルモードでのプロセスコントロールリージョン(KPCR)である。たとえば、ユーザーモードでは、GS:0はスレッドインフォメーションブロックの最初 のメンバーのアドレスである。この規則 を維持 することによりx64版 Windowsの開発 が容易 になった。しかし、AMDに対 して、LongモードでFS, GSセグメントの機能 を保持 することを要求 することになった。(ただし、セグメントアドレッシング自体 は、近代 的 なオペレーティングシステムで使 われるものではない) - Microsoft Visual Studio 2005
以降 では、64ビット版 Windowsのみで動作 する64ビットアプリケーション、32ビット版 Windowsと64ビット版 WindowsのWOW64上 の両方 で動作 する32ビットアプリケーションの開発 が可能 である[37]。
脚注 [編集 ]
- ^
大学 など学術 の世界 や、オープンソースのプロジェクトなどでは、(互換 関係 が明白 で、特定 メーカー名 も入 っていない名称 なので)「x86-64」と呼 ぶことを好 み、AMD社 やAMDと関連 が深 い会社 では「AMD64」と呼 ぶことを好 み、マイクロソフト社 やサン・マイクロシステムズ(後 にオラクルに買収 された会社 )は短 く「x64」と呼 ぶことを好 む[1][2]。
- ^
株式会社 インプレス (2023年 5月 22日 ). “Intel、新 「X86-S」アーキテクチャで8086互換 を切 り捨 て”. PC Watch. 2023年 6月 4日 閲覧 。 - ^ “Introducing Intel® Advanced Performance Extensions (Intel® APX)”. Intel (2024
年 3月 5日 ). 2024年 3月 5日 閲覧 。 - ^ a b “
日本 AMD、Opteronの発表 会 を開催 ”. pc.watch.impress.co.jp. 2023年 6月 4日 閲覧 。 - ^ “
日本 AMD、Athlon 64の発表 会 を開催 ”. pc.watch.impress.co.jp. 2023年 6月 4日 閲覧 。 - ^ “AMD、X86-64アーキテクチャのプログラミングガイドを
公開 ”. pc.watch.impress.co.jp. 2023年 6月 4日 閲覧 。 - ^ “
後藤 弘 茂 のWeekly海外 ニュース”. pc.watch.impress.co.jp. 2023年 6月 4日 閲覧 。 - ^ a b AMD Corporation (2011
年 5月 ). “Volume 2: System Programming” (pdf). AMD64 Architecture Programmer's Manual. AMD Corporation. 2011年 10月 29日 閲覧 。 - ^ IBM Corporation (2007
年 9月 6日 ). “IBM WebSphere Application Server 64-bit Performance Demystified”. p. 14. 2010年 4月 9日 閲覧 。 “"Figures 5, 6 and 7 also show the 32-bit version of WAS runs applications at full native hardware performance on the POWER and x86-64 platforms. Unlike some 64-bit processor architectures, the POWER and x86-64 hardware does not emulate 32-bit mode. Therefore applications that do not benefit from 64-bit features can run with full performance on the 32-bit version of WebSphere running on the above mentioned 64-bit platforms."” - ^ これらの
新 しい呼出 規約 は、当初 からレジスタ本数 が多 いRISC系 CPUではすでに実績 があった仕様 である。 - ^
詳細 についてはWindows NT系 の表 を参照 のこと。 - ^ “
旧 形式 のコードのための浮動 小数点 サポート (Visual C++)”. MSDNライブラリ. マイクロソフト. 2016年 1月 16日 閲覧 。 - ^ オレゴン
州 の ウィラメットバレー(Willamette Valley)を流 れるYamhill川 から来 た名前 である。 - ^ "Craig Barrett confirms 64 bit address extensions for Xeon. And Prescott", from The Inquirer
- ^ "A Roundup of 64-Bit Computing", from internetnews.com
- ^ オレゴン
州 を流 れるクラッカマス川 (Clackamas River)の名前 に由来 し、ウィラメット川 (Willamette River)の支流 である。 - ^ "Intel® 64 Architecture"
- ^ “
後藤 弘 茂 のWeekly海外 ニュース Intelの64bit拡張 技術 「Clackamas」がAMD64と互換 である謎 ”. pc.watch.impress.co.jp. 2023年 6月 4日 閲覧 。 - ^ “Intel、64bit
拡張 はAMD64互換 と発表 ”. pc.watch.impress.co.jp. 2023年 6月 4日 閲覧 。 - ^ 「BIOS and Kernel Developer’s Guide for AMD NPT Family 0Fh Processors」May 2006
版 にRevision F(DDR2対応 のSocket AM2版 CPU)の変更 点 として「CPUID Fn[0000_0001]_ECX CMPXCHG16B (bit 13) added.」と記載 されている。 - ^ 8080のPUSH PSW
命令 をLAHF / XCHG AL, AH / PUSH AXとエミュレートできる。 - ^ VMware Player 5.0 インストール
要件 - ^ PREFETCHW
命令 はメモリからデータをキャッシュラインにプリフェッチし、そのデータがあとで書 き換 えられることを想定 してあらかじめキャッシュラインの状態 をModified(書 き換 えあり)にする命令 である。データが書 き込 まれた時点 でModifiedに変更 するよりも速 く動作 することが期待 できる。 - ^ AMDのドキュメント「Cross-Vendor Migration」のPrefetch Instructionsにfamily 15/model 6/stepping 1
以降 のCPU、すなわちCedarMillコアからこの命令 をNOPとして処理 するようになったと説明 がある。 - ^ Microsoft
社 のCoreinfoツールでこれらの命令 のサポート状 況 を確認 できる。 - ^ MS
公式 サイトのWindows 8 のシステム要件 ページにあるWindows 8.1節 に「64 ビット PC に 64 ビット版 OS をインストールする場合 、プロセッサが CMPXCHG16b、PrefetchW、LAHF/SAHF をサポートしている必要 があります」と記載 されている。 - ^ Windows 10 システム
要件 - ^ “JWasm / Feature Requests / #10 MOVD/MOVQ in 64-bit (was: Another MMX code problem)”. 2020
年 6月 9日 閲覧 。 - ^ “43215 – x86-64: Nonstandard instruction "movd %xmm0, %rax"”. 2020
年 6月 9日 閲覧 。 - ^ AMD64 Architecture Programmer's Manual
- ^ Schulman, Andrew; Brown, Ralf D.; Maxey, David; Michels, Raymond J.; Kyle, Jim (1994). Undocumented DOS - A programmer's guide to reserved MS-DOS functions and data structures - expanded to include MS-DOS 6, Novell DOS and Windows 3.1 (2 ed.). Addison Wesley. ISBN 0-201-63287-X.
- ^ AMD・インテル
系 アーキテクチャではないが、モトローラMC68000ではアドレス空間 が24ビットだったがアドレスレジスタは32ビットだった。そのためアプリケーションなどが上位 8ビットを勝手 に使用 していたケースがあり、のちにMC68020でアドレス空間 が32ビット化 された際 に問題 になったことがあった。 - ^ しかし
実際 のところ、OS開発 者 はそのような事情 を知 っていてもアプリケーション開発 者 は知 らないのが現実 である。“5level-paging.txt”. 2020年 4月 5日 閲覧 。 “It's known that at least some JIT compilers use higher bits in pointers to encode their information. It collides with valid pointers with 5-level paging and leads to crashes.” - ^
Belousov, Konstantin (2020
年 8月 23日 ). “amd64 pmap: LA57 AKA 5-level paging”. FreeBSD Git repositories. The FreeBSD Project. 2024年 7月 14日 閲覧 。 “Since LA57 was moved to the main SDM document with revision 072,...” FreeBSDへLA57のサポートを追加 するコミットログ。 - ^ ある
場所 のメモリを書 き込 み可能 かつ実行 可能 の状態 に置 かず、書 き込 みのみか実行 のみかどちらか一方 だけに制限 すること。 - ^ “
清水 理 史 の「イニシャルB」第 145回 :64bit版 Windows「Windows XP Professional x64 Edition」登場 ”. bb.watch.impress.co.jp. 2023年 6月 4日 閲覧 。 - ^ Windows Internals FIFTH EDITION p.750, Mark E. Runssinovich, David A. Solomon, Microsoft Press ISBN 978-0-7356-2530-3
- ^ 『
図解 64ビットがわかる』技術評論社 、2006年 。ISBN 4774127353。162頁
参考 文献 [編集 ]
関連 項目 [編集 ]
- プロセッサ -
命令 セット - レジスタ (コンピュータ) - アドレッシングモード - 32ビット - x86 - IA-32
- 64ビット - x64 / IA-64
- Windows NT
系 #32ビットと64ビット