1

実行中のプロセスの内容を印刷すると、このような結果が得られました

00400000-00401000 r-xp 00000000 08:01 137910                             /home/user/process/a.out
00600000-00601000 rw-p 00000000 08:01 137910                             /home/user/process/a.out
02434000-02455000 rw-p 00000000 00:00 0                                  [heap]

a.out が 2 つのメモリ領域にロードされるのはなぜですか? 同じ部品なのか、違う部品なのか。1 つは持ってr-xpおり、もう1 つは持っていrw-pます。プログラムで malloc を使用して整数のサイズを割り当てたにもかかわらず、ヒープのサイズがそれ以上に表示されます。なぜそうなのですか?

4

1 に答える 1

3

0x400000のr-xp領域は、テキスト (コード) セクションです。読み取り可能で実行可能ですが、書き込みはできません。

rw-p0x600000の領域はデータ セクションです。読み取りと書き込みは可能ですが、実行はできません。

readelf -S a.out実行可能ファイルのセクションと、それらがメモリにロードされる場所が表示されます (最初にセクションからセグメントへのマッピングを介して)。


ing 4 バイトに関する実験mallocは不十分です。これは、メモリ管理が機能する方法ではないためです。を呼び出すmallocと、libc 実装は、保持している大きなプールから小さな部分を切り出します。(これは、これを実行するプロセスにすぎません。OS はすぐには関与しません。) そのプールを使い果たすと、brk(またはmmap) システム コールを使用して、カーネルにメモリを追加するように要求します。

malloc大量のメモリを使用すると、ヒープが大きくなる可能性があります。また、strace実行可能ファイルを実行して、実際にbrkまたはmemmapシステム コールを実行するタイミングを確認することもできます。

于 2013-09-26T02:21:42.027 に答える