不同进程的相同虚拟地址与虚拟内存的对应关系疑问
CSAPP虚拟内存章节的误区澄清与问题解答
关键理解偏差纠正
- 虚拟内存是磁盘与物理内存的抽象层,并非仅存储在磁盘上。进程的虚拟页可能处于三种状态:缓存至物理内存、驻留在磁盘交换分区、或直接对应可执行文件/共享库中的只读段(如代码段)。
- 磁盘上的页没有“唯一虚拟地址”。虚拟地址是进程私有空间标识,不同进程的相同虚拟地址可映射至磁盘不同位置,也可共享同一磁盘位置(如只读代码页)。
核心问题解答
不同进程的相同虚拟页如何映射到磁盘?
每个进程的页表完全独立,虚拟页号(页表偏移对应的标识)仅对当前进程的虚拟地址空间有效,与磁盘位置无固定绑定。操作系统初始化进程页表时:
- 若为同一可执行文件启动的进程,只读代码段会被映射至磁盘上该可执行文件的对应位置(操作系统让多进程共享这些只读页,节省资源)。
- 可读可写的数据段、栈、堆则为每个进程分配独立的磁盘映射(如交换分区中的私有页),即便虚拟地址相同,页表指向的磁盘位置也完全不同。
为何两个进程的代码段虚拟地址均为0x400000?
这是操作系统默认的内存布局(关闭地址空间布局随机化ASLR时更明显),目的是简化链接器与加载器的工作。但虚拟地址相同不代表磁盘映射相同:
- 同一可执行文件的多个进程:确实共享磁盘上的同一代码页(只读属性保证无冲突)。
- 不同可执行文件的进程:即便虚拟地址都是
0x400000,页表会将其分别映射至各自可执行文件的代码段位置,互不干扰。
举个实例:两次启动ls命令,两个进程的代码段虚拟地址均为0x400000,它们共享/bin/ls文件中的代码页;但同时启动ls与cat,即便二者代码段虚拟地址相同,页表会分别映射至/bin/ls和/bin/cat的代码段,彼此独立。
内容的提问来源于stack exchange,提问作者X_Cloud
相关产品推荐
相关产品推荐

