我的问题是关于实际/物理地址的大小和地址总线的大小之间的关系。
- 如果我理解正确的话,实际/物理地址大小是在设计计算机架构时确定的。
- 地址总线的大小必须与地址的位数相同吗?如果不是,是否意味着物理地址必须通过较小的地址总线传输多次?
笔记
- 我说的不是字大小(即 CPU 一次可以处理的大小),它可能与实际/物理地址大小和地址总线大小不同。
- 我也不是在谈论使用段地址和偏移地址来表示物理地址。
答案1
物理地址总线的位宽度可以更大或者小于特定内存地址的位宽,因为您可以在系统中设计各种硬件黑客来允许奇怪的寻址模式。例如,在某些 32 位系统中,地址总线宽度为 52 位。再举一个例子,一些 CPU 指令可以通过使用基址和查找表的组合来解码更长的地址。
归根结底,硬件的工作就是解释来自 CPU 的内存地址。CPU 只需计算所需的内存地址,并将其发送到主板的内存控制器(请记住,我们这里讨论的是硬件,而不是软件,请参阅底部的最后说明)。内存控制器的工作是解释该地址,并将适当的数据放在内存总线上。
由于这一切都是在硬件层面处理的,你实际上可以增加一些低位内存系统的物理地址空间使用物理地址扩展. 再次强调,如何处理这些扩展地址是系统/硬件实现方式的一部分。
最后,为了进一步说明我上面提到的硬件技巧,一个很好的例子是内存映射输入/输出(简称 MMIO)。这允许 CPU 访问两个外设和RAM 通过地址总线本身。通常这是通过高阶内存地址来完成的,以避免低阶地址冲突。然而,这导致了众所周知的3 GB 内存屏障适用于所有 32 位 Windows 操作系统的消费者版本。再次强调,这只是为了向您展示硬件层面上的可能性。
从高级程序员的角度来看,这与指针变量无关。它们始终具有相同的数据大小,因为这些地址扩展由操作系统和/或硬件本身为您处理。指针大小、地址和偏移量由编译器设置/计算。
答案2
需要理解的一点是,所有大型现代计算机都是内存映射的。程序“地址空间”(本质上由指针的大小决定)可以大于或小于物理地址空间(由可能寻址的 RAM 数量决定)。介于两者之间的是一层或几层地址映射逻辑,用于将“逻辑”地址转换为“物理”地址。这支持虚拟内存“分页”(当特定内存页面最近未被引用时,可能会将其“分页”到磁盘驱动器),并且还支持允许多个进程/任务各自拥有自己的“地址空间”。
除了上述情况(尤其是在引脚有限的微处理器上),从处理器到内存组的地址“总线”可能被“多路复用”,这样地址就会在两个单独的周期中发送出去,例如,首先是高半部分,然后是低半部分。事实上,一些内存模块在构建时就考虑到了这一点,因为它们同样会“多路复用”传入的地址。