You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不同进程的相同虚拟地址与虚拟内存的对应关系疑问

CSAPP虚拟内存章节的误区澄清与问题解答

关键理解偏差纠正

  • 虚拟内存是磁盘与物理内存的抽象层,并非仅存储在磁盘上。进程的虚拟页可能处于三种状态:缓存至物理内存、驻留在磁盘交换分区、或直接对应可执行文件/共享库中的只读段(如代码段)。
  • 磁盘上的页没有“唯一虚拟地址”。虚拟地址是进程私有空间标识,不同进程的相同虚拟地址可映射至磁盘不同位置,也可共享同一磁盘位置(如只读代码页)。

核心问题解答

不同进程的相同虚拟页如何映射到磁盘?

每个进程的页表完全独立,虚拟页号(页表偏移对应的标识)仅对当前进程的虚拟地址空间有效,与磁盘位置无固定绑定。操作系统初始化进程页表时:

  • 若为同一可执行文件启动的进程,只读代码段会被映射至磁盘上该可执行文件的对应位置(操作系统让多进程共享这些只读页,节省资源)。
  • 可读可写的数据段、栈、堆则为每个进程分配独立的磁盘映射(如交换分区中的私有页),即便虚拟地址相同,页表指向的磁盘位置也完全不同。

为何两个进程的代码段虚拟地址均为0x400000?

这是操作系统默认的内存布局(关闭地址空间布局随机化ASLR时更明显),目的是简化链接器与加载器的工作。但虚拟地址相同不代表磁盘映射相同:

  • 同一可执行文件的多个进程:确实共享磁盘上的同一代码页(只读属性保证无冲突)。
  • 不同可执行文件的进程:即便虚拟地址都是0x400000,页表会将其分别映射至各自可执行文件的代码段位置,互不干扰。

举个实例:两次启动ls命令,两个进程的代码段虚拟地址均为0x400000,它们共享/bin/ls文件中的代码页;但同时启动ls与cat,即便二者代码段虚拟地址相同,页表会分别映射至/bin/ls和/bin/cat的代码段,彼此独立。

内容的提问来源于stack exchange,提问作者X_Cloud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 14:33:28