64bit版windows(2) - メモリ,ハードディスク,WOW64

《 初回公開:2019/11/09 , 最終更新:2020/01/11 》

【 目次 】

64 ビット Windows OS

  • Part 1. 64 ビット Windows OS の基本知識 ? とあるコンサルタントのつぶやき
  • AMD64 ISAとx64版Windowsについて

    しかし、64bit版Windows(x64版Windows)では、32bitのアプリを再コンパイルすることなく普通に起動し実行することができる。
    何故そんなことが可能なのかというと、Windows上のWOW64が、32bit版Windowsの振りをしているのだ。
    考え方はエミュレートと同じようなもの。
    x64版Windowsでは、CPUは常に「ロングモード-64bitモード」で動いていている。
    本来AMD64には「ロングモード-互換モード」というモードが備わっており、このモードを使用するとロングモードのままIA-32コードを走らせることが出来る。
    ...
    OSが64bitモードと互換モードのスイッチングを管理してやれば、AMD64コードとIA-32コードの混在が可能である、というのがAMD64の最大の売りであるはずだった。
    しかし、前記したとおりx64版Windowsではこの「互換モード」はまったく使用されていない。
    何故そのような設計になっているのだろうか。
    ...
    IA-64はIA-32とはまったくコードが別物であり、Itaniumに搭載されていたIA-32エミュレータはあまりに速度が遅かった。
    そこでマイクロソフトはIA-64版WindowsのWOW64にソフトウェアのIA-32エミュレータを組み込んだ。
    これはItanium内蔵のIA-32エミュレータよりも2倍程度の速度で実行可能だった。
    やがてマイクロソフトがx64版Windowsの設計・開発を始めたとき、このIA-64版の仕組みを変えなかった。
    何故かと言えば、IA-64版とx64版、「同じソースをコンパイルすれば、どちらでも動く」という仕様にしたかったからだ。
    そんな背景があるため、x64版Windowsに搭載されているWOW64にもこの仕組み(ソフトウェアのIA-32エミュレータ)を使っている。
    ...
    というわけで、x64版Windowsでは、AMD64アーキテクチャで本来可能であるはずの32bitコードと64bitコードのシームレスな相互呼び出し機能(64bitモードと互換モードのスイッチング)は全く生かされていない。

  • 64ビットの環境について(CPU、OS、アプリの関係) -64ビットの環境に- Windows 7 | 教えて!goo

  • amd64,ia64,x64,x86の違い - Windows XP 解決済み| 【OKWAVE】

    x32とx64の違いは、そのアドレス空間の大きさの差です。
    メモリがx32では3.25GBまでしか認識できません。
    x64は今PCで搭載できるメモリは全て認識できます。
    128GB以上です。
    HDDもx32はトータル2TBと聞きますが、x64では制限が無いようにさえ感じます。

メモリとハードディスク

64ビットWindows10ではメモリやハードディスクを最大どれだけ使えるの(認識できるの)?

メモリ

OSが認識できるメモリは

Windows10-64bit版では
物理メモリは2TB(Homeエディションは128GB)まで

  • 第3部 64bit Windows編 大容量メモリの真価を知る 1/3 | 1GB1,000円時代のメモリ活用テク | DOS/V POWER REPORT

    32bit Windowsが扱えるメモリ容量は仮想メモリ(プログラムから見たメモリ)/物理メモリともに最大4GBであり、しかもその4GBのうちハードウェアのDMA転送などに予約されているアドレスが使えないため、実質的に使えるのは3GB前後しかない。さらに1プロセス(=1アプリケーション)が使えるメモリは2GBまでという制限もある(残りの2GBはOS用)。
    ...
    一方、64bit Windowsでは、仮想メモリは16TBまで、物理メモリも128GBまで扱うことが可能。

仮想メモリは16TBまで

仮想メモリとは

64ビットアプリが使えるメモリは

64ビットアプリ メモリ windows

アプリが利用可能なメモリは8TB
ユーザー空間8TB,カーネル空間16EB(エクサバイト、約1600万TB)

ハードディスク

  • 【今更聞けない!】32bitと64bitの違いとは? まとめ

    最新のOSは十中八九このUEFIに対応している、BIOSの場合3TBのHDDは使用できない、厳密には使用できるが2TBでパーティションをしきらなければならなくなる。
    これはBIOSと組み合わせで使用しているMBRの仕様の関係上生じる制限だ。
    ...
    制約を撤回すべくUEFIとGPTパーティション管理がメジャーとなった。
    3TBのHDDも問題なく認識できることを始め、128のプライマリパーティションを作成できるなどの大幅な強化がなされた。
    これからOSをインストールする場合UEFIとGPTの組み合わせで管理することをお勧めする。

UEFIとBIOS
uefiとbiosの違い

  • UEFIとは?BIOSとの違いとは? - パソコンの選び方と買い方

    整理すると、UEFI が登場する前からあった BIOS と OS を接続するインターフェースは時代遅れとなりましたが、その古いインターフェースの代わりになる新しいインターフェースが UEFI です。
    インターフェースが新しくなれば、BIOS は新しいインターフェース UEFI に対応しなければなりません。
    UEFI に対応するように作られた新しい BIOS は古い BIOS とは違うものであり、この新しい BIOS は UEFI と呼ばれることが多いです。

  • レガシBIOSとUEFIモードの違い:BIOSブートモード - Windows 10

    2Tbytes以上の高容量ハードディスク制御やWindows64bit版に適しています。

いまどきのPCのマザーボードはUEFI対応しておりHDDは2TB以上の大容量が使えるようになっている。
UEFIに対応しているかどうかはmsinfo32のBIOSモードにて確認できる。

WOW64(ワウ64)

64bit版Windows-OSで32bit版Windowsアプリを動作させるための仕組みWOW64。
WOW64にはいろいろ呼び方があって

  • Windows On Windows 64
  • Windows 32-bit On Windows 64-bit
  • Windows 32bit emulation on Windows 64bit

  • ASCII.jp:32bitアプリを64bit Windows 7で動かす「WOW64」 (1/3)|あなたの知らないWindows

    64bit Windows(VistaやXPも含む)は、WOW64という32bitエミュレーション機能を搭載している。
    この機能により、64bit OSでも32bitプログラムを問題なく動かすことができる。
    ...
    簡単に言えば、x86の64bit拡張は、CPUレジスターをあまり変えずに、32bitだったものを64bitに拡張している。
    また64bit命令セットは、32bitの命令セットと互換性をもっている。
    そのため64bitモードでも、32bitの命令をそのまま動かすことができる。

  • ASCII.jp:32bitアプリを64bit Windows 7で動かす「WOW64」 (2/3)|あなたの知らないWindows

    WOW64では32bitプログラムで作られたアプリケーションを検出すると、CPUを32bitプログラムが動く「Compatibility Mode」に変更する。
    これにより、64bit CPUでも、問題なく32bitプログラムが動作するようになっている。
    さらにWOW64は、各32bitプログラムごとに、4GBの仮想メモリー空間が割り当てられる(古い32bitプログラムでは、2GBまでの仮想メモリー空間しか利用できない場合もある)。
    ...
    WOW64自体は、OSのユーザーモードで動作している。
    一方で、カーネルモードで動くOSカーネル自体は、完全に64bit化されている。
    そのため、カーネルモードで動作するプログラム、例えばデバイスドライバー類はWOW64を利用できない。
    そのため、32bit版デバイスドライバーは、64bit Windowsでは使用できない。
    64bit版が新たに必要になる。
    またWOW64は、32bitプログラムと64bitプログラムを、ひとつのプロセス内で混在させて実行できない。
    そのため、64bitプログラムで呼び出せるDLLは64bit DLLだけだし、32bitのDLLは呼び出せない。
    もちろん32bitプログラムからの64bit DLL呼び出しもできない。

  • ASCII.jp:32bitアプリを64bit Windows 7で動かす「WOW64」 (3/3)|あなたの知らないWindows

    64bit版Windowsでアプリケーションが動作する際には、Windowsシステムフォルダー(\Windows\System32)にあるアプリケーションやDLLにアクセスする。
    このWindowsシステムフォルダーにあるのは、64bitのプログラムだ(64bitプログラムがあるのに「System32」なのは互換性維持のため)。
    先に述べたように、WOW64上で32bitプログラムを動かした場合、64bitのDLLは呼び出せない。
    そのためWOW64では、32bitプログラムに対してWindowsシステムフォルダーを「\Windows\SysWOW64」に切り替える。
    このSysWOW64フォルダーに、32bit版のアプリケーションやDLLが保存されている。
    またレジストリにも、WOW64上で動かす32bitプログラムのために、「HKEY_LOCAL_MACHINE\Software\Wow6432Node」という項目が用意されている。
    32bitプログラムが使用するレジストリは、この項目以下に作られる。
    もちろん、WOW64環境用の32bit用レジストリエディター(\Windows\SysWOW64\Regedit.exe)も用意されている。
    なお、アプリケーションをインストールする際には自動でチェックされ、64bitアプリケーションは「\Program Files」に、32bitプログラムは「\Program Files(x86)」にインストールされる。
    ...
    .NET FrameworkはJavaのように、プログラムを中間言語に変換して、インタプリターが逐次実行する仕組みをとる。
    64bit Windowsでは、64bit版の.NET Frameworkが用意されるため、.NET対応アプリケーションは自動的に64bit環境で動作する。
    .NET Frameworkは32bitか64bitといった違いも吸収してくれるわけだ。

  • WOW64 - Wikipedia

    32ビットコードと64ビットコードは1つのプロセスに共存できない。32ビットのプロセスと64ビットのプロセスとの通信は、アウトプロセスCOMをはじめとして、各種のプロセス間通信が使用可能である
    ...
    2010年現在の64Bit Windowsでは、Windows システムフォルダ(%systemroot%\System32)には64ビットのバイナリが置かれ、32ビットプログラムはその中にあるファイルには直接アクセスすることができない。
    32ビットプログラムによるSystem32フォルダへのアクセスは、自動的に%systemroot%\SysWOW64へとリダイレクトされる動作となり、プログラムからはSystem32フォルダにアクセスしているように見える。
    SysWOW64フォルダには32ビットのバイナリが用意されている。
    Windows レジストリへ32ビットアプリケーションがアクセスする場合は、一部リダイレクトされる。
    HKLM\SOFTWAREとHKCR\下のレジストリキーへのアクセスは、それぞれWow6432Nodeと呼ばれるキーの配下にアクセスしている。

  • 第2回 Win32アプリケーションを実行するWOW64 (1/2):64bit Windows時代到来 - @IT

    64bit Windows向けに作られたアプリケーションを実行する場合は、それぞれのアプリケーションごとに独立した1つの64bitプロセス空間が作成され、その中で実行される。
    これに対してWin32アプリケーションを実行しようとすると、32bit版のWindows OSをエミュレーションするための環境(32bitプロセス空間)が作成され、その中でWin32アプリケーションが実行される。
    Win32アプリケーションが発行するAPIはエミュレーション用に用意された特別なDLLを経由して64bitのOSカーネルへ渡される。
    ...
    Win32とWin64 APIではポインタのサイズは異なるが、それ以外のデータ型は互換性がある
    ...
    WOW64では、Win32 API呼び出しのパラメータ中にあるポインタを64bitアドレスに変換してOSカーネルを呼び出す。
    戻り値にポインタ・データが含まれている場合はその逆の変換をして、呼び出し元の関数へ戻す。

  • WOW64 上でのデバッグ [1/2] ~ WOW64 とは何か? - Web/DB プログラミング徹底解説

難しい点はさておいて気になる点をピックアップすると

64Bit WindowsではWin16アプリケーションは実行できない。
32bitプログラムと64bitプログラムを、ひとつのプロセス内で混在させて実行できない。
すなわちから32bitプログラム64bitDLLを呼びだす事はできない,同様に64bitプログラム32bitDLLを呼びだす事もできない。

32bitプログラムと64bitプログラムと連携するために32ビットプロセスと64ビットプロセスとのプロセス間通信および検証はしていないがアウトプロセスCOMとの通信は可能なようだ。(プロセス内で混在する事ができないためインプロセスCOMは呼び出す事ができない。)

64bitアプリケーションは「\Program Files」に、32bitプログラムは「\Program Files(x86)」にインストールされる。

Windowsシステムの実行ファイルやDLLが格納されるデレクトリは

%systemroot%\System32には64ビット版が
%systemroot%\SysWOW64には32ビット版が

一見、逆のようだが互換性を維持するための苦肉の策のようだ。

windows カーネルモード ユーザーモード

英文の記事だがgoogle翻訳して気になるところを引用

  • カーネルモード
    カーネルモードでは、実行中のコードは、基盤となるハードウェアに完全かつ無制限にアクセスできます。
    任意のCPU命令を実行し、任意のメモリアドレスを参照できます。
    カーネルモードは、通常、オペレーティングシステムの最も低レベルで最も信頼できる機能のために予約されています。
    カーネルモードでのクラッシュは壊滅的です。彼らはPC全体を停止します。

  • ユーザーモード
    ユーザーモードでは、実行中のコードはハードウェアまたは参照メモリに直接アクセスできません。
    ユーザーモードで実行するコードは、ハードウェアまたはメモリにアクセスするためにシステムAPIに委任する必要があります。
    この種の分離によって提供される保護により、ユーザーモードでのクラッシュは常に回復可能です。
    コンピューターで実行されているコードのほとんどは、ユーザーモードで実行されます。

...

これらの2つのモードは単なるラベルではありません。
それらはCPUハードウェアによって実施されます。
ユーザーモードで実行されているコードが、権限のあるCPU命令にアクセスしたり、アクセスできないメモリを変更したりするなど、その範囲外で何かを実行しようとすると、トラップ可能な例外がスローされます。
システム全体がクラッシュする代わりに、その特定のアプリケーションのみがクラッシュします。それがユーザーモードの価値です。

システム全体がクラッシュしないように、WOW64はユーザーモードで動作しているという事か。

SysWOW64

WOW64のファイルシステムリダイレクト

WOW64により32ビットアプリケーションの"%windir%\system32"ディレクトリへのアクセスは、"%windir%\SysWOW64"ディレクトリへリダイレクトされる。

元のパス 32ビットx86プロセスのリダイレクトパス
%windir%\System32 %windir%\SysWOW64
%windir%\lastgood\system32 %windir%\lastgood\SysWOW64
%windir%\regedit.exe %windir%\SysWOW64\regedit.exe

以下のデレクトリは例外としてリダイレクタの対象外となる。

%windir%\system32\catroot %windir%\system32\catroot2 %windir%\system32\driverstore %windir%\system32\drivers \ etc %windir%\system32\logfiles %windir%\system32\spool

Sysnative - System32のエイリアス

32ビットアプリケーションは、%windir%\System32を%windir%\Sysnativeに置き換えることにより、ネイティブシステムディレクトリにアクセスできる。
64ビットアプリケーションからはSysnativeエイリアスを使用できない。

64ビット 32ビット 見分け方

OS

windows 32bit 64bit 見分け方

コンピュータのプロパティより確認

「システムのプロパティ」の表示方法にはエクスプローラより表示する方法の他にいといろあって

より詳しい情報はフリ-のツールを使って

office

Office 32bit/64bit 見分け方

アプリ 32bit/64bit 見分け方

exeやdllが64ビットか32ビットか確認

exeやdllが64ビットか32ビットか確認するにはいろいろな方法があって、

   dumpbin /headers [exeやdllのファイルパス] | findstr machine
  • バイナリエディタで直接exeやdllのPEヘッダを参照する。

プログラムのコードを使って確認

ポインターのサイズが4バイトなら32ビット,8なら64。

.NET FrameworkならIntPtr.Sizeでポインターのサイズを確認できる。
.NET Framework 4.0以降ではSystem.Environment.Is64BitProcessプロパティで確認できる。

アンマネージコードの場合はWindowAPIのIsWow64Process関数を使って確認できる。

環境変数PROCESSOR_ARCHITECTUREを参照する。

PROCESSOR_ARCHITECTURE

実行中のプログラムが64ビットか32ビット環境なのかは環境変数PROCESSOR_ARCHITECTUREを参照する事でも確認できる。 コマンドプロンプトからであれば

echo %PROCESSOR_ARCHITECTURE%

x86が表示されれば32bit,AMD64が表示されれば64bit

64ビット版と32ビット版のどちらのアプリをインストールするか

ダウンロード時にx86という名前があれば32bit版,x64なら64bit版と考えてよい。

32bit 64bit Office に関する事

64bit版のOfficeも登場してきていて64bit版の方が高機能なのだが、

でも64bit版には注意、
通常の使い方では問題ないのだが、
VBAマクロでDLLを呼び出していたりサードパーティ製の特殊なコンポーネントを利用している場合には64bit版には未対応なものが多く存在し、32bit版Excelを使う方が無難。

私がぶつかった事例としては、PLCという制御機器との通信をおこなうMXコンポーネントというCOMコンポーネントが64bit版Excelに対応していなくて、64bit版Excelを32bit版Excelにインストールし直した経験がある。

excel vba 32bit 64bit 問題

VBAからのDLL呼び出しに対する非互換性

ポイントは
64bit版ではDeclareステートメントにPtrSafeを指定する。
ポインターやハンドルはLong型からLongPtr型に変更する。

32bit版と16bit版でVBAのソースを共有する場合は、条件付きコンパイルを使う
条件付きコンパイル定数VBA7:2010以降のExcelで定義
条件付きコンパイル定数Win64:64bit版Excelで定義

#If VBA7 And Win64 Then
  '64bit版のコード
#Else
  '32bit版のコード
#End If 

旧バージョンのofficeを使いたいのだけれど、
サードパーティ製のコンポーネントを使っている場合、コンポーネントが最新のofficeに未対応だったりすると

office 2019 ダウングレード 方法

wsh 64bit vbscript 64bit

ページのトップへ戻る