指针和虚拟内存

jos*_*osh 3 c linux memory ubuntu pointers

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

我的系统有16 GB的RAM,所以39位的物理地址大小对我来说很有意义,因为39位足以满足16GB的ram.

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

Joh*_*iss 6

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

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

AMD64架构程序员手册第2卷:系统编程状态:

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

  • @josh除非您开始编写汇编代码或使用硬编码地址作为指针,或者当然使用未初始化的指针变量,否则您将永远不会得到非法地址.编译器和库以及操作系统根本不会给你一个非法的地址. (3认同)