我有4核处理器Intel Xeon CPU E3-1230:
这是64位处理器,这意味着内存地址是64位宽,但此http://ark.intel.com/products/75054/Intel-Xeon-Processor-E3-1230-v3-8M-Cache-3_30-GHz处的CPU规格表示最大RAM大小为32G。
除了为什么/ proc / cpuinfo报告的地址大小不同?
% grep ^address /proc/cpuinfo | uniq
address sizes : 39 bits physical, 48 bits virtual
% uname -sr
% Linux 3.16.2-201.fc20.x86_64
%
更新 据说x86_64或Intel-64是IA-32架构的扩展。这是否意味着cpu仍然是32位的64位扩展?
提前致谢。
答案 0 :(得分:2)
x86-64目前仅支持48位虚拟地址。更高有效位必须是最高有效/可变位(第48位)的符号扩展,即,那些位与第48位相同。这是分层页表格式仅支持四个级别的结果。 (未来的扩展可以添加另一个级别,向虚拟地址添加9个位,或者提供另一种扩展有效虚拟地址大小的方法。)
物理地址在几个点受到限制。首先,页表条目定义哪些位用于提供地址转换。 x86-64在页表条目中有一些保留位,因此将来可以增加此限制,而不必使用扭曲,例如要求使用2MiB(或更大)页面来提供更大的物理地址。 (由于大页面的物理地址位不太明显,因此定义为零 - 页面自然对齐 - 可以回收这些位以扩展物理地址范围。这是针对32位x86的4 MiB页面完成的。)此限制由MMU(TLB和页表walker)强制执行。这可能是/ proc / cpuinfo中报告的39位地址限制。
另一个约束是缓存标记中的支持。这会限制可缓存内存的数量。物理地址也可用于I / O设备,并且(理论上)用于不可缓存的存储器。
最后,普通物理内存(不包括I / O设备)的大小受内存控制器(及其与DRAM的物理接口)的限制。此约束通常与缓存标记约束相同(因为不可缓存的主内存通常不被认为非常有用),但是如果具有非二次幂的内存通道,则它可能小于缓存标记约束(例如, ,有三个内存通道,每个通道可能支持8GiB,总共24GiB,而缓存标签,限制为全位,支持32GiB)。这是链接的英特尔ARK页面上列出的32 GiB约束。
关于x86-64是IA-32的扩展,这意味着32位代码将在x86-64实现上正确运行。 (有关快速概述,请参阅Wikipedia's x86-64 operating modes table。)