首页 理论教育 伪文件/proc/[pid]/maps详解

伪文件/proc/[pid]/maps详解

时间:2023-11-22 理论教育 版权反馈
【摘要】:首先介绍一个proc文件系统的伪文件/proc/[pid]/maps。第五列是十进制无符号整数表示的inode号。第六列是映射文件的文件名,有两种情况没有对应的映射文件,一种是特殊的地址段,如heap,另一种是匿名地址映射。上例中,有两段特殊地址前面没有介绍,一个是vdso,另一个是vsyscall。vsyscall地址区包含一些数据和指令,用来实现虚拟的系统调用,免去用户态和内核态切换的开销。vsyscall出现得早,它的局限之一是地址固定,不能做随机化。vdso克服了这个局限,可以随机化。

伪文件/proc/[pid]/maps详解

首先介绍一个proc文件系统的伪文件/proc/[pid]/maps。它列出了一个进程的虚拟内存布局看一个例子:

第一列是地址,格式是“起点-终点”。第二列是权限,前三个字符对应读、写和执行。第四个字符有“p”和“s”两个值,取值“p”表示对这部分内存的修改不会让其他映射了同样文件的进程看到,也不会写到所映射的文件中;取值“s”表示对这部分内存的修改会被其他映射同样文件的进程看到,并且会写入所映射的文件。第三列是一个十六进制整数,表示文件偏移意思是自偏移开始映射文件内容到内存。第四列是设备号,格式为“主设备号:从设备号”。第五列是十进制无符号整数表示的inode号。第六列是映射文件的文件名,有两种情况没有对应的映射文件,一种是特殊的地址段,如heap,另一种是匿名地址映射。(www.xing528.com)

上例中,有两段特殊地址前面没有介绍,一个是vdso,另一个是vsyscall。它们两个的作用一样,都用来提高用户态进程调用某些不需要特权的系统调用的速度。什么是不需要特权的系统调用?一个经典的例子是系统调用gettimeofday。它所需要做的就是读一块存有时间数据的内核内存。而只要允许用户态进程以只读方式访问这块内存,就可以避免耗费资源的用户态和内核态转换。vsyscall地址区包含一些数据和指令,用来实现虚拟的系统调用,免去用户态和内核态切换的开销。vsyscall出现得早,它的局限之一是地址固定,不能做随机化。vdso克服了这个局限,可以随机化。在x86架构下,vdso区域的地址在stack之上。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈