Windows OSは、異なるプロセスのベース(必要な)アドレスにロードされたDLLが、コピーオンライトセマンティクスで同じ物理ページを使用できるようにすることで、物理メモリの使用を節約しようとします。 この記事 、たとえば、メカニズムについて説明します。
現在、Windows Virtual Memory APIを使用すると、VirtualProtect関数を介してメモリページの保護モードを変更できます。利用可能な2つの保護モードには、コピーオンライトセマンティクスが含まれています。
さて、前置きはもう終わりです。問題は、ロードしたばかりのDLLからコピーオンライトのメモリページを取り出し、その保護モードを次のように変更した場合です。読み取り/書き込み、それが他のプロセスにどのように影響するか?変更前に、すべてのプロセスが同じ物理メモリページを使用しているため、その単一のページが突然、コピーオンライトブードゥーを失い、奇妙な種類の共有メモリになりますか?
正気のために、コピーオンライトページの保護モードを読み取り/書き込み(または非COW保護モード)に変更すると、カーネルが同じコンテンツと独自のプライベートページを生成すると想定する必要があります。他のプロセスは、元のCOWページで快適に動作します。問題は、これをサポートする参照が見つからなかったことです。そのため、これが実際にそうであると明確に述べていることを誰かが私に指摘できれば、私はそれを感謝します。
編集:さらに興味深い質問は、COWページを読み取り/書き込みに変更してから書き込むとどうなるかです-変更は他のプロセスに影響します(ページがCOWでなくなり、他のプロセスにもマッピングされているため)それはあるべきように聞こえますが、それは明らかに安全ではありません)?
通常、何かが「コピーオンライト」の場合。プロセスがそのインスタンスに書き込む場合、ページのコピーを作成し、元のページをそのプロセスのコピーで置き換えることにより、そのページは「読み取り/書き込み」に変換されます。他のプロセスは元のプロセスを使用し続けます(ページに書き込みを行い、独自のコピーを取得するまで)。
プロセスがWindows仮想メモリAPIを使用して、ページのインスタンスを「書き込み時にコピー」から「読み取り/書き込み」に変換する場合。次に(私はそう思います)ページへの書き込みとまったく同じ効果があります-Windowsはコピーを作成し、そのコピーはそのプロセスに対して "読み取り/書き込み"になります。そして、それはオリジナルには影響せず、他のプロセスのインスタンスにも影響を与えません。
異なる権限を持つページにアクセスするプロセスは複数あります。 1つのプロセスはそれ自体の権限を変更できますが、他のプロセスの権限を変更することはできません。また、オペレーティングシステムもページを維持します。
アクセスを「コピーオンライト」から「リードライト」に変更した場合、他の誰も影響を受けてはなりません。他のプロセスには、「読み取り専用」または「書き込み時のコピー」アクセス権がある場合があります。彼らはページが自然に変化することを期待していません。アクセスを読み取り書き込みに変更すると、ページmustがコピーされるか、OSが壊れます。基本的には、単にページに書き込んだ場合と同じことが発生する必要があります。
いいえ、ページ保護を変更しただけではCOWは発生しません。読み取りと書き込みのどちらをオンにしても、変更はシステム全体ではなく現在のプロセスにのみ影響します。
私が知る限り、これを確認するマイクロソフトの公式ソースはありませんが、私は非常に長い間Windowsオペレーティングシステムのリバースエンジニアリングに取り組んでおり、ウィンドウ全体をほぼREにして、あなたにそれを保証することができます(メモリページはインスタンス化されず、ページに書き込む場合を除いて、そのページのプライベートコピーは取得されません。これは、指定されたメモリページのプライベートコピーをプロセスにOSに強制させる唯一の方法です。
OSや他の多くのプロセスによって共有されたメモリページへの書き込みに成功し、このページに重要なデータが含まれていて、SOによってCOWが実装されていなかった場合、OSが不安定になる可能性があります。クラッシュ。