Warning : Undefined variable $type in /home/users/1/sub.jp-asate/web/wiki/extensions/HeadScript/HeadScript.php on line 3
Warning : "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /home/users/1/sub.jp-asate/web/wiki/includes/json/FormatJson.php on line 297
Warning : Trying to access array offset on value of type bool in /home/users/1/sub.jp-asate/web/wiki/includes/Setup.php on line 660
Warning : session_name(): Session name cannot be changed after headers have already been sent in /home/users/1/sub.jp-asate/web/wiki/includes/Setup.php on line 834
Warning : ini_set(): Session ini settings cannot be changed after headers have already been sent in /home/users/1/sub.jp-asate/web/wiki/includes/session/PHPSessionHandler.php on line 126
Warning : ini_set(): Session ini settings cannot be changed after headers have already been sent in /home/users/1/sub.jp-asate/web/wiki/includes/session/PHPSessionHandler.php on line 127
Warning : session_cache_limiter(): Session cache limiter cannot be changed after headers have already been sent in /home/users/1/sub.jp-asate/web/wiki/includes/session/PHPSessionHandler.php on line 133
Warning : session_set_save_handler(): Session save handler cannot be changed after headers have already been sent in /home/users/1/sub.jp-asate/web/wiki/includes/session/PHPSessionHandler.php on line 140
Warning : "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /home/users/1/sub.jp-asate/web/wiki/languages/LanguageConverter.php on line 773
Warning : Cannot modify header information - headers already sent by (output started at /home/users/1/sub.jp-asate/web/wiki/extensions/HeadScript/HeadScript.php:3) in /home/users/1/sub.jp-asate/web/wiki/includes/Feed.php on line 294
Warning : Cannot modify header information - headers already sent by (output started at /home/users/1/sub.jp-asate/web/wiki/extensions/HeadScript/HeadScript.php:3) in /home/users/1/sub.jp-asate/web/wiki/includes/Feed.php on line 300
Warning : Cannot modify header information - headers already sent by (output started at /home/users/1/sub.jp-asate/web/wiki/extensions/HeadScript/HeadScript.php:3) in /home/users/1/sub.jp-asate/web/wiki/includes/WebResponse.php on line 46
Warning : Cannot modify header information - headers already sent by (output started at /home/users/1/sub.jp-asate/web/wiki/extensions/HeadScript/HeadScript.php:3) in /home/users/1/sub.jp-asate/web/wiki/includes/WebResponse.php on line 46
Warning : Cannot modify header information - headers already sent by (output started at /home/users/1/sub.jp-asate/web/wiki/extensions/HeadScript/HeadScript.php:3) in /home/users/1/sub.jp-asate/web/wiki/includes/WebResponse.php on line 46
http:///mymemo.xyz/wiki/api.php?action=feedcontributions&user=118.238.204.231&feedformat=atom
miniwiki - 利用者の投稿記録 [ja]
2024-05-16T11:49:52Z
利用者の投稿記録
MediaWiki 1.31.0
X64
2019-03-05T08:48:28Z
<p>118.238.204.231: /* 動作モード */</p>
<hr />
<div>{{小文字}}<br />
'''x64'''または'''x86-64'''とは、[[x86]]アーキテクチャを[[64ビット]]に拡張した[[命令セット|命令セットアーキテクチャ]]。<br />
<br />
実際には、[[アドバンスト・マイクロ・デバイセズ|AMD]]が発表した'''AMD64'''命令セット、続けて[[インテル]]が採用した'''Intel 64'''命令セット(かつて'''IA-32e'''または'''EM64T'''と呼ばれていた)などを含む、各社のAMD64互換命令セットの総称である。x86命令セットと互換性を持っていることから、広義にはx86にx64を含む場合がある。<br />
<br />
なお、インテルはIntel 64の他に[[IA-64]]の名前で64ビット命令セットアーキテクチャを開発・展開しているが、これはx64命令セット、x86命令セットのいずれとも互換性がない。<br />
<br />
== 概要 ==<br />
この命令セットアーキテクチャは、AMDがx86-64の名前で仕様を発表したものが元になっている。AMDは2003年にAMD64と名前を改めて実装しており<ref name="inq-amd64">{{cite web|last=Rust|first=Adamson|title=AMD bans use of Hammer word, X86-64|url=http://www.theinquirer.net/inquirer/news/1043982/amd-bans-use-of-hammer-word-x86-64|work=The Inquirer|accessdate=2010-10-30 |date=2003-04-24 }}</ref>、[[インテル]]もAMD64互換命令セットをEM64T(後にIntel 64と改称)として実装した。のちに[[VIA Technologies|VIA]]がこれに続いた。<br />
<br />
このような経緯もあり、ソフトウェアの対応命令セットの表記には、採用時期またはマイクロプロセッサベンダーとの立場などから、x86-64, x86_64, x64, AMD64, IA-32e, EM64T, Intel 64など複数の名称が用いられている。実際には、これらは全てAMD64(x86-64)を源流とする互換命令セットを指している。<br />
<br />
特に「x64」の名称はマイクロプロセッサベンダーに対して中立的な用語として用いられる傾向がある。著名な例では[[オラクル (企業)|オラクル]]に買収された[[サン・マイクロシステムズ]]<ref name="solaris-x64">{{cite web|title=Solaris 10 on AMD Opteron|url=http://www.oracle.com/technetwork/server-storage/solaris/overview/solaris10amdopteron-jsp-140575.html|publisher=Oracle|accessdate=2010-12-09 }}</ref>や、[[マイクロソフト]]<ref name="ms-x64">{{cite web|title=Microsoft 64-Bit Computing|url=http://www.microsoft.com/windowsserver2008/en/us/64bit-computing.aspx|publisher=Microsoft|accessdate=2010-12-09}}</ref>なども「x64」の用語を使用している。<br />
<br />
== AMD64 ==<br />
AMD64は、AMDの[[Opteron]]、[[Athlon 64]]、[[Turion 64]]など最初に実装されたK8マイクロアーキテクチャとその後継製品に実装されている。<br />
<br />
=== 開発経緯 ===<br />
PC用アーキテクチャとして広く普及したx86は、[[半導体]]の製造技術と[[マイクロアーキテクチャ]]の革新とともに性能の向上を続け、サーバやワークステーションといったエントリークラスのエンタープライズ市場でも広く受け入れられるに至った。しかし、[[IA-32]]の性能向上によって自社開発の64ビットアーキテクチャである[[IA-64]]との競合を懸念したインテルは、x86の拡張を32ビットアーキテクチャの範囲に留めてIA-64との棲み分けを図った。これに対し、市場からは広く普及したIA-32アーキテクチャと互換性を保ちつつ64ビットに拡張した、よりコストパフォーマンスに優れたエンタープライズ製品の登場が待ち望まれていた。高収益を望めるエンタープライズ市場への進出を図っていたAMDはそうした需要に応えて、x86の64ビット拡張アーキテクチャとして、従来のIA-32のソフトウェアも利用が可能な命令セットとしてx86-64を発表した。その後の実際の製品発表でAMD64と改称された。この計画は、2000年8月に発表され、最初のプロセッサは2003年4月に出荷された。<br />
<br />
=== 仕様 ===<br />
64ビットの[[レジスタ (コンピュータ)|汎用レジスタ]]を持ち、[[32ビット]]のx86より広い物理および仮想の[[アドレス空間]]をサポートするため、[[プログラム (コンピュータ)|プログラム]]が大きい[[データ]]をより容易に操作する事が可能である。またx64は[[32ビット]]のプログラムコードと完全な[[後方互換]]性を持つ<ref name="amd-24593">{{cite web<br />
|url=http://support.amd.com/us/Embedded_TechDocs/24593.pdf<br />
|title =Volume 2: System Programming<br />
|author =AMD Corporation<br />
|date =May 2011<br />
|work =AMD64 Architecture Programmer's Manual<br />
|publisher =AMD Corporation<br />
|format =pdf<br />
|accessdate =2011-10-29<br />
}}</ref>。全ての32ビットの命令セットが、[[エミュレータ|エミュレーション]]を介在せずに[[ハードウェア]]上に実装されているため、32ビットのx86[[実行ファイル]]は、互換性上あるいは性能上の損失なしに稼動できる<ref name="x86-compat-perf">{{cite web<br />
|url=ftp://ftp.software.ibm.com/software/webserver/appserv/was/64bitPerf.pdf<br />
|title=IBM WebSphere Application Server 64-bit Performance Demystified<br />
|page=14<br />
|quote="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."<br />
|author=IBM Corporation<br />
|date=2007-09-06<br />
|accessdate=2010-04-09}}</ref>。ただし、既存の[[アプリケーションソフトウェア]]が性能向上を可能にする[[プロセッサ]]設計上の新機能を使用するには、再コード化が必要である。<br />
<br />
=== アーキテクチャの特徴 ===<br />
AMDがx86命令セットを64ビット化する際に使ったのは、x86命令の先頭にプリフィックスをつけるという手法である([[#命令セット|REXプリフィックス]]と呼ばれる)。プリフィックスを使うのは、インテルが16ビットCPU [[Intel 80286|80286]]を32ビット化([[Intel 80386|80386]])するときに使った手法でもある。<br />
[[DEC Alpha]] の設計者の一人 [[ダーク・メイヤー]] が AMD64仕様の作成に関わり、彼をはじめとする[[ディジタル・イクイップメント・コーポレーション|DEC]]出身者の経験がこのプロジェクトに活かされた。特筆すべき点は以下のようなものである。<br />
<br />
; [[レジスタ (コンピュータ)|レジスタ]]の追加と拡張<br />
: 汎用レジスタ (GPR) 数はIA-32の8本 (EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP) に更にR8〜R15の8本を追加して16本に増やされ、各レジスタのビット幅も32ビットから64ビットに拡張された。IA-32は汎用レジスタが少ないことから[[コンパイラ]]による最適化に限界があり、これが最も大きな欠点とされた。AMD64に最適化されたアプリケーションでは、レジスタ本数の増加によって性能向上が見込まれ、特に深いループを持った演算主体のソフトウェアでその傾向が強いと見込まれる。さらに128ビットのXMM<!-- MMXと混同しないように注意。MMXは固有のハードウェアレジスタを持たず、FPUにマップされる。ここで言っているのはSSE(XMM)レジスタ -->レジスタの本数も8本から16本に増やされた([[ストリーミングSIMD拡張命令|Streaming SIMD]]命令で使われる)。<br />
; アドレス空間の拡張<br />
: AMD64アーキテクチャでは、現状の実装で48ビットのアドレス空間を持ち、256テラバイトまでのメモリを扱うことが出来る。IA-32アーキテクチャにおいて初期のプロセッサでは、アドレス空間は32ビットで表現できる4GiBに制約され、[[Pentium Pro]]以降の実装で追加された[[物理アドレス拡張]]機能を使用することで64GiBのメモリを接続できるが、1プロセスで利用可能なメモリ空間はやはり4GiBに制約された。32bit版Windowsシリーズにおいては、OSの仕様でアプリケーションが利用可能なメモリはおよそ3GiBに制約される<ref>詳細については[[Windows NT系]]の[[Windows NT系#32ビットと64ビット|表]]を参照のこと。</ref>。これに対しAMD64のLongモードでは、IA-32の物理アドレス拡張をベースに、論理アドレス空間を48ビットへ拡張し(現状物理アドレス空間は52ビット)、将来の拡張で4エクサバイトまでの仮想空間をサポートできるようになっている。<br />
: 関連:[[2進接頭辞]]<br />
; RIP相対データアクセス<br />
: プログラムカウンタ (RIP) 相対でデータにアクセスすることができ、[[リロケータブル]]な共有ライブラリのコードを作成できる。また、共有ライブラリを仮想アドレス空間のどこにでも配置することができる([[位置独立コード]])。<br />
; SSE 命令<br />
: AMD64アーキテクチャでは明確にインテルの[[ストリーミングSIMD拡張命令#SSE|SSE]]と[[ストリーミングSIMD拡張命令#SSE2|SSE2]]を基本命令セットに組み込んでいる。SSE2はx87の80ビット浮動小数点数から 32ビット/64ビットの浮動小数点数に置き換えたものである。SSE/SSE2命令セットは追加の8本のXMMレジスタを扱えるように拡張された。SSEとSSE2がAMD64命令セットに組み込まれており、それが従来のx87 [[FPU]]や[[MMX]]や[[3DNow!]]の機能をカバーする。x64版Windowsでの64ビットプログラムでは、FPU/MMXレジスタを[[コンテキストスイッチ]]の際に保存しないようにすると噂されたが、実際には保存されるようになっている<ref>{{Cite web|url=https://msdn.microsoft.com/ja-jp/library/a32tsf7t.aspx|title=旧形式のコードのための浮動小数点サポート (Visual C++)|accessdate=2016-01-16|work=MSDNライブラリ|publisher=マイクロソフト}}</ref>。<br />
; No-Executeビット<br />
: NXビット(ページテーブルエントリのビット63)は仮想アドレス空間のどのページが実行可能か、実行不可かを指定することができる。NXビットがセットされたページにあるコードを実行しようとするとメモリアクセス違反となり、実行できない。これは、リードオンリーページへの書き込みを実行しようとしてもできないことと似ている。No-Execute機能は、ウイルスなどがバッファーオーバランなどを使用して、オペレーティングシステムを乗っ取ろうとすることを難しくする。<br />
:類似の機能は、セグメントの属性として80286以降のプロセッサーに存在している。しかし、近代的なオペレーティングシステムではセグメント機能は古いものと見なされ、セグメントのベースを0、リミットを4Gバイト(32ビットOSの場合)に設定することにより、実質的にセグメントを使用していない。<br />
:AMDはリニアアドレッシングモードでNo-Execute機能を実装した最初のx86ベンダーである。No-Execute機能は、PAEを有効にすれば、32ビットOSでも使用可能である。<br />
; 古い機能の削除<br />
: x86アーキテクチャーにある多くのシステムプログラミング機能は近代的なオペレーティングシステムでは使用されておらず、それら古い機能は、AMD64のLongモードにはない。それらは、セグメントアドレッシング、[[Task state segment|タスクステートセグメント]]を使用したタスクスイッチ、[[仮想86モード]]などである(ただし、FS, GSセグメントは、オペレーティングシステム構造体へのエクストラベースポインタとして残されている)。これらの古い機能は、Legacyモードでは依然として、完全に実装されているので、これまでの32ビット、16ビットオペレーティングシステムは、修正なしにx64プロセッサー上で動作する。<br />
<br />
=== 動作モード ===<br />
{| class="wikitable"<br />
|- bgcolor="#cccccc"<br />
! colspan="2" | 動作モード<br />
! 必要な[[オペレーティングシステム|OS]]<br />
! 再コンパイルの必要性<br />
! アドレスサイズの既定値<br />
! オペランドサイズの既定値<br />
! レジスタの拡張<br />
! 典型的な汎用レジスタの幅<br />
|- align="center"<br />
| rowspan="3" | Longモード<br />
| 64ビット モード<br />
| rowspan="3" | 新しい 64ビットOS<br />
| 必要<br />
| 64<br />
| 32<br />
| 有り<br />
| 64<br />
|- align="center"<br />
| rowspan="2" | 互換モード<br />
| rowspan="2" | 不要<br />
| 32<br />
| 32<br />
| rowspan="2" | なし<br />
| 32<br />
|- align="center"<br />
| 16<br />
| 16<br />
| 16<br />
|- align="center"<br />
| rowspan="4" | Legacyモード<br />
| rowspan="2" | プロテクト モード<br />
| rowspan="3" | 従来の 16/32ビットOS<br />
| rowspan="4" | 不要<br />
| 32<br />
| 32<br />
| rowspan="4" | なし<br />
| rowspan="2" | 32<br />
|- align="center"<br />
| 16<br />
| 16<br />
|- align="center"<br />
| 仮想8086 モード<br />
| rowspan="2" | 16<br />
| rowspan="2" | 16<br />
| rowspan="2" | 16<br />
|- align="center"<br />
| リアル モード<br />
| 従来の 16ビットOS<br />
|}<br />
<br />
このアーキテクチャは、LongモードとLegacyモードという二つの動作モードを持つ。<br />
<br />
==== Longモード ====<br />
AMD64で拡張された部分に対応する動作モードである。これにはネイティブの64ビットモードと互換のための32ビットモードが含まれる。[[IA-32]]でのマイナーな動作モードはサポートされない。このモードは64ビットのOSで使用される。<br />
<br />
基本的な命令セットは同じなので、x86コードを実行しても性能が低下することはない。インテルの[[IA-64]]では32ビットコードの性能低下が問題となったが、これは命令セットが全く違うためにエミュレート実行していたためである。<br />
<br />
Longモードを使うと、64ビットOSは 32ビットアプリケーションと64ビットアプリケーションを並行して実行できる。また、AMD64は 16ビットのアプリケーションも実行することができる。しかし、Windowsの16ビットアプリケーション (Win16) のサポートに欠かせない仮想86モードは使用できないため、マイクロソフトは [[WOW64]]サブシステムでの16ビットアプリケーションの実行機能の実装を断念し、[[Microsoft Windows XP|Windows XP]] Professional x64 Edition でのWin16アプリケーション実行をサポートしていない。これは[[Microsoft Windows Vista|Windows Vista]]以降のx64版にも引き継がれる制限となっている。<br />
{{Main|Windows_NT系#Win16サブシステム|仮想DOSマシン#NT系での仮想DOSマシン}}<br />
<br />
==== Legacyモード ====<br />
このモードは、16ビットOS([[MS-DOS]] - [[Microsoft Windows 3.x|Windows 3.1]]等)や32ビットOS([[Microsoft Windows 95|Windows 95]] - Windows XP等)で使用される。このモードにおいて、プロセッサは基本的にx86の32ビットプロセッサとして振る舞い、16ビットと32ビットのコードのみが実行可能である。Legacyモードは、仮想アドレス空間の4GB制限のような32ビットの仮想アドレッシング上の上限がある<ref name="amd-24593"/>。64ビットのプログラムは、Legacyモードで起動することができない。<br />
<br />
=== AMD64を採用するCPU ===<br />
次のプロセッサは、AMD64を実装する:<br />
*AMD [[Athlon 64]]<br />
*AMD [[Athlon 64 X2]]<br />
*AMD [[Athlon 64 FX]]<br />
*AMD [[Athlon II]] (搭載コア数などから、'X2', 'X3', 'X4', XLTモデルに分かれる)<br />
*AMD [[Opteron]]<br />
*AMD [[Turion 64]]<br />
*AMD [[Turion 64 X2]]<br />
*AMD [[Sempron]] ("Palermo" E6 ステッピングと、"Manila"以降の全モデル)<br />
*AMD [[Phenom]] (搭載コア数から、'X3', 'X4'に分かれる)<br />
*AMD [[Phenom II]] (搭載コア数から、'X2', 'X3', 'X4' 'X6'に分かれる)<br />
*AMD [[Bulldozer (マイクロアーキテクチャ)]] FX<br />
*AMD [[AMD Accelerated Processing Unit|APU]]<br />
*AMD [[Ryzen]]<br />
*AMD [[EPYC]]<br />
<br />
== Intel 64 ==<br />
'''Intel 64'''は、[[IA-32]]アーキテクチャの[[64ビット]]拡張であり、[[インテル]]によるAMD64の実装である。<br />
<br />
=== 開発経緯 ===<br />
従来、AMDはインテルがオリジナルであるx86の互換プロセッサを開発・生産していた。しかし、x64では立場が逆転し、インテルはAMDが開発したAMD64アーキテクチャ(x86プロセッサの64ビット拡張アーキテクチャ)を採用した。<br />
<br />
当初プロジェクトは、'''Yamhill'''<ref>[[オレゴン州]]の [[ウィラメットバレー]](Willamette Valley)を流れるYamhill川から来た名前である。</ref>という開発[[コードネーム]]で始まった。このプロジェクトの存在を否定し続けて数年が経ち、2004年2月の[[インテル・デベロッパー・フォーラム|IDF]]で、インテルはプロジェクトが進行中であることを発表した。インテルの当時の会長クレイグ・バレットは、これが重要な機密の一つであったことを認めた<ref>[http://www.theinquirer.net/default.aspx?article=14189 "Craig Barrett confirms 64&nbsp;bit address extensions for Xeon. And Prescott", from The Inquirer]</ref><ref>[http://www.internetnews.com/ent-news/article.php/3518781 "A Roundup of 64-Bit Computing", from internetnews.com]</ref>。<br />
<br />
インテルは、AMD64互換命令セットの名称を数回 変更した。[[インテル・デベロッパー・フォーラム|IDF]]で用いられた名前は'''CT'''(Clackamas Technology<ref>オレゴン州を流れるクラッカマス川(Clackamas River)の名前に由来し、[[ウィラメット川]](Willamette River)の支流である。</ref>)、その数週間後に'''IA-32e'''(IA-32 extensions)と呼称を変更し、2004年4月にはこれを '''EM64T'''(Extended Memory 64 Technology)という名前で公式に発表した。製品リリース後の2006年7月27日には、インテルはEM64Tを'''Intel 64'''と改称している<ref>[http://www.intel.com/content/www/us/en/architecture-and-technology/microarchitecture/intel-64-architecture-embedded.html "Intel® 64 Architecture"]</ref>。<br />
<!--<br />
# 以下出典元不明のため、Intel 64との統合処理の際、記事の整合を取るためにコメントアウトさせて頂きました。<br />
# 出典が分かる方いらっしゃいましたら、本文の適切な箇所に戻して頂けたらと思います。<br />
<br />
元々はインテルもYamhillという名称でx86の64ビット拡張を研究していたが、ライバルであるAMDがx86系初の64ビットアーキテクチャとしてAMD64を先に発表してしまった。x86プロセッサ用OS市場で独占的なシェアを持つマイクロソフトより、インテルが64ビットアーキテクチャを発表する際にはAMD64と異なる仕様とせず、完全互換にする様にとの強烈なプレッシャーもあったため、最終的にYamhill案は破棄されAMD64互換であるClackamas案がEM64Tとして発表されるに至った。<br />
--><br />
<br />
=== Intel 64を採用するCPU ===<br />
インテルで最初にIntel 64を実装したのは、''Nocona''というコード名で2004年6月に発表されたマルチソケットの[[Xeon]]プロセッサである。Xeonはデスクトップ向け [[Pentium 4]] をベースにしているため、同時期のPentium 4もIntel 64を実装しているはずだが、[[ハイパースレッディング・テクノロジー]]のときと同様、この機能は''Prescott''では最初は動かないようになっていた。これはおそらく初期の実装が完全ではなかったためで、インテルはその後Intel 64を使用可能にしたPrescottのE0バージョンをmodel Fとして販売し始めた。このバージョンではAMD64の[[NXビット]]に相当する機能がIntel 64でサポートされた。インテルではこれをeXecute Disable(XD)ビットと呼んでいる。この機能はすぐにNocona([[Xeon]]系列)にも実装された。8xx/6xx/5x6/5x1/3x6/3x1シリーズのCPUは全てIntel 64が使用可能になった。また、[[Intel Core 2]]・[[Intel Atom]]でもIntel 64が採用された。<br />
<br />
Intel 64を実装しているCPUは以下のものがある。<br />
* [[Xeon]] (Nocona以降、Sossaman除、Xeon MPについてはCranford/Potomac以降)<br />
* [[Intel Core 2]]<br />
* [[Intel Core i9]]<br />
* [[Intel Core i7]]<br />
* [[Intel Core i5]]<br />
* [[Intel Core i3]]<br />
* [[Intel Core M]]<br />
* [[Pentium Dual-Core]]<br />
* [[Intel Atom]](model 230/330,N450/D510/D410)<br />
* [[Pentium D]]<br />
* [[Pentium 4]](Prescottはmodel F以降、model 521/531/541/551/561/571)<br />
* [[Pentium Extreme Edition]]<br />
* [[Celeron D]](model 326/331/336/341/346/351/355/356)<br />
* [[Celeron#Celeron Dual-Core|Celeron Dual-Core]]<br />
* [[Celeron#Merom-1M_.2F_2M_.2F_L|Celeron M]] (model 520/530)<br />
* [[Celeron#Conroe-L|Celeron 200シリーズ]](model 220)<br />
* [[Celeron#Conroe-L|Celeron 400シリーズ]]<br />
* [[Celeron#Merom-1M_.2F_2M_.2F_L|Celeron 500シリーズ]]<br />
<br />
== AMD64とIntel 64の差異 ==<br />
AMD64とIntel 64は、ほとんど同じであるが、僅かながら違いはある。これらの違いはオペレーティングシステム、コンパイラなどの開発者のみが意識しなければならない。アプリケーションプログラムの開発者がこれらの違いを意識する必要は、ほぼない。<br />
=== 差異 ===<br />
* Intel 64では、SYSCALL, SYSRET命令は64ビットモードにしかない。SYSENTER, SYSEXIT命令は32ビット、64ビットの両方にある。<br />
* AMD64では、SYSCALL, SYSRET命令は32ビット、64ビットの両方にあるが、SYSENTER, SYSEXIT命令は32ビットモードにしかない。<br />
* Intel 64には、AMD64で定義されたSYSCFG, TOP_MEM, TOP_MEM2がMSR(model-specific registers)にない。<br />
* Intel 64では、64ビットモードでニア分岐命令に66h(オペランドサイズ プリフィックス)を付けた場合サポート外となる。AMD64では、仕様書通り16ビットオペランドとして実行される。<br />
* BSF, BSR命令はソースが0の場合、Intel 64では元々のx86と同様にデスティネーションは不定(undefined)であるが、AMD64はデスティネーションを変更しない。<br />
* Intel 64には、AMDのFast FXSAVE/FXRSTOR機能はない。<br />
* 初期以外のAMD64は、[[VMware]]での64ビットゲストOSの仮想化を容易にするために、セグメントリミットを一部に再導入した。ロングモードセグメントリミットと呼ばれる。ただし、AMD-Vがあればロングモードセグメントリミットは必須ではない。<br />
* ハードウェア仮想化支援機能のIntel VT-xとAMD-Vは互換性がない。仮想化ソフトウェアはそれぞれに対応する必要がある。<br />
* [[x86仮想化#SLAT|Second Level Address Translation]]機能のIntel EPTとAMD RVIは互換性がない。仮想化ソフトウェアはそれぞれに対応する必要がある。<br />
<br />
=== 以前あった差異 ===<br />
* AMD64には、元々はCMPXCHG16B命令はなかった。この命令は16バイト(128ビット)のメモリ領域を複数のCPUコアで[[不可分操作|排他的に共有]]することに使用される。この命令はWindowsで16TB以上の仮想メモリを使うために必要である。Socket AM2以降のAMD64で対応<ref>[http://web.archive.org/web/20060807192848/http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/32559.pdf 「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.」と記載されている。</ref>。<br />
* 初期のAMD64, Intel 64は、64ビットモードでLAHF, SAHF命令をサポートしていない。この2つの命令はAHレジスタとフラグ間の転送命令で、元々は8ビットCPUである[[Intel 8080|8080]]のプログラムを[[Intel 8086|8086]]へ移植するのを容易にするために提供されていた<ref>8080のPUSH PSW命令をLAHF / XCHG AL, AH / PUSH AXとエミュレートできる。</ref>。64ビットモードでは、使い道があまりない命令のように見える。しかし、PUSH/POP命令の組み合わせと比較して、メモリにアクセスせず高速にフラグをコピーできるため、VMwareなどの仮想化ソフトウェアがこの2つの命令に依存している<ref>[https://www.vmware.com/jp/support/support-resources/pubs/player_pubs/releasenotes_player50#Installation_Requirements VMware Player 5.0 インストール要件]</ref>。また、[[x87]]のステータスワードをフラグにコピーすることにも使用される。<br />
* 初期のIntel 64には、PREFETCHW命令はなかった<ref>PREFETCHW命令はメモリからデータをキャッシュラインにプリフェッチし、そのデータがあとで書き換えられることを想定してあらかじめキャッシュラインの状態を[[MESIプロトコル|Modified]](書き換えあり)にする命令である。データが書き込まれた時点でModifiedに変更するよりも速く動作することが期待できる。</ref>。この命令は、元々はAMDの[[3DNow!]]で導入されたキャッシュの最適化命令である。Pentium 4の[[Pentium 4#CedarMill(シダーミル)|CedarMill]]コアからIntel 64はこの命令を単にNOP(No Operation)として処理するようになった<ref>[http://developer.amd.com/wordpress/media/2012/10/CrossVendorMigration.pdf AMDのドキュメント「Cross-Vendor Migration」のPrefetch Instructionsにfamily 15/model 6/stepping 1以降のCPU、すなわちCedarMillコアからこの命令をNOPとして処理するようになったと説明がある。]</ref>。NOPとして処理するIntel 64でもMicrosoft社のCoreinfoツール<ref>[http://technet.microsoft.com/ja-jp/sysinternals/cc835722.aspx Microsoft社のCoreinfoツールでこれらの命令のサポート状況を確認できる。]</ref>は、PREFETCHWに対応と表示する。2013年の[[Intel Atom#Silvermont マイクロアーキテクチャ|Silvermont]]、2014年の[[Broadwellマイクロアーキテクチャ|Broadwell]]よりPREFETCHW命令に正式に対応している。<br />(上記3つは、[[Microsoft Windows 8#Windows 8.1|Windows 8.1]]、[[Microsoft Windows 10|Windows 10]]の64ビット版が初期のAMD64、Intel 64CPUにインストールできない制約事項となる<ref>MS公式サイトの[http://windows.microsoft.com/ja-jp/windows-8/system-requirements Windows 8 のシステム要件]ページにあるWindows 8.1節に「64 ビット PC に 64 ビット版 OS をインストールする場合、プロセッサが CMPXCHG16b、PrefetchW、LAHF/SAHF をサポートしている必要があります」と記載されている。</ref><ref>[http://www.microsoft.com/ja-jp/windows/windows-10-specifications Windows 10 システム要件]</ref>)<br />
* 初期のIntel 64は、XDビット(AMD64におけるNXビット)をサポートしていない。したがってWindows 8(32ビット版、64ビット版とも)がインストールできない制約事項となる。<br />
<br />
=== その他 ===<br />
* AMD64, Intel 64のフラグレジスタ(RFLAGS)は、どちらも64ビット長で上位32ビットはゼロである。<br />
* POPFQ命令には、REXプリフィックスは必要ない。Intel社のドキュメントにはこのことが正しく記載されていなかった。<br />
<br />
== 命令セット ==<br />
; REXプリフィックス<br />
:次のような命令にはREXプリフィックスを使用する。<br />
:*64ビットのオペランドサイズの指定<br />
:*新しいR8〜R15レジスタ、追加されたXMMレジスタなどへのアクセス<br />
:*64ビットレジスタであるRSP, RBP, RDI, RSIのビット0から7を、8ビットレジスタSPL, BPL, DIL, SILとしてアクセス。一方でREXプリフィックスを付けると8ビットレジスタとして AH, BH, CH, DHにアクセスできない。これにより直交性が高まった。<br />
:また、以下の命令は、デフォルトで64ビットのオペランドサイズであり、REXプリフィックスを必要としない。<br />
:*ニア分岐命令<br />
:*PUSH, POP命令<br />
:*ENTER, LEAVE命令<br />
; 暗黙のゼロ拡張<br />
:32ビットレジスタにデータを書き込むとその汎用レジスタの上位32ビット(ビット32から63)はゼロになる。<br />
:これは、コードサイズの最適化に使用できる。<br />
:一方、16ビットレジスタや8ビットレジスタにデータを書き込んでも、このゼロ拡張は起きない。<br />
<br />
:'''NOP'''(No Operation:[[オペコード]] 90h)命令の実態はXCHG EAX, EAX(オペコード 90h)である。64ビットモードではこの命令を特別に扱い、暗黙のゼロ拡張は起こらずRAXレジスタは変化しない。<br />
:'''CMOV'''(Conditional Move)命令では、64ビットモードでオペランドが32ビットの場合、条件が偽でもデスティネーションレジスタの上位32ビットはゼロになる。<br />
; 即値<br />
:64ビットモードであっても、即値(Immediate value)は、32ビットのままであり、64ビットに符号拡張されて使用される。ただし、MOV命令のみ64ビットの即値が使用できる。<br />
; 変位<br />
:64ビットモードであっても、変位(displacement)は、32ビットのままであり、64ビットに符号拡張されて使用される。ただし、RAXレジスタに対してのMOV命令のみ64ビットの変位が使用できる。<br />
; 64ビットモードで廃止されたx86命令<br />
:以下のx86命令は64ビットモードでは廃止されたため、64ビットモードで実行すると不正命令例外が発生する。<br />
:*AAA, AAD, AAM, AAS (ASCII Adjust Addtion/Division/Multiply/Subtraction)<br />
:*BOUND (Check Array Bounds)<br />
:*CALL far, JMP far (Call far absolute, JMP far absolute)<br />
:*DAA, DAS (Decimal Adjust Addition/Subtraction)<br />
:*INTO (Interrupt to Overflow Vector)<br />
:*LDS, LES (Load Segment Register)<br />
:*POP DS, POP ES, POP SS, POPA<br />
:*PUSH CS, PUSH DS, PUSH, ES, PUSH SS, PUSHA<br />
:*オペコード 82h (Redundant encoding of opcode 80h: undocumented)<br />
:*SALC (Set AL According to CF: undocumented)<br />
:LAHF, SAHF命令は、初期のAMD64, Intel 64では64ビットモードで廃止されたx86命令であった。<br />
; 64ビットモードで再割り当てされたx86命令<br />
:*ARPL (Adjust Requestor Privilege Level)命令は、64ビットモードでは、新しいMOVSXD命令になった。<br />
:*1バイトのINC, DEC命令は、64ビットモードでは、REXプリフィックスになった。一方、2バイトのINC, DEC命令は、64ビットモードでも使用可能である。<br />
:*64ビットモードで廃止されたLDS, LES命令は、のちにインテルによって[[AVX]]命令のVEXプリフィックスとして割り当てられた。VEXプリフィックスに続く2バイト目を32ビットモードでは不正であった''11xxxxxx''という形式にすることにより、AVX命令は32ビットモードでも使用可能である。Windows NTの仮想DOSマシンでは、C4h C4h(LES AX, SPとデコードされる不正命令)を仮想86モードから32ビットプロテクトモードの呼び出しに使用していた<ref>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.</ref>。AVXは仮想86モード、リアルモードには対応していない。<br />
:*64ビットモードで廃止されたBOUND命令は、のちにインテルによって[[ストリーミングSIMD拡張命令#Intel AVX-512|AVX-512]]命令のEVEXプリフィックスとして割り当てられた。EVEXプリフィックスに続く2バイト目を32ビットモードでは不正であった''11xxxxxx''という形式にすることにより、AVX-512命令は32ビットモードでも使用可能である。<br />
<br />
== メモリ管理 ==<br />
; コードセグメントディスクリプタ<br />
:64ビットモードでは、コードセグメントディスクリプタのP(Present)ビット、D(Default)ビット、DPL(Descriptor Privilege Level)フィールド、C(Conforming)ビット、および、新しく定義されたL(Long)ビットのみが有効である。L=1の場合、64ビットモードでプロセッサーが動作することを意味する。それ以外のベースアドレス、リミットなどは無視される。<br />
<br />
コードセグメントディスクリプタのフォーマット<br />
{| class="wikitable"<br />
|-<br />
! 15!!14!!13!!12!!11!!10!!9!!8!!7!!6!!5!!4!!3!!2!!1!! 0<br />
|-<br />
| colspan="8" style="text-align:center" |ベースアドレス[31:24]<br />
| colspan="1" style="text-align:center" |G<br />
| colspan="1" style="text-align:center" |D<br />
| colspan="1" style="text-align:center" |L<br />
| colspan="1" style="text-align:center" |AVL<br />
| colspan="4" style="text-align:center" |リミット[19:16]<br />
|-<br />
| colspan="1" style="text-align:center" |P<br />
| colspan="2" style="text-align:center" |DPL<br />
| colspan="1" style="text-align:center" |S=1<br />
| colspan="1" style="text-align:center" |E=1<br />
| colspan="1" style="text-align:center" |C<br />
| colspan="1" style="text-align:center" |R<br />
| colspan="1" style="text-align:center" |A<br />
| colspan="8" style="text-align:center" |ベースアドレス[23:16]<br />
|-<br />
| colspan="16" style="text-align:center" |ベースアドレス[15:0]<br />
|-<br />
| colspan="16" style="text-align:center" |リミット[15:0]<br />
|}<br />
<br />
; データセグメントディスクリプタ<br />
:64ビットモードでは、データセグメントディスクリプタは、P(Present)ビットのみが有効である。それ以外のベースアドレス、リミットなどは無視される。ただし、FS,GSセグメントレジスタのみベースアドレスは有効で、MSRを使用して64ビットのベースアドレスを指定することもできる。<br />
:のちにインテルは、特権レベル0以外でもFS,GSのベースアドレスを操作可能にするRDFSBASE, RDGSBASE, WRFSBASE, WRGSBASE命令を追加した。<br />
<br />
データセグメントディスクリプタのフォーマット<br />
{| class="wikitable"<br />
|-<br />
! 15!!14!!13!!12!!11!!10!!9!!8!!7!!6!!5!!4!!3!!2!!1!! 0<br />
|-<br />
| colspan="8" style="text-align:center" |ベースアドレス[31:24]<br />
| colspan="1" style="text-align:center" |G<br />
| colspan="1" style="text-align:center" |D<br />
| colspan="1" style="text-align:center" |0<br />
| colspan="1" style="text-align:center" |AVL<br />
| colspan="4" style="text-align:center" |リミット[19:16]<br />
|-<br />
| colspan="1" style="text-align:center" |P<br />
| colspan="2" style="text-align:center" |DPL<br />
| colspan="1" style="text-align:center" |S=1<br />
| colspan="1" style="text-align:center" |E=0<br />
| colspan="1" style="text-align:center" |ED<br />
| colspan="1" style="text-align:center" |W<br />
| colspan="1" style="text-align:center" |A<br />
| colspan="8" style="text-align:center" |ベースアドレス[23:16]<br />
|-<br />
| colspan="16" style="text-align:center" |ベースアドレス[15:0]<br />
|-<br />
| colspan="16" style="text-align:center" |リミット[15:0]<br />
|}<br />
<br />
; 正規形(canonical form)<br />
:64ビットモードでは、仮想アドレスは64ビットであるものの、実際の実装では、2<sup>64</sup>バイト(16EB)のすべてを使用できるようにはなっていない。ほとんどのオペレーティングシステム、アプリケーションは、近い将来も含めて、そのような大きなアドレス空間を使用しない。フル64ビットという大きなアドレス空間のサポートは、複雑さとアドレス変換のコストを増やすだけでメリットはない。そのため、AMDは最初のAMD64の実装では、48ビットの仮想アドレス空間のみを使用することにした。さらに仮想アドレスのビット48から63は、ビット47の値がコピーされなければならないことにした。そうでない仮想アドレスを使用した場合は、プロセッサーは例外エラーを発生する。このルールに従ったアドレスは、正規形(canonical form)と呼ばれる。正規形のアドレスは、0から00007FFF'FFFFFFFFとFFFF8000'00000000からFFFFFFFF'FFFFFFFFの範囲であり、合計で256TBの仮想アドレス空間が使用可能である。<br />
:この仕様は、実際に64ビット仮想アドレスが使用可能になったときに重要な意味を持つ。正規形ではないアドレスを使用した場合、例外エラーが発生するので、アプリケーションやOSが、未使用の上位16ビットを別の用途に使用できない。そのため、将来、仮想アドレス空間が48ビットから拡張されたときに問題が起こらない<ref>AMD・インテル系アーキテクチャではないが、[[モトローラ]][[MC68000]]ではアドレス空間が24ビットだったがアドレスレジスタは32ビットだった。そのためアプリケーションなどが上位8ビットを勝手に使用していたケースがあり、のちに[[MC68020]]でアドレス空間が32ビット化された際に問題になったことがあった。</ref>。<br />
; Longモードでのページ変換(page translation)<br />
: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)を追加した。PAEが有効になっているため、CR4のPSE(page-size extensions)ビットは無視される。CPUIDのファンクション8000_0001hで、EDXのビット26がセットされていると、そのCPUは、1Gbyteページ変換に対応している。<br />
<br />
:4Kbyteページ変換: PML4, PDPE, PDE, PTEによって変換される。ページのサイズは4Kbyteである。<br />
:2Mbyteページ変換: PML4, PDPE, PDEによって変換される。ページのサイズは2Mbyteである。<br />
:1Gbyteページ変換: PML4, PDPEによって変換される。ページのサイズは1Gbyteである。<br />
<br />
== 特権レベル ==<br />
特権レベルは80286のプロテクトモードでx86に導入され、レベル0,レベル1,レベル2,レベル3の4階層がある。[[リングプロテクション]]とも呼ばれる。x64の64ビットモードでも特権レベルは4階層あるが、通常は特権レベル0(カーネルモード)と特権レベル3(ユーザーモード)の2種類しか使用されない。<br />
; コールゲートによるシステムコール(CALL far, RET)<br />
:[[コールゲート]]は80286で特権レベル(0,1,2,3)を切り替える仕組みとして導入された。64ビットモードでは、コールゲートは64bitのオフセットが使用できるように拡張された。<br />
:コールゲートの仕組みは[[RISC]]には無い。RISCにも対応していた[[Microsoft Windows NT|WindowsNT]]ではシステムコールにコールゲートを使用せず、INT命令や[[Pentium II]]で追加されたSYSENTER, SYSEXIT命令を使用していた。<br />
<br />
; 高速システムコール(SYSCALL, SYSRET)<br />
:特権レベル3(ユーザーモード)と特権レベル0(カーネルモード)を高速に切り換える命令として、AMDは64ビットモードではx86にあるSYSENTER, SYSEXIT命令は実装せず、AMD独自のSYSCALL, SYSRET命令のみを実装した。SYSCALL命令は、CS(コードセグメント), SS(スタックセグメント), RIP(インストラクションポインタ)をあらかじめセットされたMSRから特権レベルのチェック無しにロードする。このときRSP(スタックポインタ)はロードされない。オペレーティングシステムは新しい'''SWAPGS'''命令を使用して、ユーザーモードのGSセグメントと、カーネルモードのGSセグメントを切り替え、GSセグメント経由でカーネルモードのRSPをロードする。<br />
:なお、SYSCALLのオペコードは0Fh 05h、SYSRETのオペコードは0Fh 07hであり、これらはかつてx86に存在していた非公開命令[[LOADALL]]のオペコードを再割り当てしている。<br />
<br />
== オペレーティングシステムの互換性と扱い ==<br />
次のオペレーティングシステムは、x64アーキテクチャのLongモードをサポートする。<br />
<br />
=== BSD ===<br />
====FreeBSD====<br />
FreeBSDは、2003年6月の5.1-RELEASEで実験的なアーキテクチャーとして、amd64という名前でx64をサポートした。2004年1月の5.2-RELEASEでは公式なアーキテクチャーとして対応した。それ以来、FreeBSDでは、amd64をTier 1プラットフォームとしている。<br />
<br />
====NetBSD====<br />
x64アーキテクチャーのサポートは2001年6月19日にNetBSDのソースツリーに初めてコミットされた。2004年12月9日にリリースされたNetBSD 2.0では、NetBSD/amd64としてソースツリーに完全に統合され、公式なポートになった。32ビットのシステムコールのためのnetbsd-32カーネル互換レイヤーを通して、64ビットモードでの32ビットコードの実行がサポートされている。<br />
NXビットは、実行不可のスタックとヒープを提供するために、使用されている。<br />
====OpenBSD====<br />
OpenBSDは2004年5月1日にリリースされたOpenBSD 3.5でAMD64をサポートした。ソースツリー内でのAMD64サポートの完全な実装は、実際のAMD64のハードウェアのリリースより前に行われていた。これは[[ハッカソン|hackathon]]プロジェクトのためにAMDがいくつかのハードウェアを貸し出したためである。OpenBSDの開発者は、W^X (Write XOR Execute)<ref>ある場所のメモリを書き込み可能かつ実行可能の状態に置かず、書き込みのみか実行のみかどちらか一方だけにに制限すること。</ref> 機能が容易に実装できる[[NXビット]]があるため、AMD64プラットフォームを気に入った。<br />
OpenBSDのAMD64ポートは、Intel 64でも走る。しかし、初期のIntel 64にはNXビットがないため、これらのIntelのCPUではW^X機能は使えない。後にIntelはXDビットの名前で、NXビットを追加している。<br />
<br />
=== Linux ===<br />
[[Linux]]はLongモードでx64アーキテクチャを動作させる初めてのオペレーティングシステム・カーネルとなった。これは、実際のAMD64のハードウェアのリリースより前の2001年、kernel 2.4にて始められた。Linuxは32ビット実行可能ファイルの実行に関して後方互換を保っている。これにより、32ビットプログラムの使用を継続しながらLongモード用にプログラムを再コンパイルすることが可能になった。Fedora, Slackware, Ubuntu などでは、x86版とx64版の両方のインストールDVDを用意している。FedoraとRed Hat Enterprise Linuxなどでは、64ビットOS上で、32ビットと64ビットのすべてのユーザーランドプログラムのインストールを可能にしている。<br />
<br />
64ビット版Linuxでは、個々のプロセスで128TBの仮想アドレス空間と64TBの物理メモリが使用できる。(ただし、これは、CPUやPCシステムにより制限される)<br />
<br />
RedHat Enterprise Linux Version7以降では、x64版はサポートされるが、x86版はサポートされなくなった。<br />
<br />
=== Mac OS X ===<br />
[[Mac OS X v10.4]]のうちv10.4.7及びそれ以降のバージョンは、64ビットのインテルベースマシン上でPOSIX及び数学ライブラリを用いて64ビットコマンドラインツールが起動する。Mac OS X v10.4において、これ以外のライブラリ、フレームワークは、64ビットアプリケーションをサポートしない。このカーネル、およびカーネル拡張は32ビットのみである。<br />
<br />
[[Mac OS X v10.5]]は、64ビットのPowerPCマシン同様に、64ビットのインテルベース・マシンにおいてCocoa, Quartz, OpenGL, そしてX11を用いた64ビットのGUIアプリケーションをサポートした。全ての非GUIライブラリとフレームワークは、このプラットフォームで64ビットアプリケーションをサポートしている。このカーネル、そして全てのカーネル拡張は、32ビットのみである。<br />
<br />
[[Mac OS X v10.6]]は、64ビットカーネルをサポートしたMac OS Xの最初のバージョンである。しかし、最初のリリース(v10.6.0)では、全ての64ビットコンピュータがサポートされたわけではなかった。64ビットカーネルは、32ビットカーネル同様に32ビットアプリケーションをサポートし、それぞれのカーネルも同様に64ビットアプリケーションをサポートした。32ビットアプリケーションは、いずれのカーネルにおいても仮想アドレス空間が4GBであるという制限があった。<br />
64ビットカーネルは32ビットカーネル拡張をサポートせず、同様に32ビットカーネルは64ビットカーネル拡張をサポートしない。<br />
<!-- ここまで英語版より引用 --><br />
<br />
[[OS X Mountain Lion]]は、64ビットカーネルのみサポートするが、32ビット、64ビットの両方のアプリケーションをサポートする。<br />
<br />
Macは、x86/x64の32ビット・64ビットだけでなく、PowerPCとインテル・アーキテクチャのサポートなど、アーキテクチャの互換性問題が複雑に入り組んでいた為、ユーザが混乱しない為にOSレベルで[[ユニバーサルバイナリ]]などの仕組みが整えられた。これは、一つのアプリケーションファイル、またはライブラリファイルに対して複数のコードをパッケージし、実行時に最適なバージョンが選択されるというものである。<br />
<br />
=== Windows ===<br />
[[Microsoft Windows]]は、2005年4月(日本においては6月)に[[Microsoft Windows XP|Windows XP Professional x64 Edition]](クライアント版)、[[Microsoft Windows Server 2003|Windows Server 2003 x64 Edition]]をリリースし、x64に対応した。元来のx86版において、Windows XP の内部バージョンは 5.1.2600、Windows Server は 5.2.3790 であったが、x64 版においてはビルド番号が同一であり(5.2.3790.1830 SP1)、システムアップデートも統一された。<br />
<br />
[[Microsoft Windows Vista|Windows Vista]]は2007年1月に、[[Microsoft Windows 7|Windows 7]]は2009年7月に、[[Microsoft Windows 8|Windows 8]]は2012年10月にリリースされた。いずれのOSも、x86 に加えて、64ビット(x64) 版としてx64をサポートするが、Itanium をサポートしない。<br />
<br />
[[Microsoft Windows Server 2008|Windows Server 2008]]は2008年2月にリリースされ、x86 版、x64 版に加えて、[[IA-64]]も[[Itanium]]版としてサポートした。[[Microsoft Windows Server 2008 R2|Windows Server 2008 R2]]では x86 版のリリースが打ち切られ、x64 版と Itanium 版のみリリースした。Itanium 版はこの版が最終リリースとなり、[[Windows Server 2012]] では x64 版だけがリリースされた。<br />
<br />
x64版Windowsには以下のような機能がある。<br />
*1プロセスあたり8TB(Windows 8まで)又は128TB(Windows 8.1以降)のユーザーモード仮想アドレス空間。x64のプログラムは、"large address aware"オプションを付けてリンクされていれば、これらのすべてを使用できる。ただし、補助記憶装置(すなわち、ハードディスク)の容量により使用できる最大値は、制限される。一方、32ビット版Windowsで提供されているユーザーモード仮想アドレス空間は2GBである。<br />
*オペレーティングシステム用の8TB(Windows 8まで)又は128TB(Windows 8.1以降)のカーネルモード仮想アドレス空間。一方、32ビット版Windowsで提供されているカーネルモードアドレス空間は2GBである。この増加した空間のメリットは、ファイルシステムのキャッシュやカーネルモードヒープに使用できる。Windows 8までのWindowsはプロセッサーで実装されている256TBのアドレス空間のうち合計16TBしか使用できない。これは、初期のAMD64がCMPXCHG16B命令をサポートしていないためである。<br />
*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上で動作させることにメリットがある。<br />
*32ビット、および、64ビットのアプリケーションは、"large address aware"オプションを付けてリンクされていなければ、仮想アドレス空間は2GBに制限される。<br />
*WindowsXP/Vistaでは128GB, Windows 7では192GB、Windows 8では512GB、Windows Server2003では1TB、Windows Server 2008では2TB、Windows Server 2012では4TBまでのRAMを使用可能。<br />
*LLP64データモデルを採用。intとlongは32ビット、long longは64ビット、ポインタとポインタから派生したデータ型は64ビットである。<br />
*カーネルモードデバイスドライバは64ビットでなければならない。32ビットのカーネルモードデバイスドライバは 64ビット版Windowsでは動作しない。ユーザーモードデバイスドライバは、32ビット、64ビットのどちらも64ビット版Windowsで動作する。<br />
*16ビットWindows(Win16)アプリケーションとDOSアプリケーションは64ビット版Windowsでは動作しない。これは、64ビットモードに仮想86モードがないため、64ビット版Windowsから仮想DOSマシンサブシステム(NTVDM)を削除したためである。<br />
*NX(No Execute)ページ保護機能の完全な実装。この機能は32ビット版WindowsでもPAEモードで起動すれば使用できる。<br />
*x86版のWindows NTファミリーでFSセグメントが使われている代わりに、x64ではGSセグメントがオペレーティングシステムが定義する2つの構造体を指している。ユーザーモードでのスレッドインフォメーションブロック(NT_TIB)とカーネルモードでのプロセスコントロールリージョン(KPCR)である。たとえば、ユーザーモードでは、GS:0はスレッドインフォメーションブロックの最初のメンバーのアドレスである。この規則を維持することによりx64版Windowsの開発が容易になった。しかし、AMDに対して、LongモードでFS, GSセグメントの機能を保持することを要求することになった。(ただし、セグメントアドレッシング自体は、近代的なオペレーティングシステムで使われるものではない)<br />
*[[Microsoft Visual Studio]] 2005以降では、64ビット版Windowsのみで動作する64ビットアプリケーション、32ビット版Windowsと64ビット版WindowsのWOW64上の両方で動作する32ビットアプリケーションの開発が可能である。<br />
<br />
== 脚注 ==<br />
{{Reflist}}<br />
<br />
== 参考文献 ==<br />
* [https://software.intel.com/en-us/articles/intel-sdm Intel 64 and IA-32 Architectures Software Developer Manuals]<br />
* [https://developer.amd.com/resources/developer-guides-manuals/ AMD64 Architecture Programmer's Manual]<br />
<br />
== 関連項目 ==<br />
* [[プロセッサ]] - [[命令セット]] - [[レジスタ (コンピュータ)]] - [[アドレッシングモード]]<br />
* [[32ビット]] - [[x86]] - [[IA-32]]<br />
* [[64ビット]] - '''x64''' / [[IA-64]]<br />
* [[Windows NT系#32ビットと64ビット]]<br />
<br />
== 外部リンク ==<br />
* [http://www.amd.com/jp-ja/Processors/ProductInformation/0,,30_118_9331,00.html AMD64 プラットフォーム]<br />
* [http://www.amd.com/jp-ja/Processors/TechnicalResources/0,,30_182_739_7044,00.html アーキテクチャ技術資料]<br />
* [http://www.intel.co.jp/jp/technology/intel64/index.htm インテル 64 アーキテクチャー]<br />
<br />
{{Processor architectures}}<br />
{{デフォルトソート:X64}}<br />
[[Category:x86アーキテクチャ]]<br />
[[Category:コンピュータアーキテクチャ]]<br />
[[Category:マイクロプロセッサ]]</div>
118.238.204.231
Warning : Cannot modify header information - headers already sent by (output started at /home/users/1/sub.jp-asate/web/wiki/extensions/HeadScript/HeadScript.php:3) in /home/users/1/sub.jp-asate/web/wiki/includes/WebResponse.php on line 46