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到虚存空间,栈空间的增长方向是从高地址到低地址。
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。可以看出本段内存是进程通过mmap映射的一段空间,是匿名映射。在pthread2程序中,正好用malloc分配了一个1MB的内存,能够与这段内存对应。同时,malloc分配的地址0x7754e008正落在该区间,并且偏向区间低地址部分,说明该区间是个堆地址空间。说明了这段1M的内存确实是进程调用malloc分配的,其中malloc又调用mmap系统调用匿名映射。
栈段[stack],下面用几个例子来说明栈段。
bfd50000-bfd65000 rw-p bffea000 00:00 0 [stack]
对于单线程应用程序而言,只有一个[stack]段,对应多线程应用程序,[stack]段是主线程的栈空间,子线程的栈空间则用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创建的子线程的栈空间
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正是子线程的栈地址空间。另外,对栈空间,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文件中就增加了两条记录,分别是子线程的栈空间和栈保护页的记录。默认情况下,pthread为子线程预留的栈空间大小为1MB,栈保护页为4KB(这主要跟页大小相关)。
总之,proc maps文件可以查看进程的内存映射,每一段内存的权限属性等信息。
---------------------
作者:cjpx84
来源:CSDN
原文:https://blog.csdn.net/lijzheng/article/details/23618365
版权声明:本文为博主原创文章,转载请附上博文链接!
相关文章:
【ACM】熊孩子的乐趣
题目链接:http://acm.nuc.edu.cn/OJ/contest/show/43/1000 【问题描述】 Alice跟Bob是学校里出了名的两个熊孩子,会在任何事情上争个高低,彼此都不服输。幼儿园的老师每次分糖果的时候看到这两个熊孩子也很头疼,两个人都想占便宜…

mysql insertOrUpdate 方法
为什么80%的码农都做不了架构师?>>> 自己对这个方法又有点小心得 分享下 https://my.oschina.net/hccake/blog/777225 mysql "ON DUPLICATE KEY UPDATE" 语法 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导…

软件破解工具整理收集
1.调试工具softice 2.调试工具Trw2000 3.反汇编工具Wdasm8.93 4.Hiew 5.Visual Basic程序调试工具Smartcheck 6.十六进制编辑器(如:Ultraedit、WinHex、Hex Workshop 等) 7.注册表监视工具RegShot、regmon或RegSnap 8.侦测文件类型工具…

Linux 下 UltraEdit 版本: 16.1.0.18 破解 30 天试用限制
rm -rfd ~/.idm/uex rm -rf ~/.idm/*.spl rm -rf /tmp/*.spl

【ACM】杭电OJ 2149
Public Sale 【问题描述】 虽然不想,但是现实总归是现实,Lele始终没有逃过退学的命运,因为他没有拿到奖学金。现在等待他的,就是像FarmJohn一样的农田生涯。 要种田得有田才行,Lele听说街上正在举行一场别开生面的拍…

PV UV IP
UV (网站独立访客) 编辑UV是unique visitor的简写,是指通过互联网访问、浏览这个网页的自然人。独立IP:是指独立用户/独立访客。指访问某个站点或点击某条新闻的不同IP地址的人数,在同一天的00:00-24:00内,…
VBA中级班课时3小结
本课内容:工作簿和工作表对象 主讲:rover18 学习时间:2010年11月 本节课将学习工作簿对象Workbooks、Workbook与工作表对象Worksheets、Worksheet。在我们了解了VBA的四大要素——对象、属性、方法和事件后,会发现VBA的程序是对对…

解决firefox ubuntu无法打开页面的问题
firefox备份用户配置信息 https://support.mozilla.org/zh-CN/kb/%E5%A4%87%E4%BB%BD%E4%BD%A0%E7%9A%84%E4%BF%A1%E6%81%AF 把xxxxxxxx.default 覆盖掉xxxxxxxx.default-release里面的内容

js构造函数式编程
1.函数式编程 //创建和初始化地图函数:function initMap(){createMap();//创建地图setMapEvent();//设置地图事件addMapControl();//向地图添加控件}//创建地图函数:function createMap(){var map new BMap.Map("dituContent");//在百度地图容…
【ACM】绝地求生
题目链接:http://acm.nuc.edu.cn/OJ/contest/show/43/1009 【问题描述】 zbt最近喜欢上了《绝地求生》(pubg)游戏,pubg这个游戏有一种跑毒机制,每次会产生一个圆形的安全区,玩家需要从他的当前位置在一定时间内进入安…
【oracle】dblink创建
目的:oracle中跨数据库查询 两台数据库服务器db_A(本地)和db_B(远程192.168.1.100),db_A下用户user_a 需要访问到db_B下user_b的数据解决:查询得知使用dblink(即database link 数据库链)实现过程:1、确定用户user_a有没有创建 db…

ASan(Linux),gcc4.8以上版本自带的内存检查工具
转自:http://shafeng.github.io/2017/05/10/asan/ 最近线上的程序总是莫名其妙崩溃,因为我们的项目使用了分布负载的机制,对于玩家的影响其实很小,但是我肯定是忍不了的…程序崩溃的core文件里面完全找不到问题所在,初步分析应该是野指针导致,仔细分析程序之后并没有…

详解使用DockerHub官方的mysql镜像生成容器
为什么80%的码农都做不了架构师?>>> 写在前面:看到网上关于利用DockerHub官方的mysql镜像生成容器此类的文档比较少,故结合自身实践分享给大家,还望多多指教。 我的需求:利用docker 镜像快速建立一个mysql…
【ACM】奇怪的回文数
题目链接:http://acm.nuc.edu.cn/OJ/contest/show/43/1008 【问题描述】 “回文”是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。 在数学中也有这样一类数字有这样的特征…
java I/O之装饰者模式
装饰者: Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案。 装饰者模式意图: 动态的给一个对象添加额外的职责。Decorator比生产子类灵…

ubuntu下wireshark添加root权限
wireshark要监控eth0,但是必须要root权限才行。但是,直接用root运行程序是相当危险,也是非常不方便的。 解决方法如下: 1.添加wireshark用户组sudo groupadd wireshark 2.将dumpcap更改为wireshark用户组sudo chgrp wireshark /…

Oracle导出空表解决办法
在oracle 11g 中,发现传统的exp不能导出空的表 oracle 11g 新增了一个参数:deferred_segment_creation,含义是段延迟创建,默认是true。具体是什么意思呢? 如果这个参数设置为true,你新建了一个表T1…

【ACM】图像分类
题目链接:http://acm.nuc.edu.cn/OJ/contest/show/43/1003 【问题描述】 现在, 我们需要你来解决一项图像分类任务。 首先我们需要介绍下简单图像的数据存储形式,你可以粗略的认为图像在数字意义就是一个二维矩阵(我们这里不考虑…
【译】如何精确判断最终用户响应时间过长的原因?
译者:原始文章有点性能测试工具软文的感觉,毕竟文章来源于某工具官方博客。高手请略过。 对于我这种新手,此文还是给我带来一些惊喜,从上到下地,从表象到根源地,定位他们遇到性能问题-响应时间过长-的根本原…

javascript中重要概念-闭包-深入理解
在上次的分享中javascript--函数参数与闭包--详解,对闭包的解释不够深入。本人经过一段时间的学习,对闭包的概念又有了新的理解。于是便把学习的过程整理成文章,一是为了加深自己闭包的理解,二是给读者提供学习的途径,…

ssl握手过程和ca证书验证
转载:https://www.cnblogs.com/cposture/p/9029014.html SSL 认证 可以将 SSL 服务器与客户端之间的通信配置为使用单向或双向 SSL 认证。 单向 SSL 认证一般是客户端利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是…
【ACM】练武奇才
题目链接:http://acm.nuc.edu.cn/OJ/contest/show/43/1005 【问题描述】 很久很久以前,constbh大神还在上着小学。一天,在放学的路上,他被一位乞丐叫住,这位乞丐对constbh说,我看你骨骼惊奇,…

Bat命令学习
参考资料:http://www.cnblogs.com/SunShineYPH/archive/2011/12/13/2285570.html

记一次CentOS7内核kernel的删除重装
人生在于折腾,学习Linux更要多多折腾。在一次折腾中吸取教训,更易于记忆。今天我们来折腾Linux的内核:删除系统内核后,通过光盘进行kernel的重安装。友情提示:请在虚拟机环境进行,折腾前务必做好系统快照。…

tcpdump抓包并保存到远程服务器
有的时候,运行tcpdump抓包进程的主机A可能没有足够的硬盘空间。例如我们使用树霉派搭建了一个热点,然后我们想在树霉派上抓包,因为树霉派的存储很小,所以很容易在短时间内将存储空间使用完。 为了解决该问题,我们可以…
【ACM】家喻户晓的中药店(待更)
题目链接:http://acm.nuc.edu.cn/OJ/contest/show/43/1007 【问题描述】 long_xiao和const_hhh是一对恩爱的夫妻。 他们在京城经营着一家中药店,夫妻二人医术精湛、古道热肠,虽然年过花甲,身体依然硬朗。更重要的是ÿ…

常用MySQL的命令集锦
常用MySQL的命令集锦 一、连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1、例1:连接到本机上的MYSQL。 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码…

google的gn构建系统
什么是GN? GN是一个生成Ninja构建文件的元构建系统,以便你可以用Ninja构建Chromium。 你为什么从GYP切换? 我们相信GN文件比GYP文件更具可读性和可维护性。GN很快: GN比GYP快20倍。GN支持作为构建的一部分,根据Ninj…
【ACM】五子棋
题目链接:http://acm.nuc.edu.cn/OJ/contest/show/25/1009 【问题描述】 五子棋想必大家都玩过,如果没有那我只能重新介绍一下规则了,当横竖斜(共八个方向)出现5个同色棋子时,则认为该颜色棋的选手获胜。…

源码编译安装httpd及其常见错误
一、编译安装的整体步骤 1、在官网下载源码,并解压2、切换到其目录中 3、执行./configure4、编译 二、编译中及安装后配置常见的参数及其说明编译中配置1)指定安装路径--prefix/usr/local/Pacakage_name 指定安装路径--sysconfigdir/etc/Package_name …