# pmap -x 2538
2538: /usr/sbin/sshd
Address Kbytes RSS Anon Locked Mode Mapping
00110000 8 - - - r-x-- libutil-2.5.so
00112000 4 - - - r-x-- libutil-2.5.so
00113000 4 - - - rwx-- libutil-2.5.so
00114000 72 - - - r-x-- libz.so.1.2.3
00126000 4 - - - rwx-- libz.so.1.2.3
Address:进程所占的地址空间
Kbytes 该虚拟段的大小
RSS 设备号(主设备:次设备)
Anon 设备的节点号,0表示没有节点与内存相对应
Locked 是否允许swapped
Mode 权限:r=read, w=write, x=execute, s=shared, p=private(copy on write)
Mapping: bash 对应的映像文件名
[root@localhost ~]# cat /proc/7114/maps
08047000-080dc000 r-xp 00000000 03:06 884901 /bin/bash
080dc000-080e3000 rwxp 00094000 03:06 884901 /bin/bash
080e3000-08129000 rwxp 080e3000 00:00 0 [heap]
4d575000-4d58a000 r-xp 00000000 03:06 736549 /lib/ld-2.3.4.so
4d58a000-4d58b000 r-xp 00015000 03:06 736549 /lib/ld-2.3.4.so
/proc/#/mpas:
address: 0085d000-00872000 虚拟内存区域的起始和终止地址文件所占的地址空间
perms:rw-p 权限:r=read, w=write, x=execute, s=shared, p=private(copy on write)
offset: 00000000 虚拟内存区域在被映射文件中的偏移量
dev: 03:08 文件的主设备号和次设备号
inode: 设备的节点号,0表示没有节点与内存相对应
name: /lib/ld-2.3.4.so 被映射文件的文件名
各共享库的代码段,存放着二进制可执行的机器指令,是由kernel把该库ELF文件的代码段map到虚存空间;
各共享库的数据段,存放着程序执行所需的全局变量,是由kernel把ELF文件的数据段map到虚存空间;
用户代码段,存放着二进制形式的可执行的机器指令,是由kernel把ELF文件的代码段map到虚存空间;
用户数据段之上是代码段,存放着程序执行所需的全局变量,是由kernel把ELF文件的数据段map到虚存空间;
用户数据段之下是堆(heap),当且仅当malloc调用时存在,是由kernel把匿名内存map到虚存空间,堆则在程序中没有调用malloc的情况下不存在;
用户数据段之下是栈(stack),作为进程的临时数据区,是由kernel把匿名内存map到虚存空间,栈空间的增长方向是从高地址到低地址。
[root@localhost ~]# ldd /bin/bash
linux-gate.so.1 => (0xffffe000)
libtermcap.so.2 => /lib/libtermcap.so.2 (0x4d807000)
libdl.so.2 => /lib/libdl.so.2 (0x4d6de000)
libc.so.6 => /lib/tls/libc.so.6 (0x4d58e000)
/lib/ld-linux.so.2 (0x4d575000)
[root@localhost ~]#
这个所谓的"linux-gate.so.1"的内容就是内核映射的代码,系统中其实并不存在这样一个链接库文件,它的名字是由ldd自己起的,了0xffffe400这里的一段代码,这里就是内核为我们映射的系统调用入口代码。Mapped是该应用程序的虚拟空间的大小,这里的值比用top 或ps都大了4KB,就是最后0xffffe400-0xffffffff的代码;shared 给出共享的虚拟空间部分。