Linux / proc / id / mapsを理解する


156

組み込みLinuxアプリケーションのメモリ使用量を理解しようとしています。/proc/pid/mapsユーティリティ/ファイルには、詳細を見るための優れたリソースであるように思われます。残念ながら、すべての列とエントリを理解できません。

匿名のiノード0エントリはどういう意味ですか?これらは、より大きなメモリセグメントの一部のようです。


1
proc(5) mmap(2)「Linuxカーネルについて」9.3。メモリ領域; 16.2。メモリマッピング「Linux仮想メモリマネージャについて」4.4メモリ領域
wRAR

回答:


263

の各行は/proc/$PID/maps、プロセスまたはスレッド内の連続した仮想メモリの領域を示しています。各行には次のフィールドがあります。

address           perms offset  dev   inode   pathname
08048000-08056000 r-xp 00000000 03:0c 64593   /usr/sbin/gpm
  • address-これは、プロセスのアドレス空間内の領域の開始および終了アドレスです
  • 権限 -これは、リージョン内のページにアクセスする方法を説明します。読み取り、書き込み、実行、共有の4つの異なる権限があります。読み取り/書き込み/実行が無効になっている-場合、r/ w/の代わりにが表示されxます。リージョンが共有されていない場合、それはプライベートなので、のp代わりにが表示されsます。プロセスが許可されていない方法でメモリにアクセスしようとすると、セグメンテーション違反が生成されます。アクセス許可は、mprotectシステムコールを使用して変更できます。
  • offset-領域がファイルから(を使用してmmap)マッピングされた場合、これはマッピングが開始されるファイル内のオフセットです。メモリがファイルからマップされていない場合、それは0です。
  • デバイス -領域は、ファイルからマップされた場合、これは(16進数)メジャーとマイナーデバイス番号ファイルの命があります。
  • inode-領域がファイルからマップされた場合、これはファイル番号です。
  • pathname-領域がファイルからマップされた場合、これはファイルの名前です。匿名のマップされた領域の場合、このフィールドは空白です。そこのような名前の特別な領域もあり[heap][stack]または[vdso][vdso]仮想動的共有オブジェクトを表します。カーネルモードに切り替えるためにシステムコールで使用されます。これに関する良い記事があります:「linux-gate.so.1とは何ですか?」

多くの匿名領域に気づくかもしれません。これらは通常、によって作成されmmapますが、ファイルには添付されません。これらは、ヒープに割り当てられていない共有メモリやバッファなど、さまざまな用途に使用されます。たとえば、pthreadライブラリは匿名のマップされた領域を新しいスレッドのスタックとして使用すると思います。


4
はい、pthreadは、スタックオーバーフローの検出用にセクションが小さいスタックに8Mbブロックを割り当てています(私はそう思います)。そのため、作成された各pthreadは、デフォルトで、8Mbのiノード0メモリ領域と4Kbのiノード0領域を割り当てます。
サイモン

したがって、あなたの例でgpmは、バイナリファイルをELFヘッダーなどを使用して、最初から仮想アドレスにマッピングしていますか?ローダーは、ファイル全体ではなく、ELFヘッダーを解析して個々のセクションをマップするのではないですか?
ドミトリーグリゴリーエフ2015

9

メモリマッピングは、ファイルをメモリにマップするためだけでなく、カーネルからRAMを要求するためのツールでもあります。これらは、それらのiノード0エントリです-スタック、ヒープ、BSSセグメントなど


5

確認してください: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はデバイスです(major:minor);

inodeはそのデバイスのiノードです。0は、BSS(初期化されていないデータ)の場合のように、メモリ領域に関連付けられているiノードがないことを示します。

パス名フィールドは通常、マッピングをサポートしているファイルです。ELFファイルの場合、ELFプログラムヘッダーのオフセットフィールド(readelf -l)を調べることにより、オフセットフィールドと簡単に調整できます。

Linux 2.0では、パス名を指定するフィールドはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.