5

それで、私はOllyデバッガーで遊んでいて、ウィンドウについてまだ見つけられないことを嗅ぎ回っていました。そのMボタンを押すと、そのメモリマップウィンドウがポップアップしました。それで私はこの主題に関するいくつかの記事をグーグルで検索しました、そして私は実際に私が試した64K以上のアドレスに書くことができることを知りました..なぜそれはうまくいかないでしょう。これらの下位2GBのスペースについて:

  • なぜそれらのギャップがあるのですか?たとえば、0x10000-0x1FFFF R / Wableスペースがあり、128Kはなく、読み取り可能なスペースがあります。つまり、これはすでに正しくページングされているので、物理空間のように過去に何かがあったかどうかは実際には問題ではありません(0x20000-0x40000はとにかくr / wに完全に問題ないはずです)、なぜ誰かがそうしないことに決めるのでしょうかランダムにアドレス空間を使用しますか?ollyデバッガーからのメモリマップでは、列に「含む」と表示されている場所に多くの行が空白のままになっているため、混乱している可能性があります。おそらく、私がollyからこのメモリマップに対して置くことができ、どのスペースがどのような目的を持っているのか、したがってこのようにページングされているかどうかを知ることができるいくつかの参照がありますか?

  • 私が実際にメモリ管理について何も台無しにしないと仮定すると、ヒープを使用する代わりにその低いメモリを使用してWindows用のプログラムを作成しても大丈夫ですか、それとも問題が発生する可能性がありますか?

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

編集

ああ、ここでは0x10000にあるものを使用します。これが、おそらくそのページが書き込み可能になる理由でもあります。

4

2 に答える 2

4

あなたは的を絞った質問をしていないようですので、価値のある答えを提供するのは難しいです. ただし、Windowsはユーザー空間メモリをどのようにマップしますか?という質問をほのめかしているようです。

まず、0 から 64K 以上の低い仮想メモリ空​​間は、NULL ベースのポインタ逆参照を捕捉するために割り当てられないままにされます。これらは、すぐに知りたい一般的なプログラミング エラーです。発生した場合、プログラムはほぼ確実に終了するはずです。このスペースをマップしないままにしておくと、Windows の SEGFAULT に相当するものが発生します。非常に便利。

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

その後はデータスペースです。これは、初期化されたメモリ、または初期化されていないメモリの可能性があります。それはすべて読み書き可能でなければなりません。また、ヒープ領域の拡大に合わせて拡張できるように、その上に領域を確保する必要があります。

データ空間の上にあるのはスタック空間です。読み取り/書き込み可能で、拡張できるようにそのにスペースが必要です。最新のすべての CPU スタックは、メモリ不足に向かって成長します。

スタックの上にはシステム空間があります。

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

于 2012-01-26T19:05:08.830 に答える
1

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

Windowsを使用している場合、任意のメモリ位置に書き込むことはできません-OSは(少なくともユーザーモードでは)許可せず、とにかくメモリをページングするため、見ていると思うアドレス(仮想アドレス) は、実際の物理メモリ アドレスと一致しません。

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

于 2012-01-26T16:29:19.653 に答える