web-dev-qa-db-ja.com

/ proc / pid / mapsアドレス(およびそれらを変換)

/ proc/pid/mapsのメモリマップを見ると、さまざまな長さのアドレスが見つかります。

00400000-0042e000 r-xp 00000000 fb:01 268953                             /bin/nano
0062e000-0062f000 r--p 0002e000 fb:01 268953                             /bin/nano
0062f000-00630000 rw-p 0002f000 fb:01 268953                             /bin/nano
0081e000-00906000 rw-p 00000000 00:00 0                                  [heap]
7f8313e5c000-7f8314109000 rw-p 00000000 fb:01 2399989                    /usr/share/misc/magic.mgc
7f8314109000-7f83142ce000 r--p 00000000 fb:01 2759354                    /usr/lib64/locale/locale-archive
7f83142ce000-7f83142d1000 r-xp 00000000 fb:01 1457046                    /lib64/libdl-2.17.so
7f83142d1000-7f83144d0000 ---p 00003000 fb:01 1457046                    /lib64/libdl-2.17.so

次のような8桁の長さの住所があります。

  • 00400000-0042e000

そして、12桁の長さのもの(最後の3桁は常に0です):

  • 7f8313e5c000-7f8314109000

これらのアドレスがこのようにフォーマットされているのはなぜですか。また、8桁の長さに変換できますか?

5
pnohmphen2

まず、アドレスを8桁だけに変換することはできません。メモリアドレスは、8桁で表すことができるよりもはるかに大きな値を持つことができます。

メモリアドレスが_/proc/pid/maps_でそのまま表されている理由は、最近のカーネルソースツリーの_fs/proc/task_mmu.c_(または_task_nommu.c_)の行283にあります。

_283         seq_printf(m, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu ",
284                         start,
285                         end,
286                         flags & VM_READ ? 'r' : '-',
287                         flags & VM_WRITE ? 'w' : '-',
288                         flags & VM_EXEC ? 'x' : '-',
289                         flags & VM_MAYSHARE ? 's' : 'p',
290                         pgoff,
291                         MAJOR(dev), MINOR(dev), ino);
_

つまり、8桁よりも短い16進数の文字列表現を持つメモリアドレスでは、先行ゼロが埋め込まれます。それ以上の値はそのまま表示され、8桁に切り捨てられません。これが、printk()のprintfスタイルのフォーマットが機能する方法です。

これから何を作るのですか?おそらく、メモリアドレスを8桁に切り捨てる理由を考えるのに少し時間がかかるでしょう。そうすることの利点は何だと思いますか?

9
Sami Laine

これらのアドレスは本来あるべきものであり、切り捨てることができるものと考えるべきではありません。マニュアルページをご覧くださいman procとファイルの内容について読む/proc/<pid>/mapsこれらの列の意味の詳細。

抜粋

   /proc/[pid]/maps
          A file containing the currently mapped memory regions and their 
          access permissions.  See mmap(2) for some further information 
          about memory mappings.

          The format of the file is:

   address           perms offset  dev   inode       pathname
   00400000-00452000 r-xp 00000000 08:02 173521      /usr/bin/dbus-daemon
   00651000-00652000 r--p 00051000 08:02 173521      /usr/bin/dbus-daemon
   00652000-00655000 rw-p 00052000 08:02 173521      /usr/bin/dbus-daemon
   00e03000-00e24000 rw-p 00000000 00:00 0           [heap]
   00e24000-011f7000 rw-p 00000000 00:00 0           [heap]
   ...
   35b1800000-35b1820000 r-xp 00000000 08:02 135522  /usr/lib64/ld-2.15.so
   35b1a1f000-35b1a20000 r--p 0001f000 08:02 135522  /usr/lib64/ld-2.15.so

この出力には表示されていない先行ゼロがあるため、アドレスはこのように表示されています。私が作成したこの大まかなawkコマンドを使用すると、適切な先行ゼロが出力に戻され、すべてのアドレスがアドレスに関して考慮されたアドレススペースの全量と並んで表示されます。 。

$ awk '{split($1,a,"-"); $1=sprintf("%16s-%16s",a[1],a[2]); gsub(/ /,"0",$1); \
  printf "%33s %4s %8s %5s %-6s           %7s\n",$1,$2,$3,$4,$5,$6}' \
  /proc/<pid>/maps

これが私のシステムからのサンプルマップファイルです。

$ tail -10 /proc/1607/maps
7f6c3a247000-7f6c3a248000 rw-p 00021000 fd:01 526702                     /usr/lib64/ld-2.17.so
7f6c3a248000-7f6c3a249000 rw-p 00000000 00:00 0 
7f6c3a249000-7f6c3a2ad000 r-xp 00000000 fd:01 529820                     /usr/bin/dbus-daemon
7f6c3a4ac000-7f6c3a4ae000 r--p 00063000 fd:01 529820                     /usr/bin/dbus-daemon
7f6c3a4ae000-7f6c3a4af000 rw-p 00065000 fd:01 529820                     /usr/bin/dbus-daemon
7f6c3a68a000-7f6c3a6ab000 rw-p 00000000 00:00 0                          [heap]
7f6c3a6ab000-7f6c3aace000 rw-p 00000000 00:00 0                          [heap]
7fffce239000-7fffce25a000 rw-p 00000000 00:00 0                          [stack]
7fffce3fe000-7fffce400000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

$ awk '{split($1,a,"-"); $1=sprintf("%16s-%16s",a[1],a[2]); gsub(/ /,"0",$1); \
  printf "%33s %4s %8s %5s %-6s           %7s\n",$1,$2,$3,$4,$5,$6}' \
  <(tail /proc/1607/maps)
00007f6c3a247000-00007f6c3a248000 rw-p 00021000 fd:01 526702           /usr/lib64/ld-2.17.so
00007f6c3a248000-00007f6c3a249000 rw-p 00000000 00:00 0                       
00007f6c3a249000-00007f6c3a2ad000 r-xp 00000000 fd:01 529820           /usr/bin/dbus-daemon
00007f6c3a4ac000-00007f6c3a4ae000 r--p 00063000 fd:01 529820           /usr/bin/dbus-daemon
00007f6c3a4ae000-00007f6c3a4af000 rw-p 00065000 fd:01 529820           /usr/bin/dbus-daemon
00007f6c3a68a000-00007f6c3a6ab000 rw-p 00000000 00:00 0                 [heap]
00007f6c3a6ab000-00007f6c3aace000 rw-p 00000000 00:00 0                 [heap]
00007fffce239000-00007fffce25a000 rw-p 00000000 00:00 0                [stack]
00007fffce3fe000-00007fffce400000 r-xp 00000000 00:00 0                 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                [vsyscall]
3
slm