maps文件的每一列概述如下
第一列 | 表示该内存段的起始地址 |
第二列 | 表示该内存段对应的权限 |
第三列 | 如果内存段的信息是文件映射,该列为内存段中的信息在文件中的映射页的偏移 |
第四列 | 如果内存段的信息是文件映射,该列为文件所在的设备号 若是匿名映射,设备号为00:00 |
第五列 | 如果内存段的信息是文件映射,该列为文件的文件索引号 若是匿名隐射,文件索引号为0 |
第六列 | 如果是内存段的信息是文件映射,该列为映射的文件名 若是匿名隐射,该列信息可能是映射到的栈[stack]或者其他数据区 |
文件映射:信息对应到磁盘上的具体的文件上,需要open,或者read 进行文件操作的
匿名隐射:信息对应到内存中的一些堆栈内,如malloc,new,创建出来的变量
更细节可参考此帖:http://bbs.csdn.net/topics/391860037 或自行搜索
举例说明如下
运行一个getchar()程序,通过该进程的id查看该进程运行时对应的内存分布,
每一行对应的是程序中不同的内存段
第一行详解:
00400000-00401000表示的是该内存段的起始地址和结束地址;
r-xp表示的是该内存段是可读(read),可执行(excute),私有(personal);
00000000表示的是该内存段的信息映射到文件节点1326446对应的文件的偏移页为00000000对应的信息,将该页的信息拷贝到该内存段
08:04 是设备号,linux 对于每个设备都抽象成设备文件进行管理操作,每一个设备由主设备号(确定是哪一类设备)和次设备号(确定该类下具体一个设备)结合确定,可以通过cat /proc/devices 可以查看到主设备号对应的主设备类型,在我的电脑中 8 对应的设备类型为sd,是硬盘类,所有的设备文件都存放在/dev下,可以进一步的查看该设备号对应的设备,如下图,对应的为sda4,是硬盘的sda4分区
1326446 为当前可执行文件的文件索引节点号,也就是inode的索引号,可以通过该索引号,找到一个inode对象,通过该对象可以可以找改文件在磁盘上的具体位置
/home/woder/docum....../HelloWorld-getchar对应的就是映射文件名。
此例子对应的前三行分别是代码段,只读数据区,读写私有数据区,这里让我疑惑的是第一行和第二行对应的第三列,也就是代码段和只读数据区映射页偏移为什么都是00000000,有可能这两者的信息都在同一个页上吧
参考博客:
linux proc maps文件分析: http://blog.csdn.net/lijzheng/article/details/23618365