指针和虚拟内存

时间:2016-03-22 12:21:25

标签: c linux pointers ubuntu memory

根据我系统的cpuinfo文件,我系统中的每个处理器都有39位物理地址大小和48位虚拟地址大小。

我的系统有16 GB的ram,所以39位的物理地址大小对我来说很有意义,因为39位足以解决16GB内存。

然而,48位虚拟地址大小让我感到困惑。我一直认为我可以编写C程序,从源代码的角度来看,它可以处理2 ^ 64字节的虚拟内存(因为我的系统上的指针根据大小(void *)是8字节长)。但是,cpuinfo告诉我,我只有2 ^ 48字节的虚拟内存。那么这是否意味着我的C程序只能处理2 ^ 48字节的虚拟内存?

1 个答案:

答案 0 :(得分:6)

在64位系统上,指针确实是64位宽。这意味着,指针有2个 64 可能的值。

但是,current x86-64 (AMD64) implementations仅使用低48位。这意味着只有2个 48 实际上可能有效的指针和相当多的指针总是无效的。

AMD64 Architecture Programmer’s Manual Volume 2: System Programming州:

  

目前,AMD64架构定义了一种将48位虚拟地址转换为52位物理地址的机制。用于转换完整64位虚拟地址的机制是保留的,将在未来的AMD64架构规范中进行描述。