/proc/maps

部署运行你感兴趣的模型镜像

文件 ---- /proc/<PID>/maps


查看进程的虚拟地址空间是如何使用的。
该文件有6列,分别为:
地址:库在进程里地址范围
权限:虚拟内存的权限,r=读,w=写,x=执行,s=共享,p=私有;
偏移量:库在进程里地址偏移量
设备:映像文件的主设备号和次设备号,可以通过通过 cat /proc/devices查看设备号对应的设备名
节点:映像文件的节点号;
路径: 映像文件的路径,经常同一个地址有两个地址范围,那是因为一段是r-xp为只读的代码段,一段是rwxp为可读写的数据段。
每项都与一个vm_area_struct结构成员对应


下面举个例子

应用程序xpashell的代码段范围是08048000-09138000,大小为4096字节;数据段范围是09138000-0940e000,大小为2D6000字节。在看共享库libnss_files.so.2,其代码段和数据段分别为f5a52000-f5a5a000 和 f5a5a000-f5a5b000

[root@localhost ~]# cat /proc/7465/maps
08048000-09138000 r-xp 00000000 08:03 9814092                            /home/apple/xpashell/bin/xpashell
09138000-0940e000 rwxp 010f0000 08:03 9814092                            /home/apple/xpashell/bin/xpashell
0940e000-0963e000 rwxp 0940e000 00:00 0                                  [heap]
f23a5000-f23a6000 ---p f23a5000 00:00 0
f23a6000-f2ba6000 rwxp f23a6000 00:00 0
f2ba6000-f2ba7000 ---p f2ba6000 00:00 0
f2ba7000-f33a7000 rwxp f2ba7000 00:00 0
f33a7000-f33a8000 ---p f33a7000 00:00 0
f33a8000-f3ba8000 rwxp f33a8000 00:00 0
f3ba8000-f3ba9000 ---p f3ba8000 00:00 0
f3ba9000-f48fe000 rwxp f3ba9000 00:00 0
f48fe000-f48ff000 ---p f48fe000 00:00 0
f48ff000-f50ff000 rwxp f48ff000 00:00 0
f50ff000-f5100000 ---p f50ff000 00:00 0
f5100000-f5900000 rwxp f5100000 00:00 0
f5900000-f5a00000 rwxp f5900000 00:00 0
f5a52000-f5a5a000 r-xp 00000000 08:02 5821326                            /lib/jix/32/libnss_files.so.2
f5a5a000-f5a5b000 rwxp 00007000 08:02 5821326                            /lib/jix/32/libnss_files.so.2
f5a5b000-f5aca000 rwxp f5a5b000 00:00 0
f5aca000-f5acb000 ---p f5aca000 00:00 0
f5acb000-f62cb000 rwxp f5acb000 00:00 0
f62cb000-f62cc000 ---p f62cb000 00:00 0
f62cc000-f6acc000 rwxp f62cc000 00:00 0
f6acc000-f6acd000 ---p f6acc000 00:00 0
f6acd000-f72ce000 rwxp f6acd000 00:00 0
f72ce000-f72cf000 ---p f72ce000 00:00 0
f72cf000-f7ad1000 rwxp f72cf000 00:00 0
f7ad1000-f7ad3000 r-xp 00000000 08:02 5821320                            /lib/jix/32/libdl.so.2
f7ad3000-f7ad4000 rwxp 00001000 08:02 5821320                            /lib/jix/32/libdl.so.2
f7ad4000-f7adb000 r-xp 00000000 08:02 5821329                            /lib/jix/32/librt.so.1
f7adb000-f7adc000 rwxp 00006000 08:02 5821329                            /lib/jix/32/librt.so.1
f7adc000-f7add000 rwxp f7adc000 00:00 0
f7add000-f7be5000 r-xp 00000000 08:02 5821317                            /lib/jix/32/libc.so.6
f7be5000-f7bed000 rwxp 00108000 08:02 5821317                            /lib/jix/32/libc.so.6
f7bed000-f7bef000 rwxp f7bed000 00:00 0
f7bef000-f7bf7000 r-xp 00000000 08:02 5821321                            /lib/jix/32/libgcc_s.so.1
f7bf7000-f7bf8000 rwxp 00007000 08:02 5821321                            /lib/jix/32/libgcc_s.so.1
f7bf8000-f7c19000 r-xp 00000000 08:02 5821323                            /lib/jix/32/libm.so.6
f7c19000-f7c1a000 rwxp 00020000 08:02 5821323                            /lib/jix/32/libm.so.6
f7c1a000-f7cca000 r-xp 00000000 08:02 5821330                            /lib/jix/32/libstdc++.so.6
f7cca000-f7ce1000 rwxp 000b0000 08:02 5821330                            /lib/jix/32/libstdc++.so.6
f7ce1000-f7ce7000 rwxp f7ce1000 00:00 0
f7ce7000-f7e0e000 r-xp 00000000 08:02 5821331                            /lib/jix/32/libxml2.so.2
f7e0e000-f7e13000 rwxp 00126000 08:02 5821331                            /lib/jix/32/libxml2.so.2
f7e13000-f7e14000 rwxp f7e13000 00:00 0
f7e14000-f7f2a000 r-xp 00000000 08:02 5821316                            /lib/jix/32/libboost_regex-gcc-mt-d-1_33.so.1.33.0
f7f2a000-f7f45000 rwxp 00116000 08:02 5821316                            /lib/jix/32/libboost_regex-gcc-mt-d-1_33.so.1.33.0
f7f45000-f7f46000 rwxp f7f45000 00:00 0
f7f46000-f7f48000 r-xp 00000000 08:02 5821318                            /lib/jix/32/libcharset.so.1
f7f48000-f7f49000 rwxp 00001000 08:02 5821318                            /lib/jix/32/libcharset.so.1
f7f49000-f7f57000 r-xp 00000000 08:02 5821327                            /lib/jix/32/libpthread.so.0
f7f57000-f7f58000 rwxp 0000e000 08:02 5821327                            /lib/jix/32/libpthread.so.0
f7f58000-f7f5b000 rwxp f7f58000 00:00 0
f7f5b000-f7f70000 r-xp 00000000 08:02 5821315                            /lib/jix/32/ld-linux.so.2
f7f70000-f7f71000 rwxp 00014000 08:02 5821315                            /lib/jix/32/ld-linux.so.2
ffe5f000-ffe6a000 rw-p ffe5f000 00:00 0                                  [stack]
ffffe000-fffff000 r-xp ffffe000 00:00 0
[root@localhost ~]#


各共享库的代码段,存放着二进制可执行的机器指令,是由kernel把该库ELF文件的代码段map到虚存空间;
各共享库的数据段,存放着程序执行所需的全局变量,是由kernel把ELF文件的数据段map到虚存空间;
用户代码段,存放着二进制形式的可执行的机器指令,是由kernel把ELF文件的代码段map到虚存空间;
用户数据段,存放着程序执行所需的全局变量,是由kernel把ELF文件的数据段map到虚存空间;
堆(heap),当且仅当malloc调用时存在,是由kernel把匿名内存map到虚存空间,堆则在程序中没有调用malloc的情况下不存在;
栈(stack),作为进程的临时数据区,是由kernel把匿名内存map到虚存空间,栈空间的增长方向是从高地址到低地址。

xms-hmos:/proc/7465 # ldd /home/apple/xpashell/bin/xpashell
        linux-gate.so.1 =>  (0xffffe000)
        libpthread.so.0 => /lib/jix/32/libpthread.so.0 (0xf7f6f000)
        libcharset.so.1 => /lib/jix/32/libcharset.so.1 (0xf7f6c000)
        libboost_regex-gcc-mt-d-1_33.so.1.33.0 => /lib/jix/32/libboost_regex-gcc-mt-d-1_33.so.1.33.0 (0xf7e3a000)
        libxml2.so.2 => /lib/jix/32/libxml2.so.2 (0xf7d0d000)
        libstdc++.so.6 => /lib/jix/32/libstdc++.so.6 (0xf7c40000)
        libm.so.6 => /lib/jix/32/libm.so.6 (0xf7c1e000)
        libgcc_s.so.1 => /lib/jix/32/libgcc_s.so.1 (0xf7c15000)
        libc.so.6 => /lib/jix/32/libc.so.6 (0xf7b03000)
        /lib/jix/32/ld-linux.so.2 (0xf7f81000)
        librt.so.1 => /lib/jix/32/librt.so.1 (0xf7afa000)
        libdl.so.2 => /lib/jix/32/libdl.so.2 (0xf7af7000)

通过ldd命令可以看到其依赖的库,这里的"linux-gate.so.1"的内容就是内核映射的代码,系统中其实并不存在这样一个链接库文件,而是ldd虚拟的,0xffffe000这里就是内核为我们映射的系统调用入口代码。

您可能感兴趣的与本文相关的镜像

HunyuanVideo-Foley

HunyuanVideo-Foley

语音合成

HunyuanVideo-Foley是由腾讯混元2025年8月28日宣布开源端到端视频音效生成模型,用户只需输入视频和文字,就能为视频匹配电影级音效

### `/proc/pid/maps` 文件详解 Linux 中的 `/proc/pid/maps` 文件用于展示指定进程(由 `pid` 标识)的虚拟内存映射信息。该文件包含了进程的虚拟地址空间分布,包括起始和结束地址、权限、偏移量、设备和 inode 信息,以及映射的文件名(如果有的话)[^1]。 #### 文件格式解析 `/proc/pid/maps` 文件中的每一行代表一个内存映射区域(VMA,Virtual Memory Area)。每一行的内容由多个字段组成,具体如下: 1. **地址范围**:表示该内存区域的起始地址和结束地址,例如 `55f4e7a6a000-55f4e7a6c000`。 2. **权限**:表示该内存区域的访问权限,例如 `r--p` 表示可读但不可写和不可执行。 - `r`:可读 - `w`:可写 - `x`:可执行 - `s`:共享内存 - `p`:私有内存 3. **偏移量**:表示该内存区域在文件中的偏移量,例如 `00000000`。 4. **设备号**:表示映射文件所在的设备,例如 `08:01`。 5. **inode 号**:表示映射文件的 inode 号,例如 `123456`。 6. **文件路径**:表示该内存区域映射的文件路径,例如 `/usr/bin/ls`。如果该区域是匿名内存(如堆、栈),则会显示 `[heap]` 或 `[stack]`。 #### 示例文件内容解析 ```plaintext 55f4e7a6a000-55f4e7a6c000 r--p 00000000 08:01 123456 /usr/bin/ls 55f4e7a6c000-55f4e7a71000 r-xp 00002000 08:01 123456 /usr/bin/ls 55f4e7a71000-55f4e7a73000 r--p 00007000 08:01 123456 /usr/bin/ls 55f4e7a73000-55f4e7a74000 rw-p 00009000 08:01 123456 /usr/bin/ls 7f8d4b2a0000-7f8d4b4c0000 rw-p 00000000 00:00 0 [heap] 7f8d4b4c0000-7f8d4b4e5000 r--p 00000000 08:01 789012 /usr/lib/libc-2.33.so 7f8d4b4e5000-7f8d4b63d000 r-xp 00025000 08:01 789012 /usr/lib/libc-2.33.so 7f8d4b63d000-7f8d4b68b000 r--p 0017d000 08:01 789012 /usr/lib/libc-2.33.so 7f8d4b68b000-7f8d4b68f000 rw-p 001cb000 08:01 789012 /usr/lib/libc-2.33.so 7f8d4b68f000-7f8d4b69b000 rw-p 00000000 00:00 0 7ffd3c3e0000-7ffd3c401000 rw-p 00000000 00:00 0 [stack] 7ffd3c5f0000-7ffd3c5f4000 r--p 00000000 00:00 0 [vvar] 7ffd3c5f4000-7ffd3c5f6000 r-xp 00000000 00:00 0 [vdso] fffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall] ``` ##### 内存区域类型解析 - **代码段**:例如 `r-xp` 权限的区域,表示可执行的代码段,通常映射到可执行文件的代码部分。 - **数据段**:例如 `r--p` 和 `rw-p` 权限的区域,表示只读和可写的全局变量区域。 - **堆(Heap)**:例如 `[heap]` 区域,表示动态分配的内存区域,通常由 `malloc` 等函数分配。 - **栈(Stack)**:例如 `[stack]` 区域,表示进程的临时数据区,栈空间的增长方向是从高地址到低地址。 - **共享库**:例如 `/usr/lib/libc-2.33.so` 的映射区域,表示共享库的代码段和数据段。 - **特殊区域**: - `[vvar]`:表示虚拟动态变量(VVAR),用于加速系统调用。 - `[vdso]`:表示虚拟动态共享对象(VDSO),用于加速某些系统调用。 - `[vsyscall]`:表示虚拟系统调用(VSYSCALL),用于早期版本的 Linux 系统调用加速。 #### 如何查看 `/proc/pid/maps` 文件 可以通过以下命令查看某个进程的内存映射信息: ```bash cat /proc/<pid>/maps ``` 其中 `<pid>` 是目标进程的进程 ID。 #### 内核实现解析 在 Linux 内核中,`/proc/pid/maps` 文件的生成是通过 `seq_operations` 结构体实现的。`seq_operations` 是一种用于生成序列化输出的机制,通常用于 `/proc` 文件系统的文件生成。具体实现如下: ```c static const struct seq_operations proc_pid_maps_op = { .start = m_start, .next = m_next, .stop = m_stop, .show = show_map }; ``` - `m_start`、`m_next`、`m_stop`:用于控制遍历进程的虚拟内存区域(VMA)。 - `show_map`:用于显示每个 VMA 的信息。 `show_map` 函数进一步调用 `show_map_vma` 函数,最终通过 `seq_file` 操作遍历 VMA 的信息,并将其格式化输出到用户空间。 #### 内存映射的作用 1. **进程调试**:通过分析 `/proc/pid/maps` 文件,可以了解进程的内存布局,帮助调试内存相关的问题。 2. **性能优化**:通过查看内存映射,可以识别频繁访问的内存区域,优化内存使用。 3. **安全分析**:通过分析内存映射,可以检测潜在的安全漏洞,例如栈溢出、堆溢出等问题。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值