/proc/<pid>/smaps
探す場所は、すべての異なるを見て、それが難しく、バッファ・オーバーフローのバグなどを利用できるようにすることプロセスがマッピングした範囲を指定します。初期化されたグローバル変数のようなものは、実行可能ファイル自体にマップされた範囲に対応するアドレス、スタックマップからスタック変数、ヒープマップから小さなmallocedデータを持っていることがわかります。共有ライブラリ内の関数のアドレス(例:&printf
)が、そのlibのテキストセグメントマッピングに表示されます。
ヒープサイズを変更するbrk()
や、ファイルの一部をメモリにマップするようなmmap()
など、マッピングされた範囲を作成する方法はいくつかあります。後者は、実行可能ライブラリと共有ライブラリのコードとデータセグメントがどのようにメモリに配置されるかです。
異なる範囲の割り振りに直ちに範囲を割り振るのではなく、異なる種類の割り振りには異なる領域があります。このため、64ビットのアドレス空間全体に分散した範囲が表示されます。
大きなmallocが小さな種類のアドレスとは異なる種類のアドレスを持つ理由は、mallocがメモリをどのように割り当てているのかによるものです。小さな割り当ては通常、通常のx86_64システムではより低いアドレスにあるヒープから発生します。しかし、大きな割り当てはヒープから来ていません。もしそうなら、それが解放されたときに、それがその前後にまだ割り当てられている他のデータであったこの巨大な穴があります。非効率的な。断片化と呼ばれる問題の一部です。したがって、非常に大きな割り当ては、mmap()
を使用して、1つの割り当てのためだけに新しいメモリ領域をマッピングします。この「匿名マッピング」は、ヒープとは別の領域から来るため、異なるように見えるアドレスを取得します。
あなたは少しgoogledしましたか? "linux memory management"の最初のヒット:http://www.tldp.org/LDP/tlk/mm/memory.htmlこれはかなり複雑なテーマであり、簡単には答えられません。また、プログラミングに関するものではないため、ここには属しません。 –
はい私は仮想メモリが物理メモリよりかなり大きいことを知っていましたが、私はそれがはるかに大きかったことに気づいていませんでした。 そして、(仮想)アドレス空間の中央に大きなオブジェクトが割り付けられることがあるという理由を説明することができません。私は、アドレス空間の大きさに関係なく、それぞれの端に集中しているスタックとヒープの明確な部分の同じ振る舞いを期待します。 – Simmeman