查找地址所属的页面

时间:2014-03-23 18:38:21

标签: c linux operating-system systems-programming

我可以通过以下方式轻松找到内存中缓冲区的地址: -

int main() {
  char buffer[100];
  printf("%p\n, buffer);
}

有没有办法打印出缓冲区所属页面的地址?

[编辑] 我在Linux机器上,准确地说是Ubuntu。我对32位和64位版本都很好奇。

1 个答案:

答案 0 :(得分:2)

Linux似乎没有提供系统调用,我们可以从中获取此类信息。但是我认为我们可以通过以下步骤获取信息(/ proc目录):

Get the buffer address assume 0x7fffffffe0b0(attach with gdb so that program would pause)
Execute the command(cat /proc/3586/maps)assume PID = 3586 
Execute the command(cat /proc/3586/numa_maps)

现在,以下缓冲区地址属于下面的[堆栈]段。

mantosh@mantosh4u:/proc/3586$ cat maps
00400000-00401000 r-xp 00000000 08:03 5116562                            /home/mantosh/practice/bakwas
00600000-00601000 r--p 00000000 08:03 5116562                            /home/mantosh/practice/bakwas
00601000-00602000 rw-p 00001000 08:03 5116562                            /home/mantosh/practice/bakwas
7ffff7204000-7ffff72ff000 r-xp 00000000 08:03 23336063                   /lib/x86_64-linux-gnu/libm-2.15.so
7ffff72ff000-7ffff74fe000 ---p 000fb000 08:03 23336063                   /lib/x86_64-linux-gnu/libm-2.15.so
7ffff74fe000-7ffff74ff000 r--p 000fa000 08:03 23336063                   /lib/x86_64-linux-gnu/libm-2.15.so
7ffff74ff000-7ffff7500000 rw-p 000fb000 08:03 23336063                   /lib/x86_64-linux-gnu/libm-2.15.so
7ffff7500000-7ffff76b5000 r-xp 00000000 08:03 23334413                   /lib/x86_64-linux-gnu/libc-2.15.so
7ffff76b5000-7ffff78b5000 ---p 001b5000 08:03 23334413                   /lib/x86_64-linux-gnu/libc-2.15.so
7ffff78b5000-7ffff78b9000 r--p 001b5000 08:03 23334413                   /lib/x86_64-linux-gnu/libc-2.15.so
7ffff78b9000-7ffff78bb000 rw-p 001b9000 08:03 23334413                   /lib/x86_64-linux-gnu/libc-2.15.so
7ffff78bb000-7ffff78c0000 rw-p 00000000 00:00 0 
7ffff78c0000-7ffff78d5000 r-xp 00000000 08:03 23331018                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7ffff78d5000-7ffff7ad4000 ---p 00015000 08:03 23331018                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7ffff7ad4000-7ffff7ad5000 r--p 00014000 08:03 23331018                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7ffff7ad5000-7ffff7ad6000 rw-p 00015000 08:03 23331018                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7ffff7ad6000-7ffff7bbc000 r-xp 00000000 08:03 1573341                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.18
7ffff7bbc000-7ffff7dbb000 ---p 000e6000 08:03 1573341                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.18
7ffff7dbb000-7ffff7dc3000 r--p 000e5000 08:03 1573341                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.18
7ffff7dc3000-7ffff7dc5000 rw-p 000ed000 08:03 1573341                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.18
7ffff7dc5000-7ffff7dda000 rw-p 00000000 00:00 0 
7ffff7dda000-7ffff7dfc000 r-xp 00000000 08:03 23336064                   /lib/x86_64-linux-gnu/ld-2.15.so
7ffff7fd2000-7ffff7fd7000 rw-p 00000000 00:00 0 
7ffff7ff8000-7ffff7ffb000 rw-p 00000000 00:00 0 
7ffff7ffb000-7ffff7ffc000 r-xp 00000000 00:00 0                          [vdso]
7ffff7ffc000-7ffff7ffd000 r--p 00022000 08:03 23336064                   /lib/x86_64-linux-gnu/ld-2.15.so
7ffff7ffd000-7ffff7fff000 rw-p 00023000 08:03 23336064                   /lib/x86_64-linux-gnu/ld-2.15.so
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0                          [stack]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

我们可以看到上面提到的最后一个命令(numa_maps)的输出

mantosh@mantosh4u:/proc/3586$ cat numa_maps
00400000 default file=/home/mantosh/practice/bakwas anon=1 dirty=1 N0=1
00600000 default file=/home/mantosh/practice/bakwas anon=1 dirty=1 N0=1
00601000 default file=/home/mantosh/practice/bakwas anon=1 dirty=1 N0=1
7ffff7204000 default file=/lib/x86_64-linux-gnu/libm-2.15.so mapped=16 mapmax=52 N0=16
7ffff72ff000 default file=/lib/x86_64-linux-gnu/libm-2.15.so
7ffff74fe000 default file=/lib/x86_64-linux-gnu/libm-2.15.so anon=1 dirty=1 N0=1
7ffff74ff000 default file=/lib/x86_64-linux-gnu/libm-2.15.so anon=1 dirty=1 N0=1
7ffff7500000 default file=/lib/x86_64-linux-gnu/libc-2.15.so anon=1 dirty=1 mapped=63 mapmax=111 N0=63
7ffff76b5000 default file=/lib/x86_64-linux-gnu/libc-2.15.so
7ffff78b5000 default file=/lib/x86_64-linux-gnu/libc-2.15.so anon=4 dirty=4 N0=4
7ffff78b9000 default file=/lib/x86_64-linux-gnu/libc-2.15.so anon=2 dirty=2 N0=2
7ffff78bb000 default anon=3 dirty=3 N0=3
7ffff78c0000 default file=/lib/x86_64-linux-gnu/libgcc_s.so.1 mapped=3 mapmax=22 N0=3
7ffff78d5000 default file=/lib/x86_64-linux-gnu/libgcc_s.so.1
7ffff7ad4000 default file=/lib/x86_64-linux-gnu/libgcc_s.so.1 anon=1 dirty=1 N0=1
7ffff7ad5000 default file=/lib/x86_64-linux-gnu/libgcc_s.so.1 anon=1 dirty=1 N0=1
7ffff7ad6000 default file=/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.18 mapped=90 mapmax=20 N0=90
7ffff7bbc000 default file=/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.18
7ffff7dbb000 default file=/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.18 anon=8 dirty=8 N0=8
7ffff7dc3000 default file=/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.18 anon=2 dirty=2 N0=2
7ffff7dc5000 default anon=3 dirty=3 N0=3
7ffff7dda000 default file=/lib/x86_64-linux-gnu/ld-2.15.so anon=1 dirty=1 mapped=27 mapmax=106 N0=27
7ffff7fd2000 default anon=5 dirty=5 N0=5
7ffff7ff8000 default anon=3 dirty=3 N0=3
7ffff7ffb000 default
7ffff7ffc000 default file=/lib/x86_64-linux-gnu/ld-2.15.so anon=1 dirty=1 N0=1
7ffff7ffd000 default file=/lib/x86_64-linux-gnu/ld-2.15.so anon=2 dirty=2 N0=2
7ffffffdd000 default stack anon=2 dirty=2 N0=2

有关每个行条目的更详细信息可以在proc和numa文档中找到。但是我们的缓冲区属于最后一个条目,它包含有关页面和基址的信息以及一些其他有用的信息(如页面的脏状态和所有信息)。希望这可能有用。