6

MSVC では、ベース アドレスのランダム化がデフォルトのオプションです。(VS2005 以降?)

したがって、dll のベース アドレスを手動でリベースすることはもうありません。

しかし、VS2003 を使用するときの読み込みパフォーマンスを改善するために、すべての dll をリベースしました。

ASLR オプションを使用すると、読み込みのパフォーマンスが常に低下しますか?
(もちろん他の特典も受けられます)

4

1 に答える 1

10

短い答えはノーです。

ASLR を使用しないシステム (XP など) では、DLL を非優先アドレスにロードすると、いくつかのコストがかかります。

  1. 再配置セクションを解析し、フィックスアップをイメージ全体に適用する必要があります。
  2. フィックスアップを適用すると、CPU に関して比較的高価なコピー オン ライト エラーが発生し、アプリ自体によって参照されていない場合でも、ディスクからページを読み取らなければなりません。
  3. 非優先アドレスで DLL をロードするすべてのプロセスは、書き込まれるすべてのページのプライベート コピーを取得するため、メモリ使用量が増加します。

項目 2 と項目 3 は圧倒的に最大のコストであり、以前は DLL を手動でリベースする必要があった主な理由です。

ASLR を使用すると、フィックスアップは OS によって透過的に適用され、DLL が実際に優先アドレスに読み込まれたように見えます。コピー オン ライト障害はなく、プロセス プライベート ページは作成されません。また、フィックスアップは、画像全体ではなく、アプリが実際にアクセスするページにのみ適用されるため、余分なデータがディスクから読み取られることはありません。

それに加えて、手動のリベース スキームでは、すべてのベース アドレスの競合を防ぐことはできません (たとえば、異なるベンダーの DLL が互いに競合したり、OS DLL がホットフィックスによってサイズが大きくなり、予約済みの範囲にあふれたりする可能性があります)。他の DLL など)。ASLR はこれらの問題に対処するのにはるかに効率的であるため、システム全体を見ると、実際にパフォーマンスを向上させることができます。

于 2010-09-08T05:42:46.807 に答える