日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

linux proc/xx/maps文件分析

發布時間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux proc/xx/maps文件分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載:https://blog.csdn.net/lijzheng/article/details/23618365

Proc/pid/maps顯示進程映射了的內存區域和訪問權限。對應內核中的操作集為proc_pid_maps_op,具體的導出函數為show_map。內核中進程的一段地址空間用一個vm_area_struct結構體表示,所有地址空間存儲在task->mm->mmap鏈表中。

一個文件可以映射到進程的一段內存區域中,映射的文件描述符保存在vm_area_struct->vm_file域中,這種內存區域叫做有名內存區域,相反,屬于匿名映射內存區域。Vm_area_struct每項對應解析如下表所示:

內核每進程的vm_area_struct項
?? ?

/proc/pid/maps中的項
?? ?

含義

vm_start
?? ?

“-”前一列,如00377000
?? ?

此段虛擬地址空間起始地址

vm_end
?? ?

“-”后一列,如00390000
?? ?

此段虛擬地址空間結束地址

vm_flags
?? ?

第三列,如r-xp
?? ?

此段虛擬地址空間的屬性。每種屬性用一個字段表示,r表示可讀,w表示可寫,x表示可執行,p和s共用一個字段,互斥關系,p表示私有段,s表示共享段,如果沒有相應權限,則用’-’代替

vm_pgoff
?? ?

第四列,如00000000
?? ?

對有名映射,表示此段虛擬內存起始地址在文件中以頁為單位的偏移。對匿名映射,它等于0或者vm_start/PAGE_SIZE

vm_file->f_dentry->d_inode->i_sb->s_dev
?? ?

第五列,如fd:00
?? ?

映射文件所屬設備號。對匿名映射來說,因為沒有文件在磁盤上,所以沒有設備號,始終為00:00。對有名映射來說,是映射的文件所在設備的設備號

vm_file->f_dentry->d_inode->i_ino
?? ?

第六列,如9176473
?? ?

映射文件所屬節點號。對匿名映射來說,因為沒有文件在磁盤上,所以沒有節點號,始終為00:00。對有名映射來說,是映射的文件的節點號

?
?? ?

第七列,如/lib/ld-2.5.so
?? ?

對有名來說,是映射的文件名。對匿名映射來說,是此段虛擬內存在進程中的角色。[stack]表示在進程中作為棧使用,[heap]表示堆。其余情況則無顯示

下面一起看下一個proc maps的例子。

cat /proc/19970/task/19970/maps

001f7000-00212000 r-xp 00000000 fd:00 2719760??? /lib/ld-2.5.so

00212000-00213000 r-xp 0001a000 fd:00 2719760??? /lib/ld-2.5.so

00213000-00214000 rwxp 0001b000 fd:00 2719760??? /lib/ld-2.5.so

00214000-0036b000 r-xp 00000000 fd:00 2719767??? /lib/libc-2.5.so

0036b000-0036d000 r-xp 00157000 fd:00 2719767??? /lib/libc-2.5.so

0036d000-0036e000 rwxp 00159000 fd:00 2719767??? /lib/libc-2.5.so

0036e000-00371000 rwxp 0036e000 00:00 0

0054f000-00565000 r-xp 00000000 fd:00 2719791??? /lib/libpthread-2.5.so

00565000-00566000 r-xp 00015000 fd:00 2719791??? /lib/libpthread-2.5.so

00566000-00567000 rwxp 00016000 fd:00 2719791??? /lib/libpthread-2.5.so

00567000-00569000 rwxp 00567000 00:00 0

006f5000-006f6000 r-xp 006f5000 00:00 0????????? [vdso]

08048000-08049000 r-xp 00000000 fd:00 3145810??? /home/lijz/code/pthread

08049000-0804a000 rw-p 00000000 fd:00 3145810??? /home/lijz/code/pthread

08c50000-08c71000 rw-p 08c50000 00:00 0????????? [heap]

b75d7000-b75d8000 ---p b75d7000 00:00 0

b75d8000-b7fda000 rw-p b75d8000 00:00 0

b7fe4000-b7fe5000 rw-p b7fe4000 00:00 0

bf987000-bf99c000 rw-p bffea000 00:00 0????????? [stack]

????? 進程的每段地址空間由struct vm_area_struct 描述。如上所示的每一行對應一個vm_area_struct結構體。一個文件可以映射到內存中,vm_area_struct的vm_file保存了文件描述符,這種映射稱為有名映射,反之則為匿名映射。下面以第十四行為例,解釋各例的內容。

第一列:08049000-0804a000-----本段內存映射的虛擬地址空間范圍,對應vm_area_struct中的vm_start和vm_end。

第二列:rw-p----權限 r-讀,w-寫 x-可執行 p-私有,對應vm_flags。

第三列:00000000----針對有名映射,指本段映射地址在文件中的偏移,對應vm_pgoff。對匿名映射而言,為vm_area_struct->vm_start。

第四列:fd:00----所映射的文件所屬設備的設備號,對應vm_file->f_dentry->d_inode->i_sb->s_dev。匿名映射為0。其中fd為主設備號,00為次設備號。

第五列:3145810----文件的索引節點號,對應vm_file->f_dentry->d_inode->i_ino,與ls –i顯示的內容相符。匿名映射為0。

第六列:/home/lijz/code/pthread---所映射的文件名。對有名映射而言,是映射的文件名,對匿名映射來說,是此段內存在進程中的作用。[stack]表示本段內存作為棧來使用,[heap]作為堆來使用,其他情況則為無。

?????? 經過上面的分析,proc maps中的每一列代表的意思已經非常清晰了。接下來看下proc每maps中每一行的解析。各共享庫的代碼段,存放著二進制可執行的機器指令,由kernel把該庫ELF文件的代碼段map到虛存空間;各共享庫的數據段,存放著程序執行所需的全局變量,由kernel把ELF文件的數據段map到虛存空間;用戶代碼段,存放著二進制形式的可執行的機器指令,由kernel把ELF文件的代碼段map到虛存空間;用戶數據段,存放著程序執行所需的全局變量,由kernel把ELF文件的數據段map到虛存空間;堆(heap),當且僅當malloc調用時存在,由kernel把匿名內存map到虛存空間,堆則在程序中沒有調用malloc的情況下不存在;棧(stack),作為進程的臨時數據區,由kernel把匿名內存map到虛存空間,??臻g的增長方向是從高地址到低地址。

pthread這個應用程序在maps中占用了兩行,內容如下:

08048000-08049000 r-xp 00000000 fd:00 3145810??? /home/lijz/code/pthread

08049000-0804a000 rw-p 00000000 fd:00 3145810??? /home/lijz/code/pthread

?

? 其中第一行的權限是只讀,并且可執行,說明第一行是應用程序的代碼段,而第二行的權限是可讀可寫,但是沒有執行權限,說明該段是pthread的數據段。

00c56000-00dad000 r-xp 00000000 fd:00 2719767??? /lib/libc-2.5.so

00dad000-00daf000 r-xp 00157000 fd:00 2719767??? /lib/libc-2.5.so

00daf000-00db0000 rwxp 00159000 fd:00 2719767??? /lib/libc-2.5.so

以上是libc-2.5共享庫在maps文件中的記錄,每個共享庫在maps文件中對應著三行,分別是數據段與代碼段。

堆[heap]段。

08c64000-08c85000 rw-p 08c64000 00:00 0????????? [heap]

????? 有些maps文件并不會出現該記錄,這主要跟程序中有無使用malloc相關,如果主線程使用了malloc就會有該記錄,否則就沒有。在子線程中調用malloc,會產生另外的堆映射,但是并不會標記[heap]。例如,在子線程中動態分配1MB的內存空間,pthread2應用程序的執行結果如下所示:

tid addr 0xbfd818f0

child thread run

stackbase 0xb7f4f3c0

stackaddr =0x7754e008----malloc分配的地址

guardsize 4096

對應的maps文件:

08048000-08049000 r-xp 00000000 fd:00 3145811??? /home/lijz/code/pthread2

08049000-0804a000 rw-p 00000000 fd:00 3145811??? /home/lijz/code/pthread2

0945a000-0947b000 rw-p 0945a000 00:00 0????????? [heap]

7754e000-b754f000 rw-p 7754e000 00:00 0 -----------區間大小正是1MB

b754f000-b7550000 ---p b754f000 00:00 0

b7550000-b7f52000 rw-p b7550000 00:00 0

b7f5c000-b7f5d000 rw-p b7f5c000 00:00 0

bfd6e000-bfd83000 rw-p bffea000 00:00 0????????? [stack]

??? maps文件中紅色標注的行,從內容上看,本段內存大小是1MB,權限為讀寫私有,偏移為本段內存的開始地址,設備號和文件索引節點為0??梢钥闯霰径蝺却媸沁M程通過mmap映射的一段空間,是匿名映射。在pthread2程序中,正好用malloc分配了一個1MB的內存,能夠與這段內存對應。同時,malloc分配的地址0x7754e008正落在該區間,并且偏向區間低地址部分,說明該區間是個堆地址空間。說明了這段1M的內存確實是進程調用malloc分配的,其中malloc又調用mmap系統調用匿名映射。

棧段[stack],下面用幾個例子來說明棧段。

bfd50000-bfd65000 rw-p bffea000 00:00 0????????? [stack]

對于單線程應用程序而言,只有一個[stack]段,對應多線程應用程序,[stack]段是主線程的??臻g,子線程的??臻g則用pthread庫自動分配。

?例1,將一個單線程的應用的局部變量的地址打印出來,執行的結果如下所示:

?./pthread2

tid addr 0xbfc73600

對應的maps文件:

08048000-08049000 r-xp 00000000 fd:00 3145811??? /home/lijz/code/pthread2

08049000-0804a000 rw-p 00000000 fd:00 3145811??? /home/lijz/code/pthread2

b7f7e000-b7f80000 rw-p b7f7e000 00:00 0

b7f8a000-b7f8b000 rw-p b7f8a000 00:00 0

bfc5f000-bfc74000 rw-p bffea000 00:00 0????????? [stack]

局部變量的地址0xbfc73600在[stack]區間。

例2:將一個擁有一個子線程的應用局部變量打印出來,執行的結果如下所示:

tid addr 0xbfd64740---------主線程中打印的局部變量地址

child thread run

stackaddr?? 0xb7fc93c4--------子線程中打印的局部變量地址

guardsize 4096---------棧保護頁大小

對應的maps文件如下:

08048000-08049000 r-xp 00000000 fd:00 3145811??? /home/lijz/code/pthread2

08049000-0804a000 rw-p 00000000 fd:00 3145811??? /home/lijz/code/pthread2

08c64000-08c85000 rw-p 08c64000 00:00 0????????? [heap]

b75c9000-b75ca000 ---p b75c9000 00:00 0---------pthread_create默認的棧溢出保護區

b75ca000-b7fcc000 rw-p b75ca000 00:000------------pthread_create創建的子線程的??臻g

b7fd6000-b7fd7000 rw-p b7fd6000 00:00 0------------------4KB應該也是通過mmap產生的匿名映射

bfd50000-bfd65000 rw-p bffea000 00:00 0????????? [stack]---------主進程的棧空間

?

?????? 由上執行結果顯示,主線程中局部變量地址0xbfd64740落在[stack]區間,而子線程局部變量地址0xb7fc93c4則落在b75ca000-b7fcc000 rw-p b75ca00區間,并且局部變量的地址從高地址開始分配,說明該VMA正是子線程的棧地址空間。另外,對??臻g,pthread默認設置了一個4KB的棧保護頁,對應的區間為:b75c9000-b75ca000---p b75c9000,該區間不可讀,不可寫,也不能執行,通過這些屬性信息的設置,可以達到棧溢出保護的作用。

例3:在例2的基礎上,多創建一個線程,pthread2程序的執行結果如下所示:

./pthread2

tid addr 0xbfc81610----------主線程局部變量地址

child thread run

stackaddr = 0xb7f183c0-------子線程1局部變量地址

guardsize 4096

child thread2 run

stackaddr =0xb75173c4 ----------子線程局部變量地址

guardsize 4096

對應的maps文件:

08048000-08049000 r-xp 00000000 fd:00 3145811??? /home/lijz/code/pthread2

08049000-0804a000 rw-p 00000000 fd:00 3145811??? /home/lijz/code/pthread2

092d6000-092f7000 rw-p 092d6000 00:00 0????????? [heap]

76b16000-b6b17000 rw-p 76b16000 00:00 0 ----------mallocmmap

b6b17000-b6b18000 ---p b6b17000 00:00 0

b6b18000-b7518000 rw-p b6b18000 00:000---------pthread thread2 stack space

b7518000-b7519000 ---p b7518000 00:00 0???????????????????????????????????? ?

b7519000-b7f1b000 rw-p b7519000 00:000----------pthread thread1 stack space

b7f25000-b7f26000 rw-p b7f25000 00:00 0

bfc6e000-bfc83000 rw-p bffea000 00:00 0????????? [stack]---main thread stack space

?

?從maps文件記錄上看,增加一個子線程,在maps文件中就增加了兩條記錄,分別是子線程的??臻g和棧保護頁的記錄。默認情況下,pthread為子線程預留的棧空間大小為1MB,棧保護頁為4KB(這主要跟頁大小相關)。

? 總之,proc maps文件可以查看進程的內存映射,每一段內存的權限屬性等信息。
---------------------
作者:cjpx84
來源:CSDN
原文:https://blog.csdn.net/lijzheng/article/details/23618365
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

總結

以上是生活随笔為你收集整理的linux proc/xx/maps文件分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。