組み込みLinuxアプリケーションのメモリ使用量を理解しようとしています。 /proc/pid/maps
ユーティリティ/ファイルは、詳細を確認するのに適したリソースのようです。残念ながら、すべての列とエントリが理解できるわけではありません。
匿名iノード0エントリとはどういう意味ですか?これらは、いくつかの大きなメモリセグメントのようです。
/proc/$PID/maps
の各行は、プロセスまたはスレッド内の連続した仮想メモリの領域を示します。各行には次のフィールドがあります。
address perms offset dev inode pathname
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm
r
/w
/x
の代わりに-
が表示されます。リージョンがsharedではない場合、privateであるため、p
の代わりにs
が表示されます。プロセスが許可されていない方法でメモリにアクセスしようとすると、セグメンテーションフォールトが生成されます。権限は、mprotect
システムコールを使用して変更できます。mmap
を使用)、これはマッピングが開始されるファイル内のオフセットです。メモリがファイルからマップされていない場合、それは0です。[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はそのdevice.0のinodeです。BSS(未初期化データ)の場合のように、inodeはメモリ領域に関連付けられていないことを示します。
パス名フィールドは通常、マッピングをサポートしているファイルになります。 ELFファイルの場合、ELFプログラムヘッダーのオフセットフィールド(readelf -l)を調べることで、オフセットフィールドと簡単に調整できます。
Linux 2.0では、パス名を指定するフィールドはありません。