2017-03-23 12 views
-1

異なるメモリ領域のアドレスを出力すると、0xda2280、0x7f8a494f9010などの値が得られます。これらはメモリ内の別のバイトを指しています。メモリアドレスの解釈方法は?

1)しかし、なぜこの範囲が大きいのですか?その間にある各アドレスがアドレス可能であり、140TB以上のメモリがあることを意味します。これをどうやって解釈するのですか?

2)ほとんどの場合、アドレスは上位アドレスと下位アドレス(ヒープとスタック)にグループ化されています。しかし時には私は3つの異なる地域がはっきりと分かれているのを見る。この第3のメモリ領域とは何ですか?

+0

あなたは少しgoogledしましたか? "linux memory management"の最初のヒット:http://www.tldp.org/LDP/tlk/mm/memory.htmlこれはかなり複雑なテーマであり、簡単には答えられません。また、プログラミングに関するものではないため、ここには属しません。 –

+0

はい私は仮想メモリが物理メモリよりかなり大きいことを知っていましたが、私はそれがはるかに大きかったことに気づいていませんでした。 そして、(仮想)アドレス空間の中央に大きなオブジェクトが割り付けられることがあるという理由を説明することができません。私は、アドレス空間の大きさに関係なく、それぞれの端に集中しているスタックとヒープの明確な部分の同じ振る舞いを期待します。 – Simmeman

答えて

1

/proc/<pid>/smaps探す場所は、すべての異なるを見て、それが難しく、バッファ・オーバーフローのバグなどを利用できるようにすることプロセスがマッピングした範囲を指定します。初期化されたグローバル変数のようなものは、実行可能ファイル自体にマップされた範囲に対応するアドレス、スタックマップからスタック変数、ヒープマップから小さなmallocedデータを持っていることがわかります。共有ライブラリ内の関数のアドレス(例:&printf)が、そのlibのテキストセグメントマッピングに表示されます。

ヒープサイズを変更するbrk()や、ファイルの一部をメモリにマップするようなmmap()など、マッピングされた範囲を作成する方法はいくつかあります。後者は、実行可能ライブラリと共有ライブラリのコードとデータセグメントがどのようにメモリに配置されるかです。

異なる範囲の割り振りに直ちに範囲を割り振るのではなく、異なる種類の割り振りには異なる領域があります。このため、64ビットのアドレス空間全体に分散した範囲が表示されます。

大きなmallocが小さな種類のアドレスとは異なる種類のアドレスを持つ理由は、mallocがメモリをどのように割り当てているのかによるものです。小さな割り当ては通常、通常のx86_64システムではより低いアドレスにあるヒープから発生します。しかし、大きな割り当てはヒープから来ていません。もしそうなら、それが解放されたときに、それがその前後にまだ割り当てられている他のデータであったこの巨大な穴があります。非効率的な。断片化と呼ばれる問題の一部です。したがって、非常に大きな割り当ては、mmap()を使用して、1つの割り当てのためだけに新しいメモリ領域をマッピングします。この「匿名マッピング」は、ヒープとは別の領域から来るため、異なるように見えるアドレスを取得します。

0

表示されるメモリアドレスは仮想です。オペレーティングシステムには、基本的にアプリケーションが使用する仮想アドレスと物理メモリの間の動的マップであるメモリマネージャがあります。

また、セキュリティを高めるために、これらのメモリアドレスの一部は、アプリケーションが実行されるたび間のランダムかもしれない、

+0

私は自分たちがランダムであったが、おおよそ同じ住所にまだ含まれていることを理解しました。さて、我々はアドレス[0-100]を持っていると言って、私はスタックの値を大体(0-10)持っています。ヒープは(80-100)と言う。私が目撃しているのは、(50-55)のアドレスでもありますが、これは無作為化のためには極端だと思います。しかし、これはこの無作為化によっても説明できると思いますか? – Simmeman

+0

/proc/self/mapsを見てください(または、プログラムのPIDをselfに置き換えて)現在のメモリレイアウトを見てください) –

関連する問題