コンテンツにスキップ

x64

出典: フリー百科事典『ウィキペディア(Wikipedia)』
X86-64から転送)

x64x86-64[ 1] x8664

AMDAMD64Intel 64IA-32eEM64TAMD64x86x86x64

Intel 64IA-6464x64x86

20234Intelx64LegacyLongX86-S[1]

20237Intelx64r16-r3116APX[2]APXCPUx64OSAPXOSx64CPU10CPUOS調32bitx8664bitx64x64APXIntelsde (Software Development Emulator)WindowsGCCLLVM CLangLinux(LLVM CLangver.18.1-rc1AVX10APX)

AMD64

[編集]

大元のAMD64は、AMDのOpteronAthlon 64Turion 64など最初に実装されたK8マイクロアーキテクチャ[3][4]とその後継製品のRyzenなどに実装されている。

開発経緯

[編集]

PCx86IA-3264IA-64x8632IA-64IA-3264AMDx8664IA-32x86-64[5]AMD64[6]2000820034[3]

仕様

[編集]

6432x86x6432[7]3232x86[8]x64x64

アーキテクチャの特徴

[編集]

AMDx8664使x86REX使16CPU 8028632(80386)使 DEC Alpha    AMD64DEC



 (GPR) IA-328 (EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP) R8R158163264IA-32AMD64128XMM816Streaming SIMD使IA-32使[9]



AMD6448(256)57(512)IA-32324GiBPentium Pro使64GiB4GiB32bitWindowsOS3GiB[10]AMD64LongIA-3248(52)4

2

RIP

 (RIP) 

SSE 

AMD64SSESSE2SSE2x878032/64SSE/SSE28XMMSSESSE2AMD64x87 FPUMMX3DNow!x64Windows64FPU/MMX[11]

No-Execute

NX(63)NXNo-Execute使

8028604G(32OS)使

AMDNo-Executex86No-ExecutePAE32OS使



x86使AMD64Long使86FS, GSLegacy3216x64

動作モード

[編集]
動作モード 必要なOS 再コンパイルの必要性 アドレスサイズの既定値 オペランドサイズの既定値 レジスタの拡張 典型的な汎用レジスタの幅
Longモード 64ビット モード 新しい 64ビットOS 必要 64 32 有り 64
互換モード 不要 32 32 なし 32
16 16 16
Legacyモード プロテクト モード 従来の 16/32ビットOS 不要 32 32 なし 32
16 16
仮想8086 モード 16 16 16
リアル モード 従来の 16ビットOS

このアーキテクチャは、LongモードとLegacyモードという二つの動作モードを持つ。

Longモード

[編集]

AMD64で拡張された部分に対応する動作モードである。これにはネイティブの64ビットモードと互換のための32ビットモードが含まれる。IA-32でのマイナーな動作モードはサポートされない。このモードは64ビットのOSで使用される。

基本的な命令セットは同じなので、x86コードを実行しても性能が低下することはない。インテルのIA-64では32ビットコードの性能低下が問題となったが、これは命令セットが全く違うためにエミュレート実行していたためである。

Longモードを使うと、64ビットOSは 32ビットアプリケーションと64ビットアプリケーションを並行して実行できる。また、AMD64は 16ビットのアプリケーションも実行することができる。しかし、Windowsの16ビットアプリケーション (Win16) のサポートに欠かせない仮想86モードは使用できないため、マイクロソフトは WOW64サブシステムでの16ビットアプリケーションの実行機能の実装を断念し、Windows XP Professional x64 Edition でのWin16アプリケーション実行をサポートしていない。これはWindows Vista以降のx64版にも引き継がれる制限となっている。

Legacyモード

[編集]

このモードは、16ビットOS(MS-DOS - Windows 3.1等)や32ビットOS(Windows 95 - Windows XP等)で使用される。このモードにおいて、プロセッサは基本的にx86の32ビットプロセッサとして振る舞い、16ビットと32ビットのコードのみが実行可能である。Legacyモードは、仮想アドレス空間の4GB制限のような32ビットの仮想アドレッシング上の上限がある[7]。64ビットのプログラムは、Legacyモードで起動することができない。

AMD64を採用するCPU

[編集]

次のプロセッサは、AMD64を実装する:

Intel 64

[編集]

Intel 64は、IA-32アーキテクチャの64ビット拡張であり、インテルによるAMD64の実装である。

開発経緯

[編集]

AMDx86x64AMDAMD64x8664

Yamhill[12]20042IDF[13][14]

AMD64 IDFCT(Clackamas Technology[15])IA-32e(IA-32 extensions)20044 EM64T(Extended Memory 64 Technology)2006727EM64TIntel 64[16]

Intel 64を採用するCPU

[編集]

Intel 64Nocona20046XeonXeon Pentium 4 Pentium 4Intel 64PrescottIntel 64使PrescottE0model FAMD64NXIntel 64eXecute Disable(XD)NoconaXeon8xx/6xx/5x6/5x1/3x6/3x1CPUIntel 64使Intel Core 2Intel AtomIntel 64

Intel 64CPU

AMD64とIntel 64の差異

[編集]

AMD64Intel 64[17][18]

差異

[編集]

Intel 64SYSCALL, SYSRET64SYSENTER, SYSEXIT3264

AMD64SYSCALL, SYSRET3264SYSENTER, SYSEXIT32

Intel 64AMD64SYSCFG, TOP_MEM, TOP_MEM2MSR(model-specific registers)

Intel 646466h AMD6416

BSF, BSR0Intel 64x86(undefined)AMD64

Intel VT-xAMD-V

Second Level Address TranslationIntel EPTAMD RVI

以前あった差異

[編集]

AMD64CMPXCHG16B16(128)CPU使Windows16TB使Socket AM2AMD64[19]

AMD64, Intel 6464LAHF, SAHF2AH8CPU80808086[20]64使PUSH/POPVMware2[21]x87使

Intel 64PREFETCHW[22]AMD3DNow!Pentium 4CedarMillIntel 64NOP(No Operation)[23]NOPIntel 64MicrosoftCoreinfo[24]PREFETCHW2013Silvermont2014BroadwellPREFETCHW
3Windows 8.1Windows 1064AMD64Intel 64CPU[25][26]

Intel 64XDAMD64NXWindows 83264

その他

[編集]
  • POPFQ命令には、REXプリフィックスは必要ない。Intel社のドキュメントにはこのことが正しく記載されていなかった。
  • 同じオペコードに対するMOVDとMOVQの割り当てがIntel 64のドキュメントとAMD64のドキュメントで異なる。一方のドキュメント通りのアセンブリソースがアセンブルできない[27]、逆アセンブル結果が想定と異なる[28]といったことが起こり得る。

命令セット

[編集]

REX

REX使
64

R8R15XMM

64RSP, RBP, RDI, RSI078SPL, BPL, DIL, SILREX8 AH, BH, CH, DH

64REX


PUSH, POP

ENTER, LEAVE



3232(3263)

使

168

NOP(No Operation: 90h)XCHG EAX, EAX[29]64RAX

CMOV(Conditional Move)643232



64(Immediate value)3264使MOV64使



64(displacement)3264使RAXMOV64使

64x86

x866464
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, SAHFAMD64, Intel 6464x86

64x86


ARPL (Adjust Requestor Privilege Level)64MOVSXD

1INC, DEC64REX2INC, DEC64使

64LDS, LESAVXVEXVEX23211xxxxxxAVX32使Windows NTDOSC4h C4h(LES AX, SP)8632使[30]AVX86

64BOUNDAVX-512EVEXEVEX23211xxxxxxAVX-51232使

メモリ管理

[編集]
コードセグメントディスクリプタ
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)

6464264(16EB)使使64AMDAMD6448使486347使(canonical form)000007FFF'FFFFFFFFFFFF8000'00000000FFFFFFFF'FFFFFFFF256TB使

64使使OS使16使48[31][32]

2020957使[33]512PB57-63使56

Long(page translation)

Long(PAE)LongCR4PAE1AMD64PDPE(page-directory-pointer entry), PDE(page-directory entry), PTE(page-table entry)PML4(page-map level-4)9PAECR4PSE(page-size extensions)CPUID8000_0001hEDX26CPU1Gbyte

57PML4PML5(page-map level-5)9

4Kbyte PML5(*), PML4, PDPE, PDE, PTE4Kbyte

2Mbyte PML5(*), PML4, PDPE, PDE2Mbyte

1Gbyte(*) PML5(*), PML4, PDPE1Gbyte

(*) CPU使

特権レベル

[編集]

80286x860,1,2,34x64644032使

(CALL far, RET)

80286(0,1,2,3)6464bit使

RISCRISCWindows NT使INTPentium IISYSENTER, SYSEXIT使

(SYSCALL, SYSRET)

30AMD64x86SYSENTER, SYSEXITAMDSYSCALL, SYSRETSYSCALLCS(), SS(), RIP()MSRRSP()SWAPGS使GSGSGSRSP

SYSCALL0Fh 05hSYSRET0Fh 07hx86LOADALL

マイクロアーキテクチャの世代

[編集]

2020 AMDIntelRed HatSUSE x86-64  x86-64-v2x86-64-v3x86-64-v4 3  () 
CPU microarchitecture levels
Level CPU features Example instruction Supported processors
x86-64
(x86-64-v1)
CMOV cmov

2003年頃の初期のAMD K8以降など
すべてのx86-64 CPU

CX8 cmpxchg8b
FPU fld
FXSR fxsave
MMX emms
OSFXSR fxsave
SCE syscall
SSE cvtss2si
SSE2 cvtpi2pd
x86-64-v2 CMPXCHG16B cmpxchg16b

主に2008年頃のIntel Nehalem世代以降
Intel Nehalem and newer Intel "big" cores
Intel (Atom) Silvermont and newer Intel "small" cores
AMD Bulldozer and newer AMD "big" cores
AMD Jaguar
VIA Nano and Eden "C"

LAHF-SAHF lahf
POPCNT popcnt
SSE3 addsubpd
SSE4_1 blendpd
SSE4_2 pcmpestri
SSSE3 pshufb
x86-64-v3 AVX vzeroall

主に2013年頃のIntel Haswell世代以降
Intel Haswell以降
Intel (Atom) Gracemont以降
AMD Excavator以降

AVX2 vpermd
BMI1 andn
BMI2 bzhi
F16C vcvtph2ps
FMA vfmadd132pd
LZCNT lzcnt
MOVBE movbe
OSXSAVE xgetbv
x86-64-v4 AVX512F kmovw

主に2017年頃のIntel Intel Skylake-X世代以降でAVX512が有効な場合
Intel Skylake以降
AMD Zen 4 以降

AVX512BW vdbpsadbw
AVX512CD vplzcntd
AVX512DQ vpmullq
AVX512VL N/A

オペレーティングシステムの互換性と扱い

[編集]

次のオペレーティングシステムは、x64アーキテクチャのLongモードをサポートする。

BSD

[編集]

FreeBSD

[編集]

FreeBSDは、2003年6月の5.1-RELEASEで実験的なアーキテクチャーとして、amd64という名前でx64をサポートした。2004年1月の5.2-RELEASEでは公式なアーキテクチャーとして対応した。それ以来、FreeBSDでは、amd64をTier 1プラットフォームとしている。

NetBSD

[編集]

x64アーキテクチャーのサポートは2001年6月19日にNetBSDのソースツリーに初めてコミットされた。2004年12月9日にリリースされたNetBSD 2.0では、NetBSD/amd64としてソースツリーに完全に統合され、公式なポートになった。32ビットのシステムコールのためのnetbsd-32カーネル互換レイヤーを通して、64ビットモードでの32ビットコードの実行がサポートされている。 NXビットは、実行不可のスタックとヒープを提供するために、使用されている。

OpenBSD

[編集]

OpenBSDは2004年5月1日にリリースされたOpenBSD 3.5でAMD64をサポートした。ソースツリー内でのAMD64サポートの完全な実装は、実際のAMD64のハードウェアのリリースより前に行われていた。これはhackathonプロジェクトのためにAMDがいくつかのハードウェアを貸し出したためである。OpenBSDの開発者は、W^X (Write XOR Execute)[34] 機能が容易に実装できるNXビットがあるため、AMD64プラットフォームを気に入った。 OpenBSDのAMD64ポートは、Intel 64でも走る。しかし、初期のIntel 64にはNXビットがないため、これらのIntelのCPUではW^X機能は使えない。後にIntelはXDビットの名前で、NXビットを追加している。

Linux

[編集]

LinuxはLongモードでx64アーキテクチャを動作させる初めてのオペレーティングシステム・カーネルとなった。これは、実際のAMD64のハードウェアのリリースより前の2001年、kernel 2.4にて始められた。Linuxは32ビット実行可能ファイルの実行に関して後方互換を保っている。これにより、32ビットプログラムの使用を継続しながらLongモード用にプログラムを再コンパイルすることが可能になった。

64ビット版Linuxでは、個々のプロセスで128TBの仮想アドレス空間と64TBの物理メモリが使用できる。(ただし、これは、CPUやPCシステムにより制限される)

Mac OS X

[編集]

Mac OS X v10.4のうちv10.4.7及びそれ以降のバージョンは、64ビットのインテルベースマシン上でPOSIX及び数学ライブラリを用いて64ビットコマンドラインツールが起動する。Mac OS X v10.4において、これ以外のライブラリ、フレームワークは、64ビットアプリケーションをサポートしない。このカーネル、およびカーネル拡張は32ビットのみである。

Mac OS X v10.5は、64ビットのPowerPCマシン同様に、64ビットのインテルベース・マシンにおいてCocoa, Quartz, OpenGL, そしてX11を用いた64ビットのGUIアプリケーションをサポートした。全ての非GUIライブラリとフレームワークは、このプラットフォームで64ビットアプリケーションをサポートしている。このカーネル、そして全てのカーネル拡張は、32ビットのみである。

Mac OS X v10.6は、64ビットカーネルをサポートしたMac OS Xの最初のバージョンである。しかし、最初のリリース(v10.6.0)では、全ての64ビットコンピュータがサポートされたわけではなかった。64ビットカーネルは、32ビットカーネル同様に32ビットアプリケーションをサポートし、それぞれのカーネルも同様に64ビットアプリケーションをサポートした。32ビットアプリケーションは、いずれのカーネルにおいても仮想アドレス空間が4GBであるという制限があった。 64ビットカーネルは32ビットカーネル拡張をサポートせず、同様に32ビットカーネルは64ビットカーネル拡張をサポートしない。

OS X Mountain Lionは、64ビットカーネルのみサポートするが、32ビット、64ビットの両方のアプリケーションをサポートする。

Macは、x86/x64の32ビット・64ビットだけでなく、PowerPCとインテル・アーキテクチャのサポートなど、アーキテクチャの互換性問題が複雑に入り組んでいた為、ユーザが混乱しない為にOSレベルでユニバーサルバイナリなどの仕組みが整えられた。これは、一つのアプリケーションファイル、またはライブラリファイルに対して複数のコードをパッケージし、実行時に最適なバージョンが選択されるというものである。

Windows

[編集]

Microsoft Windows200546Windows XP Professional x64 Edition()[35]Windows Server 2003 x64 Editionx64x86Windows XP  5.1.2600Windows Server  5.2.3790 x64 5.2.3790.1830 SP1

Windows Vista20071Windows 720097Windows 8201210OSx86 64(x64) x64Itanium 

Windows Server 200820082x86 x64 IA-64ItaniumWindows Server 2008 R2 x86 x64  Itanium Itanium Windows Server 2012  x64 

x64Windows

18TBWindows 8128TBWindows 8.1x64"large address aware"使使32Windows2GB

8TBWindows 8128TBWindows 8.132Windows2GB使Windows 8Windows256TB16TB使AMD64CMPXCHG16B[36]

WOW64使32(.exe)(.dll)32"large address aware"64Windows4GB使32Windows2GB/3GBWindows"large address aware"3GB/3GB32Windows64Windows32x6464Windows

3264"large address aware"2GB

Windows XP/Vista128GB, Windows 7192GBWindows 8512GBWindows Server 20031TBWindows Server 20082TBWindows Server 20124TBRAM使

LLP64intlong32long long6464

643264Windows326464Windows

16Windows(Win16)DOS64Windows648664WindowsDOS(NTVDM)

NX(No Execute)32WindowsPAE使

x86Windows NTFS使x64GS2(NT_TIB)(KPCR)GS:0x64WindowsAMDLongFS, GS使

Microsoft Visual Studio 200564Windows6432Windows64WindowsWOW6432[37]

脚注

[編集]
  1. ^ 大学など学術の世界や、オープンソースのプロジェクトなどでは、(互換関係が明白で、特定メーカー名も入っていない名称なので)「x86-64」と呼ぶことを好み、AMD社やAMDと関連が深い会社では「AMD64」と呼ぶことを好み、マイクロソフト社やサン・マイクロシステムズ(後にオラクルに買収された会社)は短く「x64」と呼ぶことを好む[1][2]


(一)^  (2023522). IntelX86-S8086. PC Watch. 202364

(二)^ Introducing Intel® Advanced Performance Extensions (Intel® APX). Intel (202435). 202435

(三)^ abAMDOpteron. pc.watch.impress.co.jp. 202364

(四)^ AMDAthlon 64. pc.watch.impress.co.jp. 202364

(五)^ AMDX86-64. pc.watch.impress.co.jp. 202364

(六)^ Weekly. pc.watch.impress.co.jp. 202364

(七)^ abAMD Corporation (20115). Volume 2: System Programming (pdf). AMD64 Architecture Programmer's Manual.  AMD Corporation. 20111029

(八)^ IBM Corporation (200796). IBM WebSphere Application Server 64-bit Performance Demystified. p. 14. 201049 "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."

(九)^ RISCCPU

(十)^ Windows NT

(11)^  (Visual C++). MSDN.  . 2016116

(12)^  (Willamette Valley)Yamhill

(13)^ "Craig Barrett confirms 64 bit address extensions for Xeon. And Prescott", from The Inquirer

(14)^ "A Roundup of 64-Bit Computing", from internetnews.com

(15)^ (Clackamas River)(Willamette River)

(16)^ "Intel® 64 Architecture"

(17)^ Weekly Intel64bitClackamasAMD64. pc.watch.impress.co.jp. 202364

(18)^ Intel64bitAMD64. pc.watch.impress.co.jp. 202364

(19)^ BIOS and Kernel Developers Guide for AMD NPT Family 0Fh ProcessorsMay 2006 Revision FDDR2Socket AM2CPUCPUID Fn[0000_0001]_ECX CMPXCHG16B (bit 13) added.

(20)^ 8080PUSH PSWLAHF / XCHG AL, AH / PUSH AX

(21)^ VMware Player 5.0 

(22)^ PREFETCHWModifiedModified

(23)^ AMDCross-Vendor MigrationPrefetch Instructionsfamily 15/model 6/stepping 1CPUCedarMillNOP

(24)^ MicrosoftCoreinfo

(25)^ MSWindows 8 Windows 8.164PC64OS CMPXCHG16bPrefetchWLAHF/SAHF 

(26)^ Windows 10 

(27)^ JWasm / Feature Requests / #10 MOVD/MOVQ in 64-bit (was: Another MMX code problem). 202069

(28)^ 43215  x86-64: Nonstandard instruction "movd %xmm0, %rax". 202069

(29)^ AMD64 Architecture Programmer's Manual

(30)^ 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.

(31)^ AMDMC6800024328使MC6802032

(32)^ OS5level-paging.txt. 202045 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.

(33)^  Belousov, Konstantin (2020823). amd64 pmap: LA57 AKA 5-level paging. FreeBSD Git repositories.  The FreeBSD Project. 2024714 Since LA57 was moved to the main SDM document with revision 072,... FreeBSDLA57

(34)^ 

(35)^  14564bitWindowsWindows XP Professional x64 Edition. bb.watch.impress.co.jp. 202364

(36)^ Windows Internals FIFTH EDITION p.750, Mark E. Runssinovich, David A. Solomon, Microsoft Press ISBN 978-0-7356-2530-3

(37)^ 642006ISBN 4774127353162

参考文献

[編集]

関連項目

[編集]

外部リンク

[編集]