Linux下 /proc/maps 文件分析(轉)

Linux下 /proc/maps 文件分析 收藏 
From:http://blog.csdn.net/wenxy1/archive/2008/12/23/3591243.aspx
/proc/<PID>/maps
查看進程的虛擬地址空間是如何使用的。
該文件有6列,分別爲:
地址:庫在進程裏地址範圍
權限:虛擬內存的權限,r=讀,w=寫,x=,s=共享,p=私有;
偏移量:庫在進程裏地址範圍
設備:映像文件的主設備號和次設備號;
節點:映像文件的節點號;
路徑: 映像文件的路徑
每項都與一個vm_area_struct結構成員對應,
範例:
應用程序的正文段(權限爲r-xp)從0x08048000到0x08049000,大小爲4096;數據段從0x08049000到 0x0804a000,大小爲1KB。該應用程序使用了兩個庫:lib和libc。Libc 的正文段從0x00391000到0x004b4000,大小爲1164KB;數據段從0x004b5000到0x004b8000,大小爲12KB.
Ld 的正文段從00378000到0038d000,大小爲84KB;數據段從0x0038e000到0x0038f000,大小爲4KB。該應用程序所使用的庫所佔的虛擬空間的大小從0x4b8000到0x378000,大小爲1280KB,其實真正大小爲VmLib(1251KB);因爲是按頁分配,每頁大小爲4KB。
[root@localhost ~]# cat /proc/7114/maps
08047000-080dc000 r-xp 00000000 03:06 884901 /bin/bash
080dc000-080e3000 rwxp 00094000 03:06 884901 /bin/bash
080e3000-08129000 rwxp 080e3000 00:00 0 [heap]
4d575000-4d58a000 r-xp 00000000 03:06 736549 /lib/ld-2.3.4.so
4d58a000-4d58b000 r-xp 00015000 03:06 736549 /lib/ld-2.3.4.so
4d58b000-4d58c000 rwxp 00016000 03:06 736549 /lib/ld-2.3.4.so
4d58e000-4d6b1000 r-xp 00000000 03:06 736550 /lib/tls/libc-2.3.4.so
4d6b1000-4d6b2000 r-xp 00123000 03:06 736550 /lib/tls/libc-2.3.4.so
4d6b2000-4d6b5000 rwxp 00124000 03:06 736550 /lib/tls/libc-2.3.4.so
4d6b5000-4d6b7000 rwxp 4d6b5000 00:00 0
4d6de000-4d6e0000 r-xp 00000000 03:06 736552 /lib/libdl-2.3.4.so
4d6e0000-4d6e2000 rwxp 00001000 03:06 736552 /lib/libdl-2.3.4.so
4d807000-4d80a000 r-xp 00000000 03:06 736567 /lib/libtermcap.so.2.0.8
4d80a000-4d80b000 rwxp 00002000 03:06 736567 /lib/libtermcap.so.2.0.8
b7bf2000-b7c1e000 r-xp 00000000 03:06 881337 /usr/lib/gconv/GB18030.so
b7c1e000-b7c20000 rwxp 0002b000 03:06 881337 /usr/lib/gconv/GB18030.so
b7c20000-b7c26000 r-xs 00000000 03:06 881502 /usr/lib/gconv/gconv-modules.cache
b7c26000-b7d2f000 r-xp 02197000 03:06 852489 /usr/lib/locale/locale-archive
b7d2f000-b7f2f000 r-xp 00000000 03:06 852489 /usr/lib/locale/locale-archive
b7f2f000-b7f38000 r-xp 00000000 03:06 734450 /lib/libnss_files-2.3.4.so
b7f38000-b7f3a000 rwxp 00008000 03:06 734450 /lib/libnss_files-2.3.4.so
b7f3a000-b7f3c000 rwxp b7f3a000 00:00 0
b7f51000-b7f52000 rwxp b7f51000 00:00 0
bfc3d000-bfc52000 rw-p bfc3d000 00:00 0 [[color=Red]stack][/color]
ffffe000-fffff000 ---p 00000000 00:00 0 [[color=Red]vdso[/color]]
[root@localhost ~]#
參數 解釋
address: 0085d000-00872000 虛擬內存區域的起始和終止地址文件所佔的地址空間
perms:rw-p 權限:r=read, w=write, x=execute, s=shared, p=private(copy on write)
offset: 00000000 虛擬內存區域在被映射文件中的偏移量
dev: 03:08 文件的主設備號和次設備號
inode: 設備的節點號,0表示沒有節點與內存相對應
name: /lib/ld-2.3.4.so 被映射文件的文件名
各共享庫的代碼段,存放着二進制可執行的機器指令,是由kernel把該庫ELF文件的代碼段map到虛存空間;
各共享庫的數據段,存放着程序執行所需的全局變量,是由kernel把ELF文件的數據段map到虛存空間;
用戶代碼段,存放着二進制形式的可執行的機器指令,是由kernel把ELF文件的代碼段map到虛存空間;
用戶數據段之上是代碼段,存放着程序執行所需的全局變量,是由kernel把ELF文件的數據段map到虛存空間;
用戶數據段之下是堆(heap),當且僅當malloc調用時存在,是由kernel把匿名內存map到虛存空間,堆則在程序中沒有調用malloc的情況下不存在;
用戶數據段之下是棧(stack),作爲進程的臨時數據區,是由kernel把匿名內存map到虛存空間,棧空間的增長方向是從高地址到低地址。
[root@localhost ~]# ldd /bin/bash
linux-gate.so.1 => (0xffffe000)
libtermcap.so.2 => /lib/libtermcap.so.2 (0x4d807000)
libdl.so.2 => /lib/libdl.so.2 (0x4d6de000)
libc.so.6 => /lib/tls/libc.so.6 (0x4d58e000)
/lib/ld-linux.so.2 (0x4d575000)
[root@localhost ~]#
這個所謂的"linux-gate.so.1"的內容就是內核映射的代碼,系統中其實並不存在這樣一個鏈接庫文件,它的名字是由ldd自己起的,了 0xffffe400這裏的一段代碼,這裏就是內核爲我們映射的系統調用入口代碼。Mapped是該應用程序的虛擬空間的大小,這裏的值比用top 或ps都大了4KB,就是最後0xffffe400-0xffffffff的代碼;shared 給出共享的虛擬空間部分。


maps 只能用cat 查看,使用vi或vim時,會發出maps全爲空.
maps可以幫助尋找bug所在的位置,即debug中有epc位置可以據maps找出是出在具體的哪個.so或其它文檔;然後nm反彙編其文檔,尋找相對偏移量的位置,就能找到問題所發生的行。
發佈了14 篇原創文章 · 獲贊 15 · 訪問量 54萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章