查看实际使用中的内存区域

来源:互联网 发布:夷陵之战 知乎 编辑:程序博客网 时间:2024/05/18 01:52

都从书本上读到过一个用户程序在运行时在内存中的镜像。通过下面的方法可以打印出给定进程的内存空间(mm_struct)和其中所含的内存区域(对应结构体vm_area_struct)。


有两种方法用来查看该信息:

1 cat /proc/<pid>/maps

2 pmap <pid>


写个简单的用户程序:

#include <stdio.h>

#include <unistd.h>


int main(int argc,char *argv[])

{

while(1)

{

printf("I am here\n");

sleep(3);

//写这个程序的时候,我不记得sleep函数的头文件了,发现了个好方法,man 3 sleep.Linux 命令行下查看到sleep函数的手册中头文件的信息。好用。

}

return 0;

}


下面截图,列出该进程地址空间中包含的内存区域。其中有代码段,数据段,堆,栈等,因为使用了库函数。所以含有libc.so和ld.so.


(1)首先运行用户程序后,使用ps ax | grep <进程名>

来获得pid。

(2)使用方法二 pmap <pid>

起始地址 该内存区域大小 访问权限 文件(使用第一种方法还可以看到主从设备号)

 

1、首先我们看到的是代码段(第一行),只读数据(这个是什么我还不知道,第二行),数据段(第三行),第四行是匿名映射的

2、接下来是库函数的内存区域(三行);

3、这里为何有两个,不连续的12k大小的权限相同的匿名段,还不清楚;下面有个可读可执行的4k大小的匿名段,这个是什么还不是很清楚。

4、接下来是ld库函数;

5、最后是栈。在用户地址空间的高处。


相关知识:

内核使用do_mmap()函数(kernel 2.6.34.在3.6中我没找到这个函数)创建一个新的线性地址空间

static inline unsigned long do_mmap(struct file *file, unsigned long addr,
unsigned long len, unsigned long prot,
unsigned long flag, unsigned long offset).

该函数映射由file指定的文件,具体映射的是文件中从偏移offset处开始,长度为len字节的范围内的数据。如果file参数是NULL并且offset参数也是0,那么就代表这次映射没有和文件相关,该情况叫做匿名映射(anonymous mapping)。否则就是文件映射。

没有映射文件的内存区域的设备标识为00:00,索引节点也是0.这个区域就是零页(在分配物理内存时,内核会将该页全部初始化为零。)

原创粉丝点击