使用cat /proc/进程id/maps 查看进程内存映射
proc/<PID>/maps
查看進(jìn)程的虛擬地址空間是如何使用的。
該文件有6列,分別為:
地址:庫(kù)在進(jìn)程里地址范圍
權(quán)限:虛擬內(nèi)存的權(quán)限,r=讀,w=寫(xiě),x=,s=共享,p=私有;
偏移量:庫(kù)在進(jìn)程里地址范圍
設(shè)備:映像文件的主設(shè)備號(hào)和次設(shè)備號(hào);
節(jié)點(diǎn):映像文件的節(jié)點(diǎn)號(hào);
路徑: 映像文件的路徑
每項(xiàng)都與一個(gè)vm_area_struct結(jié)構(gòu)成員對(duì)應(yīng)
C語(yǔ)言代碼
#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文件
執(zhí)行該文件
#./a.out
查看執(zhí)行該文件對(duì)應(yīng)的進(jìn)程
#ps au
可以看到2200就是我們需要的pid
#cat /proc/2200/maps
參數(shù) 解釋
address: 0085d000-00872000 虛擬內(nèi)存區(qū)域的起始和終止地址文件所占的地址空間
perms:rw-p 權(quán)限:r=read, w=write, x=execute, s=shared, p=private(copy on write)
offset: 00000000 虛擬內(nèi)存區(qū)域在被映射文件中的偏移量
dev: 03:08 文件的主設(shè)備號(hào)和次設(shè)備號(hào)
inode: 設(shè)備的節(jié)點(diǎn)號(hào),0表示沒(méi)有節(jié)點(diǎn)與內(nèi)存相對(duì)應(yīng)
name: /lib/ld-2.2.12.so 被映射文件的文件名
各共享庫(kù)的代碼段,存放著二進(jìn)制可執(zhí)行的機(jī)器指令,是由kernel把該庫(kù)ELF文件的代碼段map到虛存空間;
各共享庫(kù)的數(shù)據(jù)段,存放著程序執(zhí)行所需的全局變量,是由kernel把ELF文件的數(shù)據(jù)段map到虛存空間;
用戶代碼段,存放著二進(jìn)制形式的可執(zhí)行的機(jī)器指令,是由kernel把ELF文件的代碼段map到虛存空間;
用戶數(shù)據(jù)段之上是代碼段,存放著程序執(zhí)行所需的全局變量,是由kernel把ELF文件的數(shù)據(jù)段map到虛存空間;
用戶數(shù)據(jù)段之下是堆(heap),當(dāng)且僅當(dāng)malloc調(diào)用時(shí)存在,是由kernel把匿名內(nèi)存map到虛存空間,堆則在程序中沒(méi)有調(diào)用malloc的情況下不存在;
用戶數(shù)據(jù)段之下是棧(stack),作為進(jìn)程的臨時(shí)數(shù)據(jù)區(qū),是由kernel把匿名內(nèi)存map到虛存空間,棧空間的增長(zhǎng)方向是從高地址到低地址。
#cat /proc/2200/statm
499 96 83 1 0 62 0
分別是
size:任務(wù)虛擬地址空間大小
Resident:正在使用的物理內(nèi)存大小
Shared:共享頁(yè)數(shù)
Trs:程序所擁有的可執(zhí)行虛擬內(nèi)存大小
Lrs:被映像倒任務(wù)的虛擬內(nèi)存空間的庫(kù)的大小
Drs:程序數(shù)據(jù)段和用戶態(tài)的棧的大小
dt:臟頁(yè)數(shù)量
查看根進(jìn)程
#cat /proc/1/statm
總結(jié)
以上是生活随笔為你收集整理的使用cat /proc/进程id/maps 查看进程内存映射的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux环境ddd安装与使用
- 下一篇: 汇编语言使用C库函数和Linux动态链接