2012-01-26 8 views
5

私はOllyデバッガを使って遊んでいました。私はまだウィンドウについて知ることができ、Mボタンを押してそのメモリマップウィンドウをポップアップさせました。だから私はその件に関するいくつかの記事を検索し、私が実際に試した64Kより上のアドレスに書き込むことができることを知りました。なぜうまくいかないのでしょうか。下位2GBの容量について:windows process memory layout

  • なぜこのようなギャップがありますか?たとえば、0x10000-0x1FFFFのR/Wableスペースがある場合は、128Kが無くなり、次に読みやすいスペースがいくつかあります。これはすでにページされていることを意味しているので、物理的な空間のようなものが過去に存在していたかどうかは問題ではないはずです(0x20000-0x40000はr/wと大丈夫です)。ランダムにいくつかのアドレス空間を使用する? 私はちょうど混乱しています。なぜなら、ollyデバッガからのそのメモリマップでは、列に 'Contains'と書かれている行が空になっているからです。おそらく、私はちょうどollyからこのメモリマップに対して置くことができ、どのような空間がどのような目的を持っているのかを調べることができ、このようにページングされているかどうかを知ることができるでしょうか?

  • メモリ管理については何の問題もありませんが、ヒープを使用せずにその下位メモリを使用してWindows用のプログラムを作成しても問題ないのですか?

この質問をお読みいただきありがとうございます。

EDIT

ああhere我々は0x10000番地で何で行くと、そのページが書き込み可能聞かせている理由は、おそらくもあります。

+1

OS上で調べてください:) – Adrian

+0

これは私がこれでやっていることです: – Pyjong

+0

あなたの最後の質問について...私はあなたが保護されたメモリに書き込むことはできません。それはOSに依存します。だから、OSを作って、Windowsがそのメモリをどのようにマップするかを読んでください。(あなたがOllyに言及してから勝つと思います) – Adrian

答えて

1

すべてのメモリがアプリケーションで使用できるわけではありません。たとえば、一部のタイプのハードウェアではメモリが必要なため、システム(BIOSまたはOS)は物理メモリのブロックを割り当て、ハードウェアがそのメモリを管理するために残します。このような操作を実行すると、ハードウェアに影響するため、そのメモリは直接読み書きできない(または書き込み可能である)可能性があります。ハードウェア自体には、使用可能なメモリ範囲に関する独自の制限がある場合があります。

Windowsの場合は、任意のメモリ位置に書き込むことはできません - OSはあなたに(少なくともusermodeで)許可しませんし、とにかくメモリをページするので、 (仮想アドレス)が実際の物理メモリアドレスと一致しません。

一般に、要求され、OSによって割り当てられたメモリにのみ読み書きする必要があります。

+0

はい、おそらくページングされたメモリなので、なぜ仮想メモリの連続ブロックではなく、このようなマップが理解できないのですか。 – Pyjong

+0

@stupid_idiot多分断片化。多分MSはアルゴリズムでこれをそうすることにしました – Adrian

3

あなたは集中的な質問をしていないようですので、貴重な答えを提供することは難しいです。しかし、あなたは質問を暗示しているようです。Windowsはユーザー空間のメモリをどのようにマップしていますか?

まずオフ、ゼロから64K以上—低仮想メモリ空​​間—はNULLベースポインタ間接参照をキャッチするために割り当てられていないままです。これらは我々が直ちに知りたい一般的なプログラミングエラーです。プログラムが発生した場合、プログラムはほぼ確実に終了するはずです。この領域をマップしないままにすることで、SEGFAULTと同等のWindowsが実行されます。非常に便利。

通常、コードスペースと定数スペースは次に割り当てられます。プログラムの実行が開始されると、通常、この領域が変更される必要はないため、読み取り専用に設定され、その一部には実行可能コード—とマークされます。通常は、領域の99%になります。共有コードライブラリがある場合、プライマリコード(通常)の後ろにマッピングされます(通常は小さなギャップがあります)。効率的なメモリ管理レジスタの使用のためにライブラリコードセグメントがページアライメントされています(おそらく4K、おそらく64K以上)。仮想メモリ空​​間を節約する必要はほとんどありません。

その後はデータスペースです。これは、初期化されたメモリ、または初期化されていない可能性があります。すべてが読み書き可能でなければなりません。そして、ヒープスペースの成長のために成長できるように、スペースをその上に予約する必要があります。

上記のデータスペースは、スタックスペースです。読み書きが可能で、の下にの下にそれが成長できるようにする必要があります。現代のCPUスタックはすべて低メモリに向かっています。

以上のスタックはシステムスペースです。

プロセスが(他のプロセスとの)共有メモリへのアクセスを要求する場合、マップされたウィンドウのサイズによって、メモリマップのどこに収まるかが決まります。ヒープが成長する場所にあまりにも近くマッピングされることは問題であり、潜在的なスタックの成長に近すぎることもまた問題です。幸いにも、かなり単純な配置アルゴリズムは、これを大部分のプログラムで解決します。いろいろなニーズについて考えてみてください。そして、あなたはおそらくオペレーティングシステムがそれが何をするのかを理解することができます。