/proc/$PID/maps
の各行 プロセスまたはスレッド内の連続した仮想メモリの領域を表します。各行には次のフィールドがあります:
address perms offset dev inode pathname
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm
- 住所 - これは、プロセスのアドレス空間における領域の開始アドレスと終了アドレスです
- 権限 - これは、リージョン内のページにアクセスする方法を説明します。読み取り、書き込み、実行、および共有の 4 つの異なるアクセス許可があります。読み取り/書き込み/実行が無効になっている場合、
-
r
の代わりに表示されます /w
/x
.地域が共有されていない場合 、それはプライベートです 、だからp
s
の代わりに表示されます .プロセスが許可されていない方法でメモリにアクセスしようとすると、セグメンテーション違反が生成されます。mprotect
を使用して権限を変更できます システムコール。 - オフセット - 領域がファイルからマップされた場合 (
mmap
を使用) )、これは、マッピングが開始されるファイル内のオフセットです。メモリがファイルからマップされていない場合は、0 になります。 - デバイス - リージョンがファイルからマップされた場合、これはファイルが存在するメジャーおよびマイナー デバイス番号 (16 進数) です。
- inode - 領域がファイルからマッピングされた場合、これはファイル番号です。
- パス名 - 領域がファイルからマップされた場合、これはファイルの名前です。匿名のマッピングされたリージョンの場合、このフィールドは空白です。
[heap]
のような名前の特別な領域もあります 、[stack]
、または[vdso]
.[vdso]
仮想動的共有オブジェクトを表します。これは、システム コールでカーネル モードに切り替えるために使用されます。これについては、「linux-gate.so.1 とは何ですか?」という良い記事があります。
多くの匿名領域に気付くかもしれません。これらは通常 mmap
によって作成されます しかし、どのファイルにも添付されていません。それらは、共有メモリやヒープに割り当てられていないバッファーなど、さまざまな用途に使用されます。たとえば、pthread ライブラリは匿名のマップ領域を新しいスレッドのスタックとして使用していると思います。
メモリ マッピングは、ファイルをメモリにマップするために使用されるだけでなく、カーネルから RAM を要求するツールでもあります。これらは i ノード 0 エントリです - スタック、ヒープ、bss セグメントなど
確認してください:http://man7.org/linux/man-pages/man5/proc.5.html
address perms offset dev inode pathname
00400000-00452000 r-xp 00000000 08:02 173521 /usr/bin/dbus-daemon
アドレス フィールドは、マッピングが占有するプロセスのアドレス空間です。
perms フィールドは権限のセットです:
r = read
w = write
x = execute
s = shared
p = private (copy on write)
オフセット フィールドは、ファイルへのオフセットです。
dev はデバイス (メジャー:マイナー) です。
inode は、そのデバイスの inode です。0 は、BSS (初期化されていないデータ) の場合と同様に、メモリ領域に関連付けられている inode がないことを示します。
パス名フィールドは、通常、マッピングをサポートするファイルです。 ELF ファイルの場合、ELF プログラム ヘッダー (readelf -l) のオフセット フィールドを調べることで、オフセット フィールドと簡単に調整できます。
Linux 2.0 では、パス名を指定するフィールドはありません。