Share via


Part 1. 64 ビット Windows OS の基本知識

さて、現在のデスクトップ向けの 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 の基本知識として、以下のようなポイントをまとめておきたいと思います。

  • x86, x64, IA64 の違い
  • Windows OS の種類
  • 64 ビットプロセスと 32 ビットプロセス(WOW64)
  • DLL ファイルのロードメカニズム
  • x64 版 Windows OS のフォルダ構造
  • x64 版 Windows 上での Visual Studio 2008 の利用

[Step 1. x86, x64, IA64 の違い]

現在の PC 市場向けの CPU は、x86 系、x64 系、IA64 系の 3 種類に大別されます。正確な CPU の型番情報は Wikipedia などが詳しいですが、キーポイントは以下の通りです。

  • 少し前に使われていた Pentium 4 や Core Duo(無印) などは、x86 と呼ばれる 32 ビット系 CPU です。
  • 最近使われている Core2 Duo や Athron64 などは、x64 と呼ばれる 64 ビット系 CPU です。
  • サーバ市場向けに使われている CPU である Itanium 2 などは、IA64 と呼ばれる 64 ビット系 CPU になります。
  • 64 ビット系 CPU は、x64 と IA64 の 2 種類が存在することになります。しかし、IA64 はサーバ市場向け CPU (=めっちゃ高い)、ということになりますので、今回の説明からは割愛します。

なお、64 ビット系 CPU の中でも、x64 系は、x86 系の上位互換となっているのが大きな特徴です。IA64 系の 64ビット CPU は、x86 系との命令の互換性に乏しく、既存の x86 系アプリケーション(=32 ビットアプリケーション)が動作しないことが多いです。

image

[Step 2. Windows OS の対応 CPU]

基本的に、x86, x64, IA64 は CPU レベルでは異なるもの(=異なるハードウェア)です。このため、利用する Windows OS も、x86 版、x64 版、IA64 版がそれぞれ存在します。例えば Windows Server 2008 の場合には、

  • Windows Server 2008 x86 版(32 ビット版)
  • Windows Server 2008 x64 版(64 ビット版その1)
  • Windows Server 2008 IA64 版(64 ビット版その2)

という 3 種類が存在しています。ただし、先に述べたように、IA64 はサーバ系マシンでしか使われていないため、クライアント系 OS である Windows Vista の場合には、

  • Windows Vista x86 版(32 ビット版)
  • Windows Vista x64 版(64 ビット版)

の 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 が実行するバイナリ実行コードがそのまま格納されています。このため、

  • x86 系の命令で書かれた .exe ファイルは、x86 系 CPU + x86 系 OS の上でしか動作しない。
  • x64 系の命令で書かれた .exe ファイルは、x64 系 CPU + x64 系 OS の上でしか動作しない。
  • IA64 系の命令で書かれた .exe ファイルは、IA64 系 CPU + IA64 系 OS の上でしか動作しない。

となります。しかしこれでは、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 版のアプリケーションをエミュレーション動作させることができるようになっています。

image

※ このエミュレーション動作は当然のことながらすべての x86 版アプリケーションの動作を保障する、という類のものではありません。特に IA64 版 Windows 上での x86 版アプリケーションの動作互換性は必ずしも高くはないようです。しかし、x64 版 Windows 上での x86 版アプリケーションの動作互換性はかなり高いです。このページなどを参照してみるとよいかと思いますが、概してデバイスドライバが絡むものは互換性が低いです。(← デバイスドライバは OS のカーネル部で動作するので、32 ビット版のデバイスドライバは 64 ビット版 OS では決して使えない) ....というか結構びっくりするのはゲーム類ですらほとんどのものは動作する、という点ですね。

では、ここまでの確認をする意味で、SQL Server 2008 を例に取って解説したいと思います。

まず、SQL Server 2008 には、以下の 3 つのバージョンがあります。

そして、それぞれは以下の環境で動作させることができます。

① SQL Server 2008 x86 版

  • x86 系 CPU マシン(Pentium 4 マシンなど)上に Windows OS x86 版を乗せ、そこにインストールする。(この場合は 32 ビットネイティブ動作)
  • x64 系 CPU マシン(Core 2 Duo マシンなど)上に Windows OS x86 版を乗せ、そこにインストール。(この場合は CPU が 32 ビットモードで動作するので、Windows OS も SQL Server も 32 ビットネイティブ動作になる。)
  • x64 系 CPU マシン(Core 2 Duo マシンなど)上に Windows OS x64 版を乗せ、そこにインストール。(この場合は OS は 64 ビット動作、SQL Server は WOW64 上で 32 ビットエミュレーション動作になる。)

② SQL Server 2008 x64 版

  • x64 系 CPU マシン(Core 2 Duo マシンなど)上に Windows OS x64 版を乗せ、そこにインストールした場合のみ動作。(この場合は Windows OS も SQL Server も 64 ビット動作。)

③ SQL Server 2008 IA64 版

  • IA64 系 CPU マシン(Itanium2 マシンなど)上に Windows OS IA64 版を乗せ、そこにインストールした場合のみ動作。(この場合は Windows OS も SQL Server も 64 ビット動作。)

これからわかるように、32 ビット版アプリケーションはいろんな環境で動作させることができる、という点を覚えておいてください。逆に、x64 版、あるいは IA64 版のアプリケーションは、CPU/OS ともに同じ環境でなければ動作させることができません。

ちなみにこうした理由から、例えば Office 2007 (Word や Excel) は x86 版バイナリしか提供されていません。しかし、これを x64 版 Windows Vista 上で動作させて利用することは普通にできます。

なお、ここで気をつけておきたいのは x64 版 Windows 上で大半の x86 アプリが動作するとしても、それが公式にサポート対象となっているかどうかは話が別、という点です。例えば、

  • Office 2007 (x86 版のみ提供) → 一部アプリを除き、x64 版 Windows 上での動作をサポート。
  • .NET Framework 1.0 → x64, IA64 版 Windows 上での動作は非サポート。
  • .NET Framework 1.1 → x64, IA64 版 Windows 上での動作をサポート。
  • .NET Framework 2.0 x86 版 → x64, IA64 版 Windows 上での動作をサポート。

となっています。特にゲームなどでは、動作はするけどサポートはしていない場合がほとんどで、上記のページも自己責任でアプリを動かしているはずです。このことは、特にサポートが重要視される業務アプリケーション開発などでは大問題になるケースがありますので、サードパーティ製のライブラリを利用しているような場合には、x64 版 Windows OS 上での動作がサポート対象となるのか否かを確認するようにしてください。

なお、64 ビット OS 上で、あるプロセスが 64 ビットネイティブモード/32 ビット互換モードのどちらで動作しているのかは、タスクマネージャを見るとすぐに判別できるようになっています。

image

また、ある .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 ファイルをロードしたりすることはできません

image

こうした理由から、64 ビット版 Windows OS では、Internet Explorer について 32 ビット版と 64 ビット版の 2 種類が提供されています。例えば Silverlight や Flash といったブラウザのプラグインの多くは 32 ビット版のバイナリしか提供されておらず、これらは 64 ビット版の IE では利用できません。このため、64 ビット版 Windows OS では 2 種類の IE が提供されています。

image

[Step 5. x64 版 Windows OS のフォルダ構造]

では引き続き、x64 版 Windows OS のフォルダ構造を眺めてみます。x64 版 Windows OS では、64, 32 ビットのアプリケーションプログラムがうまく共存動作できるように、フォルダやレジストリなどがきれいに構造化されています。

image

GAC 内

image

フォルダ構造を見ると、いくつかの特徴があることがわかります。

  • Program Files については、x86 版アプリケーション用のフォルダと、x64 版アプリケーション用のフォルダが別々に用意されている。
  • GAC については、x86, x64 共通で一つのフォルダになっている。(※ GAC は、内部に x86 版 dll, x64 版 dll を共存させておくことができるようになっているため。AMD64 = x64 です。)
  • .NET Framework については、x86 版、x64 版が両方インストールされている。
  • システムフォルダについても、x86 版(SysWOW64)と、x64 版(system32)の 2 つが用意されている。

※ システムフォルダについてはここでは話が複雑になるので解説しません。興味がある方は別途 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 上に、Visual Studio 2008 を入れて開発を行う。
  • x64 版 Windows OS 上に、Visual Studio 2008 を入れて開発を行う。

前者の方法の場合、x86 版 Windows OS (32 ビット OS)上では 32 ビットのアプリしか動かせませんので、64 ビット OS 上での動作検証をするためには、リコンパイルやコピーを行い、64 ビット OS 上での動作確認を再度行わなければいけません。

image

しかし、右図のように 64 ビット OS 上に Visual Studio 2008 をインストールすれば、64 ビットのネイティブアプリが動作させられるので、直接 64 ビットアプリを開発してデバッグできる……と単純に考えると危険です。その理由は、Visual Studo 2008 は、x86 版しか提供されていないからです。

つまり、たとえば Visual Studio 2008 上で Web アプリケーションを開発してデスクトップで動作させた場合には、

  • Visual Studio 2008 → WOW 上の 32 ビット動作
  • SQL Server 2005 Express Edition → WOW 上の 32 ビット動作
  • ASP.NET 開発サーバ → WOW 上の 32 ビット動作
  • Internet Explorer → 既定では 32 ビット版の IE が使われる。

ということになり、なんにも考えずに動かすと、実はあらゆるものが 32 ビット動作する、ということになります。

image

このため、64 ビットアプリケーションを開発したいと思った場合でも、x64 版 Windows 上に Visual Studio 2008 をインストールすれば OK、なんていう単純な話ではない、というところに関しては注意が必要です。これについて解説....していきますが、長くなったので Part 1. はいったんここまで、ということで^^。

[ここまでのまとめ]

  • 64 ビット CPU には、x64 系と IA64 系がある。32 ビット CPU である x86 系と互換性が高く、現在の PC 向け CPU メインストリームで使われているのは、x64 である。
  • x64 CPU の代表例は、Core2 Duo や Athron 64 である。
  • x64 CPU は、x86 CPU として使うこともできる。つまり、x64 CPU 上に x86 版 Windows OS をインストールすると、従来の 32 ビット CPU と全く同じ動作をさせることができる。
  • x64 CPU 上に x64 版 Windows OS をインストールし、x64 バイナリコードで書かれた .exe ファイルを実行すると、64 ビットネイティブでアプリが動作する。
  • x64 CPU 上に x64 版 Windows OS をインストールし、x86 バイナリコードで書かれた .exe ファイルを実行すると、WOW64 上で 32 ビットエミュレーションモードでアプリが動作する。
  • x64 コードと x86 コードが同一プロセス内に共存することはできない。

引き続き次回は、.NET Framework 2.0 による 64 ビットアプリの開発についてみていきたいと思います。

Comments

  • 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