2

したがって、32ビットプログラムのアドレス可能なメモリスペースは4ギガバイトです。それぞれ、64ビットアプリケーションでは、最大18エクサバイトのアドレス指定可能なスペースがあります。

kernel32.dll APIには、プログラムのヒープやメモリに関するさまざまなメソッドがあります。

したがって、私の現在の理解では、たとえばHeapAllocを呼び出して、割り当てる必要のあるメモリ量を渡すと、割り当てられたメモリスペースのアドレスへのポインタが返されます...(ここで間違っている場合は修正してください)けれど。)

これにwin32-api関数を使用する利点は、ロードされたDLLなどの他のコンポーネントをどこに配置するかをWindowsが最もよく知っていることです。だから私は尋ねています...

DLLファイルのメモリ内の固定位置はありますか?32ビットの場合は通常メモリスペースの上半分(0x80000000以上)であるとどこかで読んだと思いますが、それが本当だとしても、64ビットアプリケーションの位置はどうなるでしょうか。

また、Windowsに最初に割り当てさせずに、メモリへのポインタを自由に使用することはできませんか?副作用は何でしょうか?

私はこのテーマに少し慣れていないので、助けやヒントをいただければ幸いです。=)

4

1 に答える 1

6

また、Windowsに最初に割り当てさせずに、メモリへのポインタを自由に使用することはできませんか?副作用は何でしょうか?

副作用は単純です。アプリケーションがクラッシュします。

Windows(および他のすべての正常なOS)は仮想メモリを使用します。OSは物理メモリをプロセスが認識する仮想アドレス空間にマップします。そして、このマッピングをオンデマンドで実行します。メモリのブロックを割り当てるように要求すると、対応する範囲の仮想メモリアドレスを有効なメモリチャンクにマッピングします。

任意のアドレスに書き込むということは、OSによってバッキングメモリにマップされていないメモリページに到達することを意味します。次に、アクセス違反(または* nixのセグメンテーション違反)が発生します

DLLファイルのメモリ内の固定位置はありますか

いいえ。どうしてあるのでしょうか?DLLファイルが1つあれば、それを実行できます。アプリケーションが2つのDLLをロードした場合はどうなりますか?40をロードするとどうなりますか?400?また、DLLのサイズはそれぞれ異なるため、固定された場所にロードされた場合、重複してしまう可能性があります。

これに加えて、最近のバージョンのWindowsは、アドレス空間のランダム化を実行します。特定のセキュリティの悪用を軽減するために、Windowsは、アプリケーションを複数回起動した場合に、DLLと実行可能ファイルを異なる場所にロードするようにします。

つまり、プロセスはWindowsで実行されます。これはWindowsの市民であり、Windowsの法律に従わなければなりません。リソース(メモリを含むがこれに限定されない)にアクセスする必要がある場合は、Windowsにそのリソースを使用可能にするように依頼する必要があります。

于 2012-06-19T11:34:04.147 に答える