2012-03-29 24 views
0

私はWindowsのメモリ管理について少し混乱しています。Windowsのメモリ管理

私は、Windows(32ビット)のすべてのプロセスがディスクにスワップすることで、独自の4 GBのメモリを取得すると読んでいます。しかし32bit Windowsは最大4GBまで使えます。だから、私はすべてのプロセスが4 GBしか持っていないと思っていますが、実際には少ないと思っています。 私は正しいですか?

どのようにして、あるプロセスから別のプロセスにデータにアクセスできますか? 2つのPEが0x400000でロードされている場合、どうすればいいですか?あなたは私にCやASMの例を教えてください。

誰かがこれを私にさらに説明できますか?多分私に良い記事を教えてください。

簡単な説明だけで十分です:)。おかげさまで

+0

は、アドレス空間と物理メモリ量を混同しないでください。 – Joey

答えて

1

プリンセスは最大4 GBまでのアドレスをアドレス指定できます。アドレスは「実際の」メモリによってサポートされています。 Windows OSは32ビットでも4 GBを超えるアドレスを扱うことができますが、この量を制限する理由があるか、ハードウェアによって制限されています。

各プロセスは、メモリの4ギガバイトまでのアドレス指定可能、独自の仮想アドレス空間を持ちます。 [...]

+0

アドレスが仮想か物理かどうかはどうすればわかりますか?あなたは私にasmの例を教えてもらえますか?例えば。 JMP XXXまたはCALL XXX - XXXというメモリがどのようになっているのかわかりますか? それとも、私は何かが欠けているかもしれません。 0x400000でもロードされている私のプログラムからImageBase 0x400000で読み込まれたDLLから関数にアクセスしたいのですが? – Samuel

+0

ユーザモードのアプリケーションは、物理メモリを直接処理しません。 asmかどうかでは、あなたはあなたが気づいているそれらのアドレスを使用します。つまり、あなたは 'VirtualAlloc'からポインタを取得しました - あなたはそれを使うことができます。 OSとカーネルモードのコンポーネントは、仮想アドレスを実際のメモリにマッピングします。あなたは未知の[メモリ]アドレスを押すだけで、何とか動作すると期待することはできません。 –

+0

OK、私はそれを得る。しかし、私は他のプロセスのメモリにどのようにアクセスできますか?またはDLL?それを使用しているすべてのプロセスにDLLが再度ロードされていますか?私のアプリが例えばKernel32.dll(ほとんどの場合Windows上で使用されています)は私のアプリケーションの仮想アドレス空間にアクセスするのですか?共有アドレススペースはありますか?すべてのプロセスに対して同じDLL xxx回をロードするのは意味がないようです。 – Samuel