2016-05-03 14 views
1

アプリケーションで使用している仮想メモリに関する情報を取得する方法はありますか?私の知る限り、このようなコード・セグメント、データセグメントとヒープなどのプログラムが使用するメモリのいくつかのセグメントが、ある意識してるよう私のプログラムが使用している仮想メモリに関する情報?

、スタックなど

私は上の情報を得ることができる方法はありますこれらのセグメントの開始と終了のアドレス?

いくつかのコンテキストを与えるために私のプログラム(グラフの一種)の仮想メモリの視覚的表現を含む画像を描画しようとしています。だから私は異なるセグメントの開始アドレスと終了アドレスが必要であり、可能であればアドレスがメモリかどうかを判断する方法は現在使用されています。

私はWindowsのbtwでC++を使用しています。

+0

私は教授がSIGSEGVをキャッチして、4kBs程度の倍数でアドレスにアクセスするプログラムを書いていることを覚えています。これは、あなたが読めるアドレスだけの情報を与えるだけで、Windows上でどのように動作するのか分かりません。 –

+0

あなたはあなたが探しているものをより具体的にする必要があります。 32ビットウィンドウの場合は、2^32バイトの仮想メモリを使用しています。あなたが64ビットのウィンドウ上にいる場合は、2^64バイトのVIRTUALメモリー(さらには論理メモリー)を使用しています。あなたはワーキングセットのサイズについて話していますか?いくつの論理ページがマップされていますか? – user3344003

+0

これを判断する言語レベルには何もありません。 OS固有のライブラリを使用して、OSの状態とプロセスの状態を照会する必要があります。 –

答えて

1

プロセスのメモリレイアウトを問い合わせるには、VirtualQueryExを呼び出します。 必要なメモリマップレイアウトを返します。

返されたMEMORY_BASIC_INFORMATIONの保護リストのメモリセクションのテーブルリスト。

しかし、マシンはその性質(ETCコード、データ、rodata、BSS、ヒープ、)によって保護上にない属性働く、あなただけはそれらにを推測することができます。

  • PAGE_EXECUTE:コード
  • PAGE_READONLY:rodata
  • PAGE_READWRITE:データ、BSS、ヒープ、
  • PAGE_WRITECOPYスタック:、データ、BSS、ヒープスタック

しかし、上記の推測では、プロセスが独自のVirtualAllocateまたはファイルマッピングを行っていて、正確性を高めるためにGetModuleFileNameで実行可能ファイル名をクエリし、ファイルを解析してからテーブルと比較すると信頼できません。スペースランダム化)

+0

ありがとう、これはどのように使用されているの例がありますか?私がそれを使用するときに返す情報はそれほど役に立ちませんか?どんな助けもありがとう。 –

関連する問題