使用cat /proc/进程id/maps 查看进程内存映射
proc/<PID>/maps
查看進程的虛擬地址空間是如何使用的。
該文件有6列,分別為:
地址:庫在進程里地址范圍
權限:虛擬內存的權限,r=讀,w=寫,x=,s=共享,p=私有;
偏移量:庫在進程里地址范圍
設備:映像文件的主設備號和次設備號;
節點:映像文件的節點號;
路徑: 映像文件的路徑
每項都與一個vm_area_struct結構成員對應
C語言代碼
#include <stdio.h>
#include <stdlib.h>
int q[200];
int main(void) {
int i, n, *p;
p = (int *) malloc(sizeof(int));
scanf("%d", &n);
for (i=0; i<200; i++)
q[i]=i;
printf("%x %x %x %x %x \n", main, q, p, &i, scanf);
return 0;
}
?
編譯成a.out文件
執行該文件
#./a.out
查看執行該文件對應的進程
#ps au
可以看到2200就是我們需要的pid
#cat /proc/2200/maps
參數 解釋
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.2.12.so 被映射文件的文件名
各共享庫的代碼段,存放著二進制可執行的機器指令,是由kernel把該庫ELF文件的代碼段map到虛存空間;
各共享庫的數據段,存放著程序執行所需的全局變量,是由kernel把ELF文件的數據段map到虛存空間;
用戶代碼段,存放著二進制形式的可執行的機器指令,是由kernel把ELF文件的代碼段map到虛存空間;
用戶數據段之上是代碼段,存放著程序執行所需的全局變量,是由kernel把ELF文件的數據段map到虛存空間;
用戶數據段之下是堆(heap),當且僅當malloc調用時存在,是由kernel把匿名內存map到虛存空間,堆則在程序中沒有調用malloc的情況下不存在;
用戶數據段之下是棧(stack),作為進程的臨時數據區,是由kernel把匿名內存map到虛存空間,棧空間的增長方向是從高地址到低地址。
#cat /proc/2200/statm
499 96 83 1 0 62 0
分別是
size:任務虛擬地址空間大小
Resident:正在使用的物理內存大小
Shared:共享頁數
Trs:程序所擁有的可執行虛擬內存大小
Lrs:被映像倒任務的虛擬內存空間的庫的大小
Drs:程序數據段和用戶態的棧的大小
dt:臟頁數量
查看根進程
#cat /proc/1/statm
總結
以上是生活随笔為你收集整理的使用cat /proc/进程id/maps 查看进程内存映射的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux环境ddd安装与使用
- 下一篇: 汇编语言使用C库函数和Linux动态链接