web-dev-qa-db-ja.com

Windowsは、メモリのどの部分が「データのみを保持することを目的としている」かをどのようにして知るのでしょうか。

私は DEP実装 について学んでいます、今私はOSがメモリのどの部分がintended to hold data onlyであるかをどのように知るのかを理解しようとしていますか?

1
daisy

実行可能ファイルでは、バイトはセクションに編成されます。従来の名前は、コードを含むことを意図したセクションの「テキスト」と、データを含むことを意図したセクションの「データ」です。 「rodata」(読み取り専用データ)、「bss」(ゼロで初期化された読み取り/書き込みデータ)もあります...したがって、OSは各ページに与えるアクセス権を認識しています。ここに記載されている名前はUnixの伝統に由来していますが、同じ概念がWindowsの世界にも当てはまります。

次に、アプリケーションはそれ自体の使用のためにさらにメモリチャンクを割り当てます。デフォルトでは、OSはデータブロックを返します(少なくともDEPが有効になっている場合、読み取りおよび書き込みアクセスは許可されますが、実行は許可されません)。次に、アプリケーションは VirtualProtect() を使用して明示的に変更を要求できます。 [〜#〜] jit [〜#〜] を使用する一部のプログラミング言語のインタープリターは、定義では、実行可能コードを動的に生成し、すぐに実行します。

OSは、各ページの意図されたアクセス権を追跡しますが、「推測」はしません。実行されるファイル(フォーマットの一部)または動的割り当ての場合はアプリケーションから情報を取得します。それ自体が情報を提供することになっています。

0
Thomas Pornin

記憶自体は無関心です。オペレーティングシステムは、各領域の使用目的を定義します。つまり、ウィンドウズはそう言ったので「知っている」のです。

1
ddyer

実行可能ファイルには、データとコードの2種類の命令のみが含まれています。通常、データはプログラム内の初期化された変数と初期化されていない変数であり、コードはそれらの変数を処理および操作するプログラム命令です。実行可能ファイルがメモリにマップされると、データセクションはスタックとヒープにマップされ、プログラム命令はプログラムの.textセクションにマップされます。

考えてみれば、プログラムの実行中にプログラム命令が変更されることはないため、.textセクションは常に読み取り可能で実行可能としてマップされます。また、正当なプログラムは、プログラムのデータセクションから何かを実行することを望んでいません。これは、スタックとヒープである初期化された変数と初期化されていない変数のみが含まれているため、常に実行不可能(読み取りと書き込みのみ)としてマップされます。そのため、DEPがスタックまたはヒープから実行可能命令を検出すると、プログラムは終了します。実行可能命令は、プログラムの.textセクションからのみ許可されます。

0
void_in