泛舟湖上清波郎朗
每行/proc/$PID/maps描述进程或线程中连续虚拟内存的区域。每行都有以下字段:address perms offset dev inode pathname08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpmaddress - 这是进程地址空间中区域的起始和结束地址permissions - 描述如何访问区域中的页面。有四种不同的权限:读取,写入,执行和共享。如果禁用读/写/执行,-则会出现a而不是r/ w/ x。如果某个区域未共享,则为私有区域,因此p将显示a而不是s。如果进程尝试以不允许的方式访问内存,则会生成分段错误。可以使用mprotect系统调用更改权限。offset - 如果区域是从文件(使用mmap)映射的,则这是映射开始的文件中的偏移量。如果内存未从文件映射,则它只是0。device - 如果区域是从文件映射的,则这是文件所在的主要和次要设备编号(十六进制)。inode - 如果区域是从文件映射的,则这是文件编号。pathname - 如果区域是从文件映射的,则这是文件的名称。匿名映射区域的此字段为空。此外还有一些与喜欢的名字特殊的区域[heap],[stack]或[vdso]。[vdso]代表虚拟动态共享对象。它被系统调用用于切换到内核模式。这是一篇很好的文章:“什么是linux-gate.so.1?”你可能会注意到很多匿名区域。这些通常由mmap任何文件创建,但不附加到任何文件。它们用于许多杂项内容,例如共享内存或未在堆上分配的缓冲区。例如,我认为pthread库使用匿名映射区域作为新线程的堆栈。