Appearance
题目
对于采用虚拟内存管理方式的系统,下列关于进程虚拟地址空间的叙述中,错误的是( )。
错因
A
以为进程之间共享一个全局虚拟地址空间。但现代 OS 给每个进程单独建一套页表——同一个虚地址 0x400000 在不同进程里指向各自的物理页,互不可见,这正是"进程隔离"的基础。除非显式用 mmap 做共享映射,否则地址空间天然独立。
B
觉得 malloc 是"分配真实内存"应该返回物理地址。但用户态进程从头到尾都看不到物理地址——malloc 返回的是进程虚地址空间里的一段地址,访问时才由 MMU 翻译成物理地址,物理映射全在底下、用户无感。
C
以为整个进程的内存是同一种权限。实际页表项里就有 R/W/X 标志位(x86 的页表项含 R/W、NX 等),代码段一般 R+X、数据段 RW、栈不可执行(DEP / NX)——这是 OS 阻止"溢出攻击注入代码"的基础机制。
总解析
D 错的关键是搞错了"虚拟地址大小"这个量是由谁决定的。
虚拟地址的大小由 CPU 的地址位数决定:
- 32 位 CPU:虚地址空间 = = 4 GB
- 64 位 CPU(典型实现 48 位有效):虚地址空间 = = 256 TB
主存大小、硬盘大小只决定"实际能落到物理上的容量",跟虚地址大小没有任何关系:
| 配置 | 虚地址空间 | 物理内存 |
|---|---|---|
| 32 位 CPU + 1 GB 主存 | 4 GB | 1 GB(剩余通过 swap / 缺页处理) |
| 32 位 CPU + 1 TB 主存 | 4 GB | 1 TB(单进程仍只能用 4 GB,多余给别的进程用) |
| 64 位 CPU + 16 GB 主存 | 256 TB | 16 GB |
虚地址是先确定的"门牌号体系",物理内存只是"能挂多少户人家"。所以"虚地址大小由主存和硬盘决定"完全把因果倒过来了。
逐项核对:
| 选项 | 真假 | 关键 |
|---|---|---|
| A 进程独立的虚地址空间 | ✓ | 每进程一套页表 |
| B malloc 返回虚地址 | ✓ | 用户态全程虚地址 |
| C 段权限可不同 | ✓ | 页表项里有 R/W/X 位 |
| D 虚地址大小由主存硬盘决定 | ✗ | 由 CPU 地址位数决定 |
最终答案是 D。