AMD64
出典: フリー百科事典『ウィキペディア(Wikipedia)』
AMD64は、AMD社の開発したx86アーキテクチャを拡張した64bit命令セットである。AMDのOpteron、Athlon 64、Turion 64、およびSempronの一部製品がこれに対応している。また、Intel社製品にもIntel 64の名称で採用されている。Intel64とAMD64の総称をx64という。
AMD64を最初に、また現在のところ唯一実装したプロセッサのアーキテクチャであるAMD-K8をAMD64と呼ぶ人もいるが、それは誤りである。
目次 |
[編集] 経緯
PC用の命令セットとして広く普及したx86は、マイクロアーキテクチャの革新とともに性能の向上を続け、サーバやワークステーションといったエンタープライズ市場でも広く受け入れられるに至った。マイクロプロセッサの黎明期から仕様の継続と改良によりその地位を築いたx86ではあるが、改良を加えるという開発は古い仕様を綿々と引き継ぐことに他ならならず、今となっては意味を持たなくなった旧態依然とした性質と性能の向上を阻害している部分を含んでいることは否めない。
Intelはx86を刷新する全く新しいIA-64命令セットをHewlett-Packardと共同で開発した。IA-64命令セットを実装したプロセッサItaniumを開発し発売に漕ぎつけたもののItaniumは当初の計画通りの性能は発揮できず、市場では苦戦を強いられていた。性能の思わしくないItanium、そしてIA-64命令セットの普及は芳しくない状況にあった。64bitのプロセッサを望む声は市場でも強く、Itaniumの他にも幾つかの64bit命令セットとそのプロセッサは存在するも広く普及したx86の64bit命令拡張を望む声が大きかった。しかしIA-64の普及の妨げになることを恐れIntelは、x86の64bit拡張には消極的であった。
64bit命令セットを実装するプロセッサはエンタープライズ市場などで高収益が望める。x86プロセッサ市場で現在でもIntelと競合する企業は唯一AMDのみであったが、従来のx86プロセッサのさらなる改良をおろそかには出来ず、その企業規模の違いからAMDには新たな64bit命令セットのプロセッサの開発は極めて困難であった。AMDは市場からの要望を汲み、x86の64bit拡張命令セットとして、AMD64を開発した。AMD64用のOSやアプリケーションのみならず、従来のx86(IA-32)のソフトウェアも利用が可能である。
IntelがAMD64と互換性の無いx86の64bit拡張を行うと企業規模の違いからAMD64ではなくIntelのそれが普及する可能性が非常に高く、AMDはIntelが独自の拡張を行うことを恐れていた。当初、AMDはAMD64にAMD色の少ないx86-64という名称で発表を行い、Intelの参画を促していた。元々IntelがIA-64の普及が困難になった場合の予備案として研究していたx86の64bit命令拡張は「Yamhill」という開発コードで呼ばれたもので、AMD64との互換性は低いものだったと考えられる。基本ソフトウェア市場の事実上の標準であるWindowsを擁するMicrosoftがWindowsの64bit拡張で、IntelとAMDとMicrosoftの3社間で秘密裏に政治的駆け引きが行われていることがAMDがIntelに対して起こした裁判記録で確認されている。IntelがAMD64を故意に無視しての独自の64bit拡張は立場の濫用として反トラスト法に抵触する恐れもあり、AMD64と互換性のある仕様も研究されていた。それはClackamasの開発コードで呼ばれていた。Microsoftが一本化を望んだことから、最終的にIntelは一時期IA-32eとの名称が与えられたClackamas案を自社製のx86プロセッサに実装し、EM64T (Extention Memory 64bit Technology)の正式名称として発表されるに至った。EM64Tは、その後Intel 64と改名された。
AMD64ならびにIntel 64に対応するWindowsをx64 Editionとマイクロソフトが命名したことから、x64がこの二つの命令セットの総称となっている。
Windows以外にも、Linux(Fedora CoreやSUSE、Gentoo、Turbo)などx64上で動作するOSも増えてきている。
なお、UNIX及びLinux,BSD系OSでは、x64に相当するアーキテクチャ名にx86_64というシンボルが与えられ普及している(従来の32bitアーキテクチャのシンボルはx86である)。
新しくx86より追加されたレジスタとしては、RAX-RDX,RBP,RSI,RDI,RSP,R8-R15,RIP,RFLAGSという64bitレジスタ等がある。
[編集] アーキテクチャ概要
AMD64 命令セットには、インテルのIA-32アーキテクチャのバランスの悪い特異な部分を、きれいで使いやすいものにするという目論見があった。また、同時に先行している 64ビットRISC 環境に似せたアーキテクチャにしようと考えて設計された。DEC Alpha AXP の設計者の一人 Dirk Meyer は AMD64 仕様の作成に関わった。彼や他のDEC出身者の経験がこのプロジェクトに生かされた。特筆すべき特長は以下のようなものである。
- レジスタの追加:汎用レジスタ(GPR)数はIA-32の8本から16本に増やされ、各レジスタのサイズも32ビットから64ビットに拡張された。ちなみにIBMのPowerPCアーキテクチャは32本のレジスタを持っているので、この汎用レジスタの少なさがPowerPCなど高性能RISCプロセッサと比較してIA-32の最も大きな欠点だった。(IA-32はレジスタが少ないためにコーディングに苦労することが少なくなかった) AMD64に最適化されたアプリケーションが出てくれば、レジスタ本数の増加によって性能向上が見込まれ、特に深いループを持った計算ばかり行うソフトウェアでその傾向が強いと見込まれる。さらに128ビットのXMMレジスタの本数も8本から16本に増やされた(Streaming SIMD命令で使われる)。
- アドレス空間の拡張:AMD64アーキテクチャでは現状の実装で256テラバイトのメモリを扱うことが出来る。IA-32では標準で4ギガバイトで、Microsoft Windowsの一般的なバージョンではアプリケーションはその半分までしか使えない。ただし、IA-32でもPentium Pro以降の実装で追加されたアドレス空間を36ビットに拡張する物理アドレス拡張使用時であれば64ギガバイトまで使える。AMD64は、IA-32の物理アドレス拡張36ビットをベースに、更に52ビットへ拡張したものであり(ただし現状の実装では48ビットまでしか使用できないようになっている)、将来の拡張で4エクサバイトまでの仮想空間をサポートできるようになっている。ページングを使えば Long モードを使わなくても拡張された物理メモリ空間を32ビットオペレーティングシステムでアクセスすることができる。32ビットモードで動作するプログラムは依然として仮想空間が4Gバイトに制限される。物理メモリ空間は、現状の実装で1テラバイト、アーキテクチャ上の最大では2エクサバイトまでに拡張される。
- 関連:2進接頭辞
- RIP相対データアクセス:プログラムカウンタ(RIP)相対でデータにアクセスすることができ、アドレス固定でコンパイルされない共有ライブラリのコードが最適化できる。また、共有ライブラリは仮想アドレス空間のどこにでもマッピングすることができる。
- SSE 命令:AMD64アーキテクチャでは明確にインテルの SSE と SSE2 を基本命令セットに組み込んでいる。SSE2 は x87 の 80ビット浮動小数点数から 32ビット/64ビットの浮動小数点数に置き換えたものである。SSE/SSE2命令セットは追加の8本のXMMレジスタを扱えるように拡張された。SSEとSSE2がAMD64命令セットに組み込まれていて、それが従来の x87 FPUやMMXや3DNow!の機能をカバーするものなので、マイクロソフトはWindows XP Professional x64 Editionでの64ビットプログラムではFPU/MMXレジスタをコンテキストスイッチの際にセーブしないようにした。これによって x87 FPU、MMX、3DNow!は廃れていき、命令セットが整理され、CPUのレイアウトがもっと整理される。おそらく、将来的には古い命令セットはマイクロプログラム方式でエミュレートされるか、(一部は)オペレーティングシステムでエミュレートされるようになるだろう。
[編集] 動作モード
動作モード | 必要なOS | 再コンパイルの必要性 | アドレスサイズの既定値 | オペランドサイズの既定値 | レジスタの拡張 | 典型的な汎用レジスタの幅 | |
---|---|---|---|---|---|---|---|
Long モード | 64ビット モード | 新しい 64ビットOS | 必要 | 64 | 32 | 有り | 64 |
互換モード | 不要 | 32 | 32 | なし | 32 | ||
16 | 16 | 16 | |||||
レガシー モード | プロテクト モード | 従来の 16/32ビットOS | 不要 | 32 | 32 | なし | 32 |
16 | 16 | ||||||
仮想8086 モード | 16 | 16 | 16 | ||||
リアル モード | 従来の 16ビットOS |
[編集] 動作モードの解説
このアーキテクチャでは、以下のふたつの動作モードに分類される。
- Long モード
- AMD64で拡張された部分に対応する動作モードである。これにはネイティブの64ビットモードと互換のための32ビットモードが含まれる。IA-32でのマイナーな動作モードはサポートされない。このモードは64ビットのオペレーティングシステムで使用される。
- 基本的な命令セットは同じなので、x86コードを実行しても性能が低下することはない。インテルのIA-64では32ビットコードの性能低下が問題となったが、これは命令セットが全く違うためにエミュレート実行していたためである。AMD64でも、32ビットのx86用アプリケーションを再コンパイルすれば(レジスタが増えているため)性能が向上する。
- Long モードを使うと、64ビットOSは 32ビットアプリケーションと64ビットアプリケーションを並行して実行できる。また、AMD64は 16ビットアプリケーションも実行することができる。しかし、マイクロソフトは WoW64サブシステムでの16ビットアプリケーションの実行機能がうまく機能しないため、Windows XP Professional x64 Edition での16ビットアプリケーション実行をサポートしていない。
- レガシーモード
- 16ビットOS(MS-DOS~Windows 3.1等)や32ビットOS(Windows 95~Windows XP等)で使われるモード。このモードでは、64ビットのプログラムは動作できない。IA-32互換。