操作系统如何确定特定内存地址对应的虚拟页?
虚拟地址到虚拟页的映射通用原理
你的核心猜测完全正确,虚拟地址到虚拟页的映射逻辑本质上就是通过地址拆分或整数除法得到页号,再用页号索引页表,这是所有现代操作系统通用的核心原理,具体细节如下:
虚拟地址的固定拆分规则:所有虚拟地址都会被拆成两个部分:
- 页号:虚拟地址的高位部分,用来定位该地址属于哪个虚拟页
- 页内偏移:虚拟地址的低位部分,代表该地址在虚拟页内的具体位置
拆分的分界点由系统的页大小决定:比如页大小是64字节(即2^6),那虚拟地址的低6位就是页内偏移,剩下的高位全部是页号。
具体计算方式:拿你举例的地址
0x78C75ABC来说,假设页大小是64字节:- 用数学计算的话,直接对地址做整数除法(舍去余数):
0x78C75ABC / 64,得到的结果就是对应的虚拟页号 - 用位运算的话更高效,因为页大小是2的幂,直接把地址右移6位(6是log₂(64)的结果),得到的就是页号。这也是CPU和MMU实际采用的方式,比除法快得多
- 用数学计算的话,直接对地址做整数除法(舍去余数):
映射的后续流程:得到页号后,MMU会用这个页号去查进程的页表,找到对应的物理页帧号,再把页内偏移拼接到物理页帧号的低位,最终得到实际的物理内存地址。
补充几个关键点:
- 不管是
new分配的堆内存、栈上的局部变量还是全局变量,只要是虚拟地址,都遵循这个映射规则 - 栈向下增长、堆向上增长的内存分配方向,不影响虚拟页的映射逻辑——地址本身的数值才是关键
- 实际系统的页大小通常远大于64字节(比如常见的4KB、2MB),但拆分和计算的原理完全一致
内容的提问来源于stack exchange,提问作者Joshua Goncalves
相关产品推荐
相关产品推荐

