如何在Windows/Linux机器中确定Bryant&O'Hallaron虚拟内存模型的n、m、p值
嘿,这个问题问到点子上了——毕竟《深入理解计算机系统》里的这些虚拟内存参数,可不是只停留在书本公式里的东西,在实际的Windows或Linux机器上,我们完全能拿到具体的数值。我分两种系统给你详细说:
这里的n对应虚拟地址空间位数(N=2ⁿ),m是物理地址空间位数(M=2ᵐ),p是页面大小的位数(P=2ᵖ)。
获取p(页面大小位数)
先拿实际页面大小(字节):打开命令提示符或PowerShell,执行命令wmic os get PageSize,会返回类似4096的数值(也就是4KB)。接着计算p:因为P=2ᵖ,所以p=log₂(页面大小),比如4096对应的p=12。如果不想手动算,PowerShell里可以直接跑:[Math]::Log2((Get-WmiObject Win32_OperatingSystem).PageSize)获取n(虚拟地址空间位数)
- 32位Windows系统:默认用户态虚拟地址空间是2GB(对应n=31),内核态也是2GB;如果开启了4GB大内存支持(需修改注册表),用户态可扩展到3GB。你可以用
systeminfo命令查看“系统类型”确认是32位还是64位。 - 64位Windows系统:目前普遍使用48位虚拟地址(n=48),对应2⁴⁸字节的虚拟地址空间。可以通过PowerShell执行
[System.IntPtr]::Size返回8(表示指针长度8字节),再结合系统文档确认是48位(x64 Windows并没有用满64位地址)。
- 32位Windows系统:默认用户态虚拟地址空间是2GB(对应n=31),内核态也是2GB;如果开启了4GB大内存支持(需修改注册表),用户态可扩展到3GB。你可以用
获取m(物理地址空间位数)
先获取物理内存总字节数:执行命令wmic computersystem get TotalPhysicalMemory,比如返回17179869184(对应16GB)。然后计算m=log₂(物理内存字节数),比如16GB对应的m=34。PowerShell一键计算:[Math]::Log2((Get-WmiObject Win32_ComputerSystem).TotalPhysicalMemory)
Linux的命令行工具更直接,大部分参数可以通过系统文件或内置命令快速拿到:
获取p(页面大小位数)
直接执行getconf PAGE_SIZE就能得到页面大小(比如4096字节)。计算p的话,用管道命令一键算出:echo "l($(getconf PAGE_SIZE))/l(2)" | bc -l | awk '{print int($1)}'当然也可以手动算,4096对应的p=12。另外,查看
/proc/meminfo里的PageSize字段也能得到页面大小。获取n(虚拟地址空间位数)
- 32位系统:n=32,对应2³²字节(4GB)的虚拟地址空间,用
getconf LONG_BIT可以返回32确认系统位数。 - 64位x86_64系统:绝大多数使用48位虚拟地址(n=48),可以通过查看CPU信息确认:
输出会类似cat /proc/cpuinfo | grep "address sizes"address sizes : 43 bits physical, 48 bits virtual,里面的virtual数值就是n。
- 32位系统:n=32,对应2³²字节(4GB)的虚拟地址空间,用
获取m(物理地址空间位数)
同样用上面的/proc/cpuinfo命令,输出里的physical数值就是m,比如上面例子里的43。或者先获取物理内存总字节数getconf PHYSICAL_MEMORY_SIZE,再计算log₂得到m。
内容的提问来源于stack exchange,提问作者Tryer

