1. ホーム
  2. linux

[解決済み] Linuxの/proc/pid/mapsや/proc/self/mapsを理解する。

2022-04-14 01:38:30

質問

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

anonymous inode 0 のエントリは何を意味するのでしょうか? これらは、より大きなメモリセグメントの一部のようです。

解決方法は?

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

address           perms offset  dev   inode   pathname
08048000-08056000 r-xp 00000000 03:0c 64593   /usr/sbin/gpm

  • 住所 - これはプロセスのアドレス空間における領域の開始と終了のアドレスである
  • パーミッション - これは、領域内のページがどのようにアクセスできるかを記述しています。権限には、読み取り、書き込み、実行、共有の4種類があります。read/write/execute が無効の場合は - の代わりに表示されます。 r / w / x . リージョンが 共有 であれば、それは プライベート であるため p が表示され、代わりに s . プロセスが許可されていない方法でメモリにアクセスしようとすると、segmentation fault が生成されます。パーミッションの変更は mprotect システムコールを使用します。
  • オフセット - リージョンがファイルからマッピングされた場合 ( mmap ) 、これはマッピングを開始するファイル内のオフセットです。メモリがファイルからマッピングされていない場合は、0になります。
  • デバイス - 領域がファイルからマップされた場合、これはファイルが存在するメジャーとマイナーのデバイス番号(16進数)です。
  • イノード - 領域がファイルからマップされた場合、これはファイル番号である。
  • パス名 - 地域がファイルからマップされた場合、これはファイルの名前である。このフィールドは匿名マッピングされたリージョンでは空白です。のような名前を持つ特別なリージョンもあります。 [heap] , [stack] または [vdso] . [vdso] は仮想動的共有オブジェクトを意味します。カーネルモードに切り替えるためのシステムコールで使用される。 linux-gate.so.1とは何ですか?

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