当最大内存不是 2 的幂时,计算机如何处理内存寻址?
How does Computers Handle Memory Addressing when the Max-memory is not on Power of 2?
我知道基本内存寻址的工作原理以及为什么总是建议我们使用 2 的幂的内存量,(对未来的人的解释)因为 CPU 使用的位来寻址内存只有 2 个值。所以 2 位可以寻址 4 个值,3 位可以寻址 8 个,所以 N 位可以寻址 2^N 个值。
当我有不同的号码时会发生什么?例如,假设我在服务器上安装了 160GB 的内存(10x16GB)。
假设我们需要 X 位来寻址 128GB 的 RAM,CPU 是否只使用 X 位寻址并忽略从“129 到 160”可用的地址,还是使用 X+1 位并有一些无效地址?它会使用无效地址而不是无效地址作为虚拟 RAM 吗?
据我所知,它甚至可以用作保留值,但我真的很想了解会发生什么。
假设这个答案是一台 PC,因为它比 CPU 更依赖于平台。
它在任何地方都不能简单地工作。但首先,
will it use X+1 bits and have some invalid addresses?
它将始终使用所有位,CPU甚至不关心无效地址,您可以使用它们。它根本不知道,所以它不在乎。
谁 知道 BIOS,它会告诉你("you" 是 OS,大概)是什么线性地址 space 的景观看起来像有几个 BIOS 中断。只检测 "low memory" 的旧版本相当简单,它只是告诉你有多少内存,然后由你决定(当时情况没有那么复杂,所以这就足够了)。 "new" 一个(几乎没有,但相对较新),INT 0x15,EAX = 0xE820,将为您提供一个实际的映射,其形式为线性地址范围列表 space 以及描述。
您不会发现所有实际 RAM 都映射到从 0 开始的良好连续范围内。它将以块的形式映射,由映射内存映射设备的孔分隔。
并且由于 "low addresses" 中存在漏洞(尽管 "low" 是相对的),一些实际 RAM 可以被推入 "up"。所以如果你有 4GB 的 RAM,其中一些将被映射到高于 0xFFFFFFFF 的地址。孔实际上在哪里取决于。读取内存映射。
例如,地图可能如下所示:
第一列是起始地址,第二列是大小,最后一列是类型。类型 1 是普通 RAM,类型 2 不是 RAM,类型 3 中有您想要阅读的内容,但您可以在完成后使用它,或者描述如此。还有更多类型。这张地图是在 VirtualBox 中生成的,并为其提供了 4GB 的 RAM。但它并不完全符合这一点。关键是,你可以看到洞。
如果 RAM 少得多,第二个类型 1 范围会更短,但其余部分看起来是一样的(无论如何在 VirtualBox 上,在其他地方它通常看起来有点不同)- 那些接近 32 位的类型 2 范围边界仍然存在,只是在它们正下方映射了一堆 "nothing"。
所以,它远没有在地址中使用一些位数那么简单。
我知道基本内存寻址的工作原理以及为什么总是建议我们使用 2 的幂的内存量,(对未来的人的解释)因为 CPU 使用的位来寻址内存只有 2 个值。所以 2 位可以寻址 4 个值,3 位可以寻址 8 个,所以 N 位可以寻址 2^N 个值。
当我有不同的号码时会发生什么?例如,假设我在服务器上安装了 160GB 的内存(10x16GB)。
假设我们需要 X 位来寻址 128GB 的 RAM,CPU 是否只使用 X 位寻址并忽略从“129 到 160”可用的地址,还是使用 X+1 位并有一些无效地址?它会使用无效地址而不是无效地址作为虚拟 RAM 吗?
据我所知,它甚至可以用作保留值,但我真的很想了解会发生什么。
假设这个答案是一台 PC,因为它比 CPU 更依赖于平台。
它在任何地方都不能简单地工作。但首先,
will it use X+1 bits and have some invalid addresses?
它将始终使用所有位,CPU甚至不关心无效地址,您可以使用它们。它根本不知道,所以它不在乎。
谁 知道 BIOS,它会告诉你("you" 是 OS,大概)是什么线性地址 space 的景观看起来像有几个 BIOS 中断。只检测 "low memory" 的旧版本相当简单,它只是告诉你有多少内存,然后由你决定(当时情况没有那么复杂,所以这就足够了)。 "new" 一个(几乎没有,但相对较新),INT 0x15,EAX = 0xE820,将为您提供一个实际的映射,其形式为线性地址范围列表 space 以及描述。
您不会发现所有实际 RAM 都映射到从 0 开始的良好连续范围内。它将以块的形式映射,由映射内存映射设备的孔分隔。
并且由于 "low addresses" 中存在漏洞(尽管 "low" 是相对的),一些实际 RAM 可以被推入 "up"。所以如果你有 4GB 的 RAM,其中一些将被映射到高于 0xFFFFFFFF 的地址。孔实际上在哪里取决于。读取内存映射。
例如,地图可能如下所示:
第一列是起始地址,第二列是大小,最后一列是类型。类型 1 是普通 RAM,类型 2 不是 RAM,类型 3 中有您想要阅读的内容,但您可以在完成后使用它,或者描述如此。还有更多类型。这张地图是在 VirtualBox 中生成的,并为其提供了 4GB 的 RAM。但它并不完全符合这一点。关键是,你可以看到洞。
如果 RAM 少得多,第二个类型 1 范围会更短,但其余部分看起来是一样的(无论如何在 VirtualBox 上,在其他地方它通常看起来有点不同)- 那些接近 32 位的类型 2 范围边界仍然存在,只是在它们正下方映射了一堆 "nothing"。
所以,它远没有在地址中使用一些位数那么简单。