内存寻址

时间:2010-07-07 16:09:48

标签: memory memory-management 64-bit

我正在阅读http://duartes.org/gustavo/blog/post/motherboard-chipsets-memory-map,具体而言,请参阅以下部分:

  

在主板上CPU的网关   世界是前端公共汽车   将它连接到北桥。   每当CPU需要读取或   通过这条总线写入内存。   它使用一些引脚来传输   它想要的物理内存地址   写或读,而其他引脚发送   要写的或接收的价值   正在阅读的价值。英特尔酷睿2   QX6600有33个引脚用于传输   物理内存地址(所以有   2 ^ 33个内存位置选择)和   64个引脚用于发送或接收数据(如此   数据以64位数据传输   路径,或8字节块)。这允许   CPU以物理地址64   千兆字节的内存(2 ^ 33个位置*   8字节)虽然只有大多数芯片组   最多可处理8个内存。

现在上面的数学表明,由于有33个引脚用于寻址,因此2 ^ 33 * 8字节= 64 GB。一切都很好,但现在我有点困惑。假设我安装了64位操作系统,我将能够总共64 GB或2 ^ 64Gb * 8 = 2 ^ 64GB(还有更多)?另外,假设我在32位cpu上使用相同的cpu,我仍然只能处理4 GB(2 ^ 32位= 4Gb * 8 = 4GB)?

我认为物理vs“操作系统允许”让我感到困惑。

谢谢!

8 个答案:

答案 0 :(得分:3)

你混淆了很多东西:

  • 指针的大小限制了用户进程可以访问的虚拟内存的数量。并非所有这些都可以被您的进程实际使用(传统上保留“高”1或2 GB以供内核使用)。
  • 并非所有虚拟地址位都有效。最初的AMD64实现有效地使用48位符号扩展地址(即[0x0000800000000000,0xFFFF7FFFFFFFFFFF]范围内的地址无效)。这主要是为了将页表限制为4级,这样可以降低页面错误的成本;假设4K页面,您需要6级页表来处理完整的2 ^ 64位。为了比较,i386有2级页表。
  • 并非所有虚拟地址都需要在任何给定时间对应物理地址。这是虚拟内存的重点:你可以解决“物理上”不存在的内存,以及操作系统为你编写的内存。
  • 并非所有物理地址都对应于虚拟地址。例如,它们可能没有被映射,但它也可能拥有比你能解决的更多的物理内存。 PAE支持高达64 GB的物理地址,在AMD64之前的服务器上很常见。虽然单个进程无法处理64 GB,但这意味着您可以运行大量的数GB流程而无需一直交换。
  • 最后:没有什么比RAM插槽可以处理更多的物理地址。我有一个D945GCLF2板支持AMD64,但只有2 GB的RAM。没有必要使用额外的物理地址线,无论如何都无法使用。 (我正在通过内存映射设备和时髦的两个DIMM - 一个插槽的东西,我忘记了它的名字。)

另外,请注意其他一些事项:

  • 对于内存映射I / O(在硬件意义上),CPU需要寻址单个字节。它不能只进行64位访问。这似乎已被掩盖了。
  • 现代处理器包括CPU上的内存控制器,而不是传统的北桥和FSB(参见HyperTransport和QuickPath)。

答案 1 :(得分:2)

是,物理和虚拟地址中的位数可以不同。比如,这里是64位Linux所说的内核(cat /proc/cpuinfo):

...
processor       : 3
vendor_id       : AuthenticAMD
cpu family      : 15
model           : 33
model name      : Dual Core AMD Opteron(tm) Processor 280
stepping        : 2
cpu MHz         : 2392.623
cache size      : 1024 KB
...
bogomips        : 4784.41
TLB size        : 1088 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management: ts fid vid ttp

答案 2 :(得分:1)

有关物理地址线的一些事项需要考虑:

  1. 每个物理地址线(“引脚”)引用前端总线字,而不是字节地址。如果CPU取出64位字,则物理地址线将与该8字节边界对齐。因此,地址线A0-A2没有连线,因为它们总是为零。因此,物理线的字节地址范围增加了前端总线的宽度。

  2. 虚拟内存系统可以维护64位虚拟地址到n位物理地址的映射。在实践中,操作系统维护VM映射不超过的“物理最大地址”值。

  3. 某些内存架构允许内存库分页,其中CPU外硬件通过为内存的不同“库”重用一些物理地址来增加有效的物理内存地址范围。

答案 3 :(得分:0)

64位和32位OS之间的主要区别在于,简单地将原始数据类型(例如,单词)视为更宽。如果CPU只能物理地寻址2 ^ 33个位置,那么仅仅因为您使用的是64位操作系统而不会改变。另一方面,使用32位操作系统通常会限制可寻址内存,因为32位指针不能代表CPU可用于寻址内存的所有可能值(在您的示例中,32位指针是一个有点短。)

长话短说,您的可寻址内存受指针宽度(操作系统限制)和数据地址总线宽度(物理限制)的限制。一些架构通过使用两个指针来巧妙地绕过OS指针宽度,一个用于寻址存储器的“存储体”,另一个用于在存储体内本地寻址。不过,这些计划最近有点流行。

此外,现代操作系统通常使用虚拟内存子系统将逻辑地址转换为相应的物理地址。通过缓存,内存的实际物理位置可以是沿着内存层次的一个(或几个!)组件(例如处理器缓存,主内存,硬盘等)。不知道我怎么完全忘记提及VM,但它肯定会帮助你理解调查它。

答案 4 :(得分:0)

想象一下,在64位操作系统中,一些用于寻址内存的电线不会去任何地方。操作系统理解这非常令人困惑,因此它采用标准的64位地址并使用虚拟内存映射使您相信您生活在一个平坦的64位空间中。

答案 5 :(得分:0)

芯片组限制是一个重要因素 - 主板上的硬件必须能够将地址从CPU传递到RAM。因此,除非你的主板设计能够处理更多,否则8GB限制将适用。

作为参考,当前的64位CPU具有连接在一起的地址空间的高x位数(介于8和24位之间),因为现在64位只是太多的地址空间(你是需要80亿个2GB模块才能占用那么多地址空间。例如,AMD在单个段中的地址空间上具有48位限制(IIRC)。这绰绰有余,但远不及理论上的最大值。

答案 6 :(得分:-1)

我相信如果你有一个64位操作系统,你可以(理论上)寻址2 ^ 64 * 8字节= 16 EB(exabytes),但是你将被硬件限制为2 ^ 33 * 8字节= 64 GB。如果你有一个32位操作系统,你将无法使用全部硬件容量,因为操作系统是限制因素,只能表达2 ^ 32个不同的地址。我可能会离开,但这是我目前的理解。

答案 7 :(得分:-1)

我认为你对内存同时存储8个字节的事实感到困惑,但是一个地址(在CPU级别)指的是1个字节(而不是一堆8个字节)。因此,使用32位,您可以“引用”2 ^ 32字节= 4GB。如果你更喜欢指针上的+8对应于“物理”线的数字+1。  然后,您可以使用分页访问更多内存(不确定它是否仍在现代计算机中使用)。

要与库进行类比,您(或CPU)可以枚举32 ^ 2本书,但图书管理员(芯片组)可以处理书架。那么对于你预订#10,是书#2还是书架#2,你从来没有看过书架编号。图书管理员的工作就是去好书架给你带来好书。 对我来说(同一台计算机上的另一个程序)书#10可能是另一本书:书架10000的书#2(因为我的页面从货架10000开始) 我们都可以参考32 ^ 2不同的书,但它们不一样(并且库可以有更多的东西)。

(自从我学习计算机以来,变化发生了变化,所以我所说的可能不是100%准确,但我认为这个想法就在那里)