进程内存分布-分析/proc/pid/maps段映射

下面是一个可执行程序执行时对应的内存映射

[root@izbp1irxwqt7ei21awv6wvz ~]# cat /proc/12098/maps
00400000-00401000 r-xp 00000000 fd:01 139198                             /root/elf_write/ftrace/main
00600000-00601000 r--p 00000000 fd:01 139198                             /root/elf_write/ftrace/main
00601000-00602000 rw-p 00001000 fd:01 139198                             /root/elf_write/ftrace/main
020c2000-020e3000 rw-p 00000000 00:00 0                                  [heap]
7f787763b000-7f78777f3000 r-xp 00000000 fd:01 1049989                    /usr/lib64/libc-2.17.so
7f78777f3000-7f78779f3000 ---p 001b8000 fd:01 1049989                    /usr/lib64/libc-2.17.so
7f78779f3000-7f78779f7000 r--p 001b8000 fd:01 1049989                    /usr/lib64/libc-2.17.so
7f78779f7000-7f78779f9000 rw-p 001bc000 fd:01 1049989                    /usr/lib64/libc-2.17.so
7f78779f9000-7f78779fe000 rw-p 00000000 00:00 0 
7f78779fe000-7f7877a1f000 r-xp 00000000 fd:01 1049982                    /usr/lib64/ld-2.17.so
7f7877c14000-7f7877c17000 rw-p 00000000 00:00 0 
7f7877c1d000-7f7877c1f000 rw-p 00000000 00:00 0 
7f7877c1f000-7f7877c20000 r--p 00021000 fd:01 1049982                    /usr/lib64/ld-2.17.so
7f7877c20000-7f7877c21000 rw-p 00022000 fd:01 1049982                    /usr/lib64/ld-2.17.so
7f7877c21000-7f7877c22000 rw-p 00000000 00:00 0 
7ffdd73c8000-7ffdd73e9000 rw-p 00000000 00:00 0                          [stack]
7ffdd73f4000-7ffdd73f6000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

第一列为起始地址vm_start和终止地址vm_end

第二列为内存的权限 r-读 w-写 x-执行 p-私有段,s-共享段

第三列对有名映射,表示此段虚拟内存起始地址在文件中以页为单位的偏移。对匿名映射,它等于0或者vm_start/PAGE_SIZE

第四列为映射文件所对应的主次设备号,没有对应的文件比如堆 heap,那么为 00:00

第五列为映射文件所属的inode号

第六列为文件路径或者描述


可执行文件中,代码段直接映射到 0x400000 - 0x401000 当中,数据段直接映射到 0x600000 - 0x602000 中,其中前一页大小为只读,后面一页为可读可写

我们知道,.bss 段在可执行文件中是不占用实际空间的(只占用节头和符号描述两个结构体大小空间),所以当可执行程序执行时,代码段、数据段都映射完后,会在数据段的末尾再初始化上节 .bss 上指定的大小为0即可。


下面是一张32位进程的内存布局图



扩展阅读 The Memory Layout of a 64-bit Linux Process


上一篇: 分析修改ELF目标文件(3)
下一篇: 让动态库可以执行
作者邮箱: 203328517@qq.com