首页 > 其他分享 >/proc/PID/maps 文件及示例说明

/proc/PID/maps 文件及示例说明

时间:2023-08-17 17:35:20浏览次数:43  
标签:00 rw 示例 00000000 PID maps fd usr lib64

文件及字段说明

这个文件中的内容描述了进程的虚拟内存空间中的不同区域,包括代码段、数据段、堆、栈以及共享库等。
每一行都代表了一个内存区域,并包含以下列:

起始地址和结束地址:内存区域在虚拟内存空间中的起始地址和结束地址。
权限:内存区域的访问权限,如读、写、执行等。
偏移量:内存区域相对于文件的偏移量。对于匿名内存区域,它通常为0。
设备号:如果内存区域映射的是文件,那么设备号表示文件所在的设备。
节点号:如果内存区域映射的是文件,那么节点号表示文件的索引节点号。
文件名:内存区域映射的文件的路径名。对于匿名内存区域,它通常为[heap]或[stack]。

一个bash进程的例子

00400000-004de000 r-xp 00000000 fd:00 50548532                           /usr/bin/bash
006dd000-006de000 r--p 000dd000 fd:00 50548532                           /usr/bin/bash
006de000-006e7000 rw-p 000de000 fd:00 50548532                           /usr/bin/bash
006e7000-006ed000 rw-p 00000000 00:00 0 
01e31000-01e94000 rw-p 00000000 00:00 0                                  [heap]
7f2c0d369000-7f2c138ac000 r--p 00000000 fd:00 50548497                   /usr/lib/locale/locale-archive
7f2c138ac000-7f2c138b8000 r-xp 00000000 fd:00 15685                      /usr/lib64/libnss_files-2.17.so
7f2c138b8000-7f2c13ab7000 ---p 0000c000 fd:00 15685                      /usr/lib64/libnss_files-2.17.so
7f2c13ab7000-7f2c13ab8000 r--p 0000b000 fd:00 15685                      /usr/lib64/libnss_files-2.17.so
7f2c13ab8000-7f2c13ab9000 rw-p 0000c000 fd:00 15685                      /usr/lib64/libnss_files-2.17.so
7f2c13ab9000-7f2c13abf000 rw-p 00000000 00:00 0 
7f2c13abf000-7f2c13c83000 r-xp 00000000 fd:00 15672                      /usr/lib64/libc-2.17.so
7f2c13c83000-7f2c13e82000 ---p 001c4000 fd:00 15672                      /usr/lib64/libc-2.17.so
7f2c13e82000-7f2c13e86000 r--p 001c3000 fd:00 15672                      /usr/lib64/libc-2.17.so
7f2c13e86000-7f2c13e88000 rw-p 001c7000 fd:00 15672                      /usr/lib64/libc-2.17.so
7f2c13e88000-7f2c13e8d000 rw-p 00000000 00:00 0 
7f2c13e8d000-7f2c13e8f000 r-xp 00000000 fd:00 15678                      /usr/lib64/libdl-2.17.so
7f2c13e8f000-7f2c1408f000 ---p 00002000 fd:00 15678                      /usr/lib64/libdl-2.17.so
7f2c1408f000-7f2c14090000 r--p 00002000 fd:00 15678                      /usr/lib64/libdl-2.17.so
7f2c14090000-7f2c14091000 rw-p 00003000 fd:00 15678                      /usr/lib64/libdl-2.17.so
7f2c14091000-7f2c140b6000 r-xp 00000000 fd:00 16034                      /usr/lib64/libtinfo.so.5.9
7f2c140b6000-7f2c142b6000 ---p 00025000 fd:00 16034                      /usr/lib64/libtinfo.so.5.9
7f2c142b6000-7f2c142ba000 r--p 00025000 fd:00 16034                      /usr/lib64/libtinfo.so.5.9
7f2c142ba000-7f2c142bb000 rw-p 00029000 fd:00 16034                      /usr/lib64/libtinfo.so.5.9
7f2c142bb000-7f2c142dd000 r-xp 00000000 fd:00 612831                     /usr/lib64/ld-2.17.so
7f2c144cf000-7f2c144d3000 rw-p 00000000 00:00 0 
7f2c144d3000-7f2c144d4000 rw-p 00000000 00:00 0 
7f2c144d4000-7f2c144db000 r--s 00000000 fd:00 15997                      /usr/lib64/gconv/gconv-modules.cache
7f2c144db000-7f2c144dc000 rw-p 00000000 00:00 0 
7f2c144dc000-7f2c144dd000 r--p 00021000 fd:00 612831                     /usr/lib64/ld-2.17.so
7f2c144dd000-7f2c144de000 rw-p 00022000 fd:00 612831                     /usr/lib64/ld-2.17.so
7f2c144de000-7f2c144df000 rw-p 00000000 00:00 0 
7ffe6d623000-7ffe6d644000 rw-p 00000000 00:00 0                          [stack]
7ffe6d6d0000-7ffe6d6d2000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

以下区域被标记为代码段(文本段):

00400000-004de000 r-xp:这是/usr/bin/bash可执行文件的代码段,具有可执行和只读权限。

下面的区域被标记为数据段

006dd000-006de000 r--p:这是/usr/bin/bash可执行文件的只读数据段。
006de000-006e7000 rw-p:这是/usr/bin/bash可执行文件的可读写数据段。

共享库堆、栈的内存区域,见maps中的文件名。

基于这个文件计算进程的虚拟内存

import re
import sys

def calculate_virtual_memory(pid):
    virtual_memory_size = 0

    with open(f"/proc/{pid}/maps", "r") as f:
        for line in f:
            match = re.match(r"^([0-9a-fA-F]+)-([0-9a-fA-F]+) .*", line)
            if match:
                start_address = int(match.group(1), 16)
                end_address = int(match.group(2), 16)
                virtual_memory_size += end_address - start_address

    return "{:.3f}".format(virtual_memory_size / 1024 / 1024)

# 用进程的PID调用calculate_virtual_memory函数
pid = int(sys.argv[1])

virtual_memory_size = calculate_virtual_memory(pid)
print(f"Virtual memory size for process {pid}: {virtual_memory_size} MB")

执行脚本,看到与ps -aux看到的虚拟内存相比,多了4K

[root@local-test ~]# python3 sum_virtual_mem.py 20080
Virtual memory size for process 20080: 115684.000 KB

[root@local-test ~]# ps aux | head -1 ; ps aux | grep 20080
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     20080  0.0  0.1 115680  2220 pts/1    Ss   Aug16   0:00 -bash

通过一番比对,在不同进程的maps文件中找到了一样的4K大小的内存地址:

[root@local-test ~]# cat /proc/1044/maps | grep vsyscall
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
[root@local-test ~]# 
[root@local-test ~]# cat /proc/20052/maps | grep vsyscall
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

vsyscall 在每个进程的地址空间中都有一个相同的映射区域,是在内核中实现的,而不是由用户进程加载的共享库。

标签:00,rw,示例,00000000,PID,maps,fd,usr,lib64
From: https://www.cnblogs.com/dewan/p/pid_maps.html

相关文章

  • 全选文本框示例
    一、实现效果点击全选按钮/取消全选,控制商品的全选或取消每个商品的复选框都选中后,自动勾上全选按钮,或者商品任何一个复选框没有选中,取消全选二、思路就是由大的全选按钮,控制所有的复选框小的复选框控制大的全选按钮三、js中小的复选框控制大的全选框,用到了一个css伪类......
  • org.mapstruct系列文章汇总
     Mapstruct使用教程  MapStruct:将多个源字段映射到一个目标字段   JAVA字段相同对象之间转换工具推荐   org.mapstruct.Mapper-JavaBean互相转换使用指南&&【踩坑专栏】mapstruct无法生成实现类   ......
  • C#语言学习代码示例
    保留数位namespaceBasicGrammarStudy{classProgram{staticvoidMain(string[]args){Console.WriteLine(string.Format("{0:F3}",13.47483327438));//13.475Console.WriteLine(string.Format("{0......
  • Being stupid is hard.
    \(n\)个元素分成\(m\)份,每份不能为空,在\(n-1\)个空中插入\(m-1\)个板子,方案数\(C_{n-1}^{m-1}\)。为空则加上\(m\)个元素来垫着,就转化为上一个,然后就是\(C_{m-n+1}^{m-1}\)。所以为什么我之前不会插板?我是傻逼吗?然后突然发现,之前一直以为Gameswit......
  • Vue+Element导出Excel表格示例
    <template><div@click="exportFn">导出</div></template><script>exportdefault{data(){return{query:{pageIndex:1,//当前页......
  • 使用Pandas进行数据清理的入门示例
    数据清理是数据分析过程中的关键步骤,它涉及识别缺失值、重复行、异常值和不正确的数据类型。获得干净可靠的数据对于准确的分析和建模非常重要。本文将介绍以下6个经常使用的数据清理操作:检查缺失值、检查重复行、处理离群值、检查所有列的数据类型、删除不必要的列、数据不一......
  • assimp示例1
    #include<assimp/Importer.hpp>//C++importerinterface#include<assimp/scene.h>//Outputdatastructure#include<assimp/postprocess.h>//PostprocessingflagsboolDoTheImportThing(conststd::string&pFile)......
  • API接口对接电商平台高效获取各大电商平台数据,商品详情数据代码示例
     电商可以通过使用API接口获取商品信息数据。API是应用程序编程接口的缩写,它允许程序之间进行通信和数据传输。为了获取商品信息数据,电商可以利用API接口向商品供应商的数据库发送请求,然后接收并解析返回的数据。具体来说,电商可以按照以下步骤利用API接口获取商品信息数据:1.找......
  • JSON生成Form表单的方法示例
    JSON生成Form表单的方法示例 更新时间:2018年11月21日14:21:14 作者:熟悉的陌生人  JSON表单是一个基于React的抽象组件,它可以把JSON数据格式描述的表单转换成项目中的表单,这篇文章主要介绍了JSON生成Form表单的方法示例,感兴趣的小伙伴们可以参考一下 JSON表单描述......
  • WPF 入门笔记 - 07 - MVVM示例
    滴咚,大家好久不见......