回答:
の各行は/proc/$PID/maps
、プロセスまたはスレッド内の連続した仮想メモリの領域を示しています。各行には次のフィールドがあります。
address perms offset dev inode pathname
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm
-
場合、r
/ w
/の代わりにが表示されx
ます。リージョンが共有されていない場合、それはプライベートなので、のp
代わりにが表示されs
ます。プロセスが許可されていない方法でメモリにアクセスしようとすると、セグメンテーション違反が生成されます。アクセス許可は、mprotect
システムコールを使用して変更できます。mmap
)マッピングされた場合、これはマッピングが開始されるファイル内のオフセットです。メモリがファイルからマップされていない場合、それは0です。[heap]
、[stack]
または[vdso]
。[vdso]
仮想動的共有オブジェクトを表します。カーネルモードに切り替えるためにシステムコールで使用されます。これに関する良い記事があります:「linux-gate.so.1とは何ですか?」多くの匿名領域に気づくかもしれません。これらは通常、によって作成されmmap
ますが、ファイルには添付されません。これらは、ヒープに割り当てられていない共有メモリやバッファなど、さまざまな用途に使用されます。たとえば、pthreadライブラリは匿名のマップされた領域を新しいスレッドのスタックとして使用すると思います。
gpm
は、バイナリファイルをELFヘッダーなどを使用して、最初から仮想アドレスにマッピングしていますか?ローダーは、ファイル全体ではなく、ELFヘッダーを解析して個々のセクションをマップするのではないですか?
確認してください: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では、パス名を指定するフィールドはありません。
proc(5)
mmap(2)
「Linuxカーネルについて」9.3。メモリ領域; 16.2。メモリマッピング「Linux仮想メモリマネージャについて」4.4メモリ領域