字大小限制内存地址的数量,而不是内存本身?

问题描述:

我读有关的字大小,它规定如下:字大小限制内存地址的数量,而不是内存本身?

每台计算机都有一个字的大小,表示 指针数据的标称尺寸。由于虚拟地址是由这样一个字编码的,因此由字大小确定的最重要的系统参数是虚拟地址空间的最大大小。也就是说,对于具有w位字大小的机器,虚拟地址的范围可以从0到2^w-1

32位字大小将虚拟地址空间限制为4千兆字节,即: ,超过4×10^9个字节。

我的理解是正确的,它是可能的地址数量,而不是总的内存大小?例如,如果一个单词是2位,那么我有4个地址(2^2),但是,放置在这些地址中的内容可能具有更大的尺寸。我可以访问总共1GB的struct,并将其置于address[0]之下,以便即使地址限制为2位,内存也会超过1GB。

+0

指针可以以任何方式*表示,但它们通常是字节偏移量,所以限制了内存本身。 – Ryan

+0

@ Ap31,它是[这本书](https://www.amazon.com/Computer-Systems-Programmers-Perspective-3rd/dp/013409266X/ref=sr_1_1?ie=UTF8&qid=1491458225&sr=8-1&keywords=computer+系统+ a +程序员%27s +透视图) –

计算机内部有地址总线和数据总线。地址总线和数据总线不是同一个总线 - 例如,你可以有一个16位地址总线和一个32位数据总线。如果是字寻址机器,则可能的地址数为65536,总内存大小为262144字节(65536字,= 65536 * 4),如果是字节寻址机,则总内存大小为65536字节。

这些天大部分的CPU都是字节寻址的,一些旧的大型机和超级计算机(例如老Crays)都是字处理的。在寻址机器上,无论如何都没有真正的“字节”概念,所以内存大小是用文字引用的。

实际上,该字节已成为可用的最小内存单元,不要太小,不要太大。例如,一个位寻址的机器对于相同大小的存储器需要8倍的存储器总线(非常不方便),并且64位字会使大量通用计算浪费。

一切都是字真的寻址

具有讽刺意味的是,高速缓存和DDR内存的设计意味着,当你的程序解决了单字节,数据的整个高速缓存行的身价从DDR在加载数据总线。 DDR4的数据总线是64位宽,所以当你的程序访问一个字节时至少加载64位。所以你的程序“认为”它生活在一个字节寻址的环境中,但是存储器接口的物理现实是它是64位字寻址的。

+0

谢谢,所以基本上我的理解是正确的? –

+0

@Maximus嗯,这取决于。我们认为现代英特尔X64s是“64位”计算机,您的程序将使用64位指针,整数可以是64位宽。但物理地址总线不是64位(48位?),并且有多于1个存储器控制器,所以有3或4条64位数据总线等等。它很复杂。您的软件将所有内容视为64位虚拟地址和字节寻址,但最大内存大小受物理地址总线,数据总线宽度和控制器数量的限制。然而,当我们说“64位”时,这就是所谓的“虚拟”尺寸。 – bazza

+0

@Maximus例如,DDR4 SIMM的最大容量为512GiB,并且由于它具有64位数据总线,因此只需要2^34位不同的地址就可以访问所有这些。所以它需要一个34位地址总线。然而,DDR4寻址是在“行”和“银行”中完成的,因此甚至没有地址总线。 – bazza

你的书不是完全真实的,但作为一般的简单规则,它保持得很好。

今天常见的例外情况是,你可以使用大于地址范围的字大小,比如大多数64位CPU(我知道足够的详细信息来了解地址范围) - x86-64例如,有一个48位的虚拟地址范围,技术上可以扩展到53位我相信。要做得更好,需要在机器中进行新的页面布局设计,所以不是微不足道的改变。 48个有效位之外的地址(实际上是47位,然后是第48位顶部(或符号)位扩展到剩余的16位,确保没有人使用最高16位用于导致中断的“巧妙的东西”体系结构是否/何时扩展地址范围)。AArch64(ARM的64位处理器架构)也只使用64位的一部分用于虚拟地址 - 我认为它也是48位。另一方面,25年前,当16位x86计算机是标准的时候,由于段寄存器被移位了4位然后被添加到一个“字”中,它们可以处理多于16位的“字” 16位寄存器值,这允许20位地址范围[1] - 或者在保护模式下的80286处理器中,段寄存器包含索引到段描述符表中,该描述符表具有一个基址,它被添加到常规寄存器值,总共给出24位地址。

当然,许多处理器的物理地址范围比虚拟地址的限制更严格,因为将引脚用于寻址内存到处理器外部是“昂贵的”。 68000是32位处理器,但只有24个地址引脚。早期的x86-64处理器只有40位地址引脚,提供64GB的内存范围。

[1]实际上稍微有点过了,因为你可以得到一个20位值的加法,低四位零加到16位值上。

+0

谢谢你的回答 –