簡體   English   中英

查找地址所屬的頁面

[英]Find which page an address belongs to

我可以很容易地找到內存中緩沖區的地址,如下所示:

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

有什么辦法可以打印出緩沖區所屬頁面的地址?

[編輯]我在Linux機器上,確切地說是Ubuntu。 我對32位和64位版本感到好奇。

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)

現在,下面的緩沖區地址屬於下面的[stack]段。

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文檔。 但是,我們的緩沖區屬於最后一個條目,該條目包含有關頁面和基地址的信息以及其他一些有用的信息(例如頁面的臟狀態和全部)。 希望這可能有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM