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モードと互換モードのスイッチング)は全く生かされていない。 -
amd64,ia64,x64,x86の違い - Windows XP 解決済み| 【OKWAVE】
x32とx64の違いは、そのアドレス空間の大きさの差です。
メモリがx32では3.25GBまでしか認識できません。
x64は今PCで搭載できるメモリは全て認識できます。
128GB以上です。
HDDもx32はトータル2TBと聞きますが、x64では制限が無いようにさえ感じます。
メモリとハードディスク
64ビットWindows10ではメモリやハードディスクを最大どれだけ使えるの(認識できるの)?
メモリ
OSが認識できるメモリは
- Windows 10の最低メモリ容量・最大メモリ容量について
- Windows OSでサポートされている最大物理メモリサイズは?:Tech TIPS - @IT
- 32ビットと64ビットって何が違うの?|ネットの知恵袋|フレッツ光公式|NTT西日本
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
- 第1回 64bit Windowsのメリットとは (3/3):64bit Windows時代到来 - @IT
64bit版Windows OSでは従来のWin32というAPIのほかに、Win64という64bit対応のAPIセットを備えている。
...
Win32ではユーザーのプロセス空間は最大でも2Gbytesしかないが(設定によっては3Gbytesまで拡大可能。詳細は次回解説する。この中にユーザーのコードやデータ、スタック、DLLなど、さまざまなものが詰め込まれる)、Win64ではユーザー空間は8Tbytes(Win32の場合の4000倍)にまで拡大されている。 - 第2回 Win32アプリケーションを実行するWOW64 (2/2):64bit Windows時代到来 - @IT
- ASCII.jp:メモリー不足を根本的に解決する64bit OSの仕組み (4/4)|基礎から覚える 最新OSのアーキテクチャー
アプリが利用可能なメモリは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命令にアクセスしたり、アクセスできないメモリを変更したりするなど、その範囲外で何かを実行しようとすると、トラップ可能な例外がスローされます。
システム全体がクラッシュする代わりに、その特定のアプリケーションのみがクラッシュします。それがユーザーモードの価値です。
- Windowsのしくみ(ど素人編) - Qiita
- ユーザー モードとカーネル モード - Windows drivers | Microsoft Docs
- @IT:Windows TIPS -- Tips:カーネル・モードとユーザー・モードの負荷状況を簡単に見分ける方法
ここで詳細は述べないが、Windows 2000/XPは、OSのシステム・コードやデバイス・ドライバなどのコードと、ワードプロセッサなどのユーザー・アプリケーションのコードを完全に分離し、まったく異なるシステム・モードでそれぞれを実行している。
具体的には、前者はカーネル・モード、後者はユーザー・モードで実行されるようになっている。
この際ユーザー・モードで実行されるアプリケーションは、カーネル・モードが管理するメモリ資源などには直接にはアクセスできない。
このような制限を加えることで、万一ユーザー・モードで実行中のアプリケーションが暴走したとしても、システムには影響が及ばないようにしているわけだ。
システム全体がクラッシュしないように、WOW64はユーザーモードで動作しているという事か。
SysWOW64
- 64bit版Windowsで、ActiveX DLL はc:\windows\SysWOW64に入れて登録しなければならない - くらげのChangeLog
- Windows、「System32」フォルダと「SysWOW64」フォルダの違い|マコトのおもちゃ箱 ~ぼへぼへ自営業者の技術メモ~
WOW64のファイルシステムリダイレクト
- ファイルシステムリダイレクター-Win32アプリ| Microsoft Docs
ほとんどの場合、32ビットアプリケーションが%windir%\System32、%windir%\lastgood\system32、または%windir%\regedit.exeにアクセスしようとするたびに、アクセスはアーキテクチャ固有のパスにリダイレクトされます。
- 第2回 Win32アプリケーションを実行するWOW64 (1/2):64bit Windows時代到来 - @IT
- 個人的な φ(`д´)メモメモ…: 64bit版のWindowsで32bitアプリケーションからsystem32ディレクトリのファイルを開けない
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ビットか確認するにはいろいろな方法があって、
- EXE、DLLが32bitなのか64ビットなのか確認する方法 - Qiita
-
[ Windows ] 実行ファイルが32ビットか64ビットか確認する方法 - Qiita
バイナリエディタで PE ヘッダを解読する。
...
0x80番地前後程度の先頭付近に存在するPEヘッダを探す。
以下のデータが存在すれば32bitsバイナリ。
50 45 00 00 4C 01
...
以下のデータが存在すれば64bitsバイナリ。
50 45 00 00 64 86 -
アプリの実行中にタスクマネージャにて起動中のプロセスを表示させる事で確認できる。
-
コマンドプロンプト(VisualStudioの開発者コマンド プロンプト)より以下を実行。
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
- Windows で 32bit/64bit を確実に判断する|PROCESSOR_ARCHITECTUREとPROCESSOR_ARCHITEW6432 | 組込みエンジニアの思うところ
- Windows関連/Windowsが64bitか32bitを確認するコマンドとスクリプト - Windowsと暮らす
実行中のプログラムが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 問題
- Office 32bit/64bit問題 | Azulean's Note
- Microsoft Officeの64bit版は使わない方が良い!?: 【IT運用保守】サポーターズBlog
- Office の 32 ビット バージョンと 64 ビット バージョン間の互換性 | Microsoft Docs
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
- 64ビット環境で、VBA、Declare Function で発生するエラー - Excel 職人のつぶやき
- 【ワレコの講座】VBAをEXCEL2007,2010,2013,2016,2019の32/64 bitの全てに対応させるには?【解決】
- 【VBA】64ビット版対応って結局何をすればいいの? - 経理屋とVBAの日記
- VBA7 の APIコールについて
旧バージョンのofficeを使いたいのだけれど、
サードパーティ製のコンポーネントを使っている場合、コンポーネントが最新のofficeに未対応だったりすると
office 2019 ダウングレード 方法
wsh 64bit vbscript 64bit
-
64bit 版 OS で 32bit 版エンジンで VBS を実行するメモ ~ - WMI Fun !!
VBS を 64bit 版 OS を使用していて気になるのが 64bit に対応していないドライバやオブジェクトを使用した場合に発生するエラーですね。
64bit 版 OS では VBS を実行するスクリプトエンジン wscript.exe と cscript.exe も 64bit 版が実装されています。
ただし今までの 32bit 版 OS との互換性を考え 32bit 版のスクリプトエンジンも用意されています。
...
64bit 版 OS 上では wscript.exe、cscript.exe とものそのまま実行すると 64bit 版にて実行されます。
もし 32bit 版の wscript.exe、cscript.exe を実行したい場合、
"C:\Windows\SysWow64\cscript.exe"、"C:\Windows\SysWow64\wscript.exe" を実行します。 - Windows Vista Later VBScript Boot 64 bit Or 32 bit with Cscript or WScript Which you want to VBScriptを64bit 32bitのCscript Wscriptの起動を使い分ける - Qiita
- 日々のメモ。 VBSのCScriptを32bit/64bitで呼び分ける