Ask Learn
Preview
Please sign in to use this experience.
Sign inThis browser is no longer supported.
Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.
Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
さて、現在のデスクトップ向けの Intel 系主流 CPU は Core2 Duo や Core2 Quad ですが、こうした現在の主流の CPU はほぼすべてが 64 ビット CPU になっています。64 ビット CPU 自体の歴史は長く、2003 年頃から CPU が、そして 2005 年頃から OS も 64 ビット版が出荷されていました。対応する CPU やデバイスドライバの問題などから(少なくともコンシューマユースでは)なかなか普及が進まなかったのですが、さすがに現在にもなると、OS はもとよりデバイスドライバも 64 ビット版のものが非常に入手しやすくなっており、いよいよ 64 ビット環境が使いやすくなってきました。
また、アプリケーション開発環境でも .NET Framework 2.0 が 64 ビット対応を行ったことで、64 ビットネイティブアプリケーションの開発というものが容易になってきました。とはいえ、.NET Framework は中間言語(IL)と呼ばれる仕組みを使うため、64 ビット対応の仕掛けはやや複雑です。そこで最初のエントリでは、64 ビット Windows OS の基本知識として、以下のようなポイントをまとめておきたいと思います。
[Step 1. x86, x64, IA64 の違い]
現在の PC 市場向けの CPU は、x86 系、x64 系、IA64 系の 3 種類に大別されます。正確な CPU の型番情報は Wikipedia などが詳しいですが、キーポイントは以下の通りです。
なお、64 ビット系 CPU の中でも、x64 系は、x86 系の上位互換となっているのが大きな特徴です。IA64 系の 64ビット CPU は、x86 系との命令の互換性に乏しく、既存の x86 系アプリケーション(=32 ビットアプリケーション)が動作しないことが多いです。
[Step 2. Windows OS の対応 CPU]
基本的に、x86, x64, IA64 は CPU レベルでは異なるもの(=異なるハードウェア)です。このため、利用する Windows OS も、x86 版、x64 版、IA64 版がそれぞれ存在します。例えば Windows Server 2008 の場合には、
という 3 種類が存在しています。ただし、先に述べたように、IA64 はサーバ系マシンでしか使われていないため、クライアント系 OS である Windows Vista の場合には、
の 2 種類のみが提供されています。
ここで重要なのは、x64 系 CPU が x86 系 CPU の上位互換 CPU として設計されている、という点です。このため、Core2 Duo や Athron 64 などを搭載したマシン(=x64 マシン)に、32 ビット版の Windows OS (例えば Windows Vista x86 版)などをインストールして使うことができます。このようにすると、x64 CPU を x86 CPU と全く同じように使うことができる、というわけです。もし 64 ビット OS の機能が特に要らないのであれば、x64 マシンに x86 版 OS をインストールして使ってもよい、ということになります。
※ ちなみに IA-64 マシンに x86 版の OS をインストールすることはできません。
[Step 3. 64 ビットプロセスと 32 ビットプロセス]
我々が利用するアプリケーションプログラムのファイル(.exe ファイル)の中には、通常、CPU が実行するバイナリ実行コードがそのまま格納されています。このため、
となります。しかしこれでは、64 ビット OS に移行したとたんに、過去に作成された資産(x86 系 .exe アプリケーション)が一つ残らず使えなくなってしまいます。これでは困るので、64ビット版 Windows OS では、WOW64 (Windows 32bit on Windows 64bit)と呼ばれるエミュレータ機能を提供しています。
下記がその概念図です。x64 版 Windows OS には x64 用 WOW64 が、IA64 版 Windows OS には IA64 用 WOW64 が付属しています。このため、x64 版 Windows または IA64 版 Windows 上でも、x86 版のアプリケーションをエミュレーション動作させることができるようになっています。
※ このエミュレーション動作は当然のことながらすべての x86 版アプリケーションの動作を保障する、という類のものではありません。特に IA64 版 Windows 上での x86 版アプリケーションの動作互換性は必ずしも高くはないようです。しかし、x64 版 Windows 上での x86 版アプリケーションの動作互換性はかなり高いです。このページなどを参照してみるとよいかと思いますが、概してデバイスドライバが絡むものは互換性が低いです。(← デバイスドライバは OS のカーネル部で動作するので、32 ビット版のデバイスドライバは 64 ビット版 OS では決して使えない) ....というか結構びっくりするのはゲーム類ですらほとんどのものは動作する、という点ですね。
では、ここまでの確認をする意味で、SQL Server 2008 を例に取って解説したいと思います。
まず、SQL Server 2008 には、以下の 3 つのバージョンがあります。
そして、それぞれは以下の環境で動作させることができます。
① SQL Server 2008 x86 版
② SQL Server 2008 x64 版
③ SQL Server 2008 IA64 版
これからわかるように、32 ビット版アプリケーションはいろんな環境で動作させることができる、という点を覚えておいてください。逆に、x64 版、あるいは IA64 版のアプリケーションは、CPU/OS ともに同じ環境でなければ動作させることができません。
ちなみにこうした理由から、例えば Office 2007 (Word や Excel) は x86 版バイナリしか提供されていません。しかし、これを x64 版 Windows Vista 上で動作させて利用することは普通にできます。
なお、ここで気をつけておきたいのは x64 版 Windows 上で大半の x86 アプリが動作するとしても、それが公式にサポート対象となっているかどうかは話が別、という点です。例えば、
となっています。特にゲームなどでは、動作はするけどサポートはしていない場合がほとんどで、上記のページも自己責任でアプリを動かしているはずです。このことは、特にサポートが重要視される業務アプリケーション開発などでは大問題になるケースがありますので、サードパーティ製のライブラリを利用しているような場合には、x64 版 Windows OS 上での動作がサポート対象となるのか否かを確認するようにしてください。
なお、64 ビット OS 上で、あるプロセスが 64 ビットネイティブモード/32 ビット互換モードのどちらで動作しているのかは、タスクマネージャを見るとすぐに判別できるようになっています。
また、ある .exe ファイルを 64/32 ビットどちらで起動すればよいのかに関しては、Windows OS が自動的判定するようになっています。64 ビット版 Windows OS は、.exe ファイルを起動する際に、.exe ファイルのヘッダ情報(PE ヘッダ)を確認し、それにより、.exe ファイル内のバイナリコードが x86, x64, IA64 のいずれのものであるのかを判別します。そして適切なプロセスを起動する、という流れになっているため、ユーザが起動時に 32/64 ビットどちらで起動するのかを指定する必要はありません(し、できません) 。
※ 言い換えると、PE ヘッダ部に誤った情報が書かれていると、間違ったビット数でのアプリ起動を行ってしまい、クラッシュすることになります。このため、.exe ファイル作成時(=アプリケーションのコンパイル時)に正しい PE ヘッダを作成することが重要です。これは Part. 2 以降で解説します。
[Step 4. DLL ファイルのロードメカニズム]
64/32 ビットを考える上でもう一つチェックしておきたいのが、DLL ファイルのロードです。一般的に、Windows OS では、.exe ファイル(アプリケーション本体)が利用する拡張ライブラリを、.dll ファイルとして作成しておき、これをアプリケーションプロセスが動的に読み込んで利用します。(このため DLL = Dynamic Link Library と呼ばれている) が、.exe ファイルと同様に、この .dll ファイルの中身は実行バイナリです。このため、 .dll ファイルにも x86 版、x64 版、IA64 版の区別が存在します。そして、.dll ファイルに関しては、ひとつのプロセスの中に同じタイプのものしか共存させることができない、というルールが存在しています。簡単にいえば、下図のように、64 ビットプロセスの中に 32 ビット DLL ファイルをロードしたり、32 ビットプロセスの中に 64 ビット DLL ファイルをロードしたりすることはできません。
こうした理由から、64 ビット版 Windows OS では、Internet Explorer について 32 ビット版と 64 ビット版の 2 種類が提供されています。例えば Silverlight や Flash といったブラウザのプラグインの多くは 32 ビット版のバイナリしか提供されておらず、これらは 64 ビット版の IE では利用できません。このため、64 ビット版 Windows OS では 2 種類の IE が提供されています。
[Step 5. x64 版 Windows OS のフォルダ構造]
では引き続き、x64 版 Windows OS のフォルダ構造を眺めてみます。x64 版 Windows OS では、64, 32 ビットのアプリケーションプログラムがうまく共存動作できるように、フォルダやレジストリなどがきれいに構造化されています。
GAC 内
フォルダ構造を見ると、いくつかの特徴があることがわかります。
※ システムフォルダについてはここでは話が複雑になるので解説しません。興味がある方は別途 SysWOW64 について書かれた資料を探してみてください。
なお、一点注意していただきたいのは、Program Files フォルダです。64 ビット版 Windows には、2 つの Program Files フォルダができますが、このフォルダは、64/32 ビットどちらでアプリを起動するのかの判定に使われているわけではありません。アプリケーションを 64/32 ビットどちらで起動するのかは PE ヘッダー情報に基づいて行われており、フォルダ名に基づいて行われているわけではありません。あくまでこれらのフォルダは、ユーザの便宜のため(=わかりやすくするため)だけに使われていますので、x86 版のアプリケーションを、x64 用フォルダ(Program Files)下にインストールしても、動作上の不具合は特に発生しません。
[Step 6. x64 版 Windows 上での Visual Studio 2008 の利用]
では、最後に Visual Studio 2008 上で x64 版のアプリケーションを開発する方法について考えてみましょう。Visual Studio 2008 で x64 版アプリケーションを開発する場合、開発環境の選択としては以下の 2 通りがあります。
前者の方法の場合、x86 版 Windows OS (32 ビット OS)上では 32 ビットのアプリしか動かせませんので、64 ビット OS 上での動作検証をするためには、リコンパイルやコピーを行い、64 ビット OS 上での動作確認を再度行わなければいけません。
しかし、右図のように 64 ビット OS 上に Visual Studio 2008 をインストールすれば、64 ビットのネイティブアプリが動作させられるので、直接 64 ビットアプリを開発してデバッグできる……と単純に考えると危険です。その理由は、Visual Studo 2008 は、x86 版しか提供されていないからです。
つまり、たとえば Visual Studio 2008 上で Web アプリケーションを開発してデスクトップで動作させた場合には、
ということになり、なんにも考えずに動かすと、実はあらゆるものが 32 ビット動作する、ということになります。
このため、64 ビットアプリケーションを開発したいと思った場合でも、x64 版 Windows 上に Visual Studio 2008 をインストールすれば OK、なんていう単純な話ではない、というところに関しては注意が必要です。これについて解説....していきますが、長くなったので Part 1. はいったんここまで、ということで^^。
[ここまでのまとめ]
引き続き次回は、.NET Framework 2.0 による 64 ビットアプリの開発についてみていきたいと思います。
Anonymous
October 30, 2008
Visualstudioのビルド構成マネージャ
「アクティブソリューションプラットフォーム」の「Any CPU」とか「Mixed Platform」あたりが関係してくるのでしょうか。
このあたりの情報がなかなかMSDNで見つけにくくて、どの設定にすればよいのか自信が持てずにいたりします。
Anonymous
October 30, 2008
はい、あのあたりが関連してきますが、その辺は次回の
エントリで記述するつもりです。
MSDN なども書いてあることは正しいのですが、ちょっと
わかりにくいですよね....。
.NET の場合には、通常は AnyCPU にしておけばOK
なのですが、どういう場合にスイッチ変更が必要なのか
あたりも含めて解説するつもりです。
Anonymous
November 26, 2009
わかりやく勉強させていただいてます。
ちょっと気になる点と質問があります。
X86の別名をIA-32としておりますが、
IA-32は、X86,X86-64の総称だったと思われます。
つまり互換性がないのが、IA-32とIA-64となり、
X64とIA-64も互換性がない思ったのですが・・・
XP64がIA-64で動作しないのは、IA-32向けで開発されているからでしょうか。
Anonymous
December 08, 2009
The comment has been removed
Please sign in to use this experience.
Sign in