/proc/pid/mapsアドレス(および翻訳)

/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ビット長に変換できますか?

ベストアンサー1

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

/proc/pid/mapsメモリアドレスがそのまま表示される理由は、fs/proc/task_mmu.c最新のカーネルソースツリーの283行にあります(または)。task_nommu.c

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);

これが要約されるのは、16進文字列表現が8桁より短いすべてのメモリアドレスが前にゼロで埋められることです。これより大きい値は、8 桁に切り捨てていないまま表示されます。これはprintk()printfスタイルのフォーマットが機能する方法です。

今、これらすべてから何を得ることができますか?おそらく、メモリアドレスが8桁に切り捨てられる理由についてしばらく考えてみるべきでしょう。これを行うとどんな利点があると思いますか?

おすすめ記事