Linuxでは、特定のプログラムに対して/ procにアクセスすると、マッピングファイルにそのプログラムのメモリマップが表示されます。
このような:
address perms offset dev inode pathname
00400000-00452000 r-xp 00000000 08:02 173521 /usr/bin/dbus-daemon
00651000-00652000 r--p 00051000 08:02 173521 /usr/bin/dbus-daemon
00652000-00655000 rw-p 00052000 08:02 173521 /usr/bin/dbus-daemon
00e03000-00e24000 rw-p 00000000 00:00 0 [heap]
00e24000-011f7000 rw-p 00000000 00:00 0 [heap]
...
35b1800000-35b1820000 r-xp 00000000 08:02 135522 /usr/lib64/ld-2.15.so
35b1a1f000-35b1a20000 r--p 0001f000 08:02 135522 /usr/lib64/ld-2.15.so
35b1a20000-35b1a21000 rw-p 00020000 08:02 135522 /usr/lib64/ld-2.15.so
35b1a21000-35b1a22000 rw-p 00000000 00:00 0
35b1c00000-35b1dac000 r-xp 00000000 08:02 135870 /usr/lib64/libc-2.15.so
35b1dac000-35b1fac000 ---p 001ac000 08:02 135870 /usr/lib64/libc-2.15.so
35b1fac000-35b1fb0000 r--p 001ac000 08:02 135870 /usr/lib64/libc-2.15.so
35b1fb0000-35b1fb2000 rw-p 001b0000 08:02 135870 /usr/lib64/libc-2.15.so
...
f2c6ff8c000-7f2c7078c000 rw-p 00000000 00:00 0 [stack:986]
...
7fffb2c0d000-7fffb2c2e000 rw-p 00000000 00:00 0 [stack]
7fffb2d48000-7fffb2d49000 r-xp 00000000 00:00 0 [vdso]
カーネルスタックまたはユーザースタックにマップされた[スタック]メモリが何であるかを知りたいです。そして、そのメモリ領域内の内容にどのようにアクセスしますか?
/proc ディレクトリに stack という別のファイルがありますが、proc(5) のマニュアルページで確認するように、これはカーネルスタックです。
また、このプロセスマップになぜ2つの[ヒープ]があるのか知りたいです。
また、プロセス内のすべてのスレッドの[スタック]アドレス範囲を確認したところ、すべてのスレッドに対して同じことがわかりました。スレッドがスタックを共有しない場合、これはどのように可能ですか?
ベストアンサー1
スタック項目については後述する。man 5 proc
:[stack]
メインスレッドのスタックと[stack:986]
スレッド986のスタックです。 4.5以降、後者はカーネルに表示されなくなりました。これも最後の問題を解決します。[stack]
メインスレッドでのみ使用され、他のすべてのスレッドは異なるアドレスに異なるスタックを持ちます。特定のプロセスにマップされた他のメモリと同様に、スタックにアクセスします。
私はほとんどここで推測していますが、両方のヒープは次のように解釈できます。実際、brk
新しいVMAが最終的に割り当てられることがあります。;これはで別の項目として表示されます/proc/…/maps
。ただし、仮想アドレスは常に連続していることに注意してください。