私は仮想メモリが2G(カーネル用)と2G(ユーザー用)をWindowsで分けていることは知っています。 しかし、変数のアドレスが連続してスタックしないのはなぜですか?
好き0x22ff74,0x22ff78,0x22ff82,0x22ff86? Windowsはユーザープロセスでサンドボックスメカニズムを使用していますか?
私は仮想メモリが2G(カーネル用)と2G(ユーザー用)をWindowsで分けていることは知っています。 しかし、変数のアドレスが連続してスタックしないのはなぜですか?
好き0x22ff74,0x22ff78,0x22ff82,0x22ff86? Windowsはユーザープロセスでサンドボックスメカニズムを使用していますか?
これは仮想メモリとまったく同じです。オペレーティングシステムは、各プログラムに独自のプライベートアドレス空間を提供します。実際には、オペレーティングシステムは、アプリケーションが認識することなく、それらの仮想アドレスを物理的なアドレス空間にマッピングする役割を担っています。
これは、2つのアプリケーションがプログラムの同じ仮想アドレスに存在する異なるデータを持つ可能性があることに気づきました。
仮想メモリの詳細についてはhereを参照してください。
あなたは物理アドレスと仮想アドレスを混同していますか? 2つのプロセスが同じ仮想アドレスにアクセスするのは問題ありません。なぜなら、各プロセスにはそれぞれ独自の仮想メモリ空間があるからです。一方、すべてのプロセスはマシン内で同じ物理メモリ空間を共有するので、各プロセスは同じ物理アドレスを異なる物理アドレスにマッピングします(共有メモリがないと仮定します)。
私はそれを別の方法で説明しましょう。プロセスXはマシンAで実行されており、同じプログラムがマシンB上でプロセスYとして実行されています。プログラムのグローバル変数のいくつかが両方のマシンで同じメモリアドレスを使用するかどうかは重要ですか?それらは違う!同様に、グローバル変数がプロセスの1つのインスタンスに対してXYZの場所に格納されている場合、プロセスの別のインスタンスはそのグローバル変数に対して同じ仮想アドレス(XYZ)を持つことがあります。
ありがとうございます。しかし、あなたが提供するwikiを読んだ後でもっと混乱してしまいます。それは、それぞれのプロセスが2Gを完全に所有していると思っていることを意味します(あるいは、各プロセスに新しいVASがあります)。はいの場合、4つのプログラムが同じVASアドレスで開始するのはなぜですか?もう1つの質問は、DLL(第三者)が各プロセスのVASに ".data"と ".code"をコピーすることです。あまりにも多くの質問を申し訳ありません<3 – John
@ジョン:それは複雑です。各プロセスには独自のクリーンVASがあります。起動時に、各DLL(プロセス実行可能ファイルと一緒に)はプロセスにマップされたメモリです。共有DLLは通常、すべてのプロセスで同じアドレスから開始されます(したがって、それらのために使用されるページは共有されます)。仮想アドレスがタッチされると(実行、読み出しまたは書き込み)、メモリ管理はその仮想アドレスの内容をメモリにコピー(ページング)する。 –
前の回答にフォローアップ:DLLアドレスが衝突することがあります。その場合、ローダはDLLを新しいアドレスに再配置します。その後、DLLのページはDLLを使用する他のプロセスと共有されなくなります。 –