具体来说,英特尔 MSR,它们在计算机中的物理位置在哪里?它们是否像其他通用寄存器一样位于 CPU 内部?它们是否映射到 RAM?为了读取/写入 MSR,我将一些地址存储在 ecx 寄存器中。这些地址对应的是什么?这些是物理内存地址吗?如果是,我可以从 RAM 中读取 MSR 的值吗?
答案1
这些寄存器位于每个 CPU 核心内(每个核心都有自己的寄存器组)。它们不一定都位于同一个位置 - 它们可以“散布”在核心周围。包含地址的 MSR 可能位于靠近内存寻址单元的位置。启用指令的 MSR 可能位于靠近指令解码器的位置,等等。每个 MSR 可能与其控制的单元有直接的内部连接。
如果 MSR 有一些保留位 - 这些位可能实际上不存在于硬件中。因为这些位始终为 0 - 所以不需要存储它们。因此,硬件 MSR 实际上可能小于 64 位。
MSR 是不是映射到 RAM。ECX 中的地址与内存地址无关。它们只是用于标识每个 MSR 的数字。它们仅对rdmsr
和有效wrmsr
。
答案2
将 MSR 视为一个函数,其中 ECX 中提供的地址是 MSR 的名称而不是真正的地址。
有些 MSR 是持久性的,即充当存储,有些则不是。它们类似于设备 (MMIO) 寄存器,而不是 CPU 通用寄存器,因此会受到屏蔽(保留位)、访问模式(如写入 1 清除)和副作用(与 CPU 的控制寄存器相同)的影响。
同一个 MSR 可能由同一个核心中的线程、同一个插槽中的核心或所有插槽之间共享,这样,如果它是持久性的,那么在一个核心上写入它的“地址”将使写入的值在另一个核心甚至在其他插槽上可见(如果 MSR 在插槽之间共享) - 这就是“邮箱”MSR 在核心之间的工作方式。
在极端情况下,它可以充当接口,使得写入的值是附加到 MSR“地址”的某些功能的参数(它是功能而不是寄存器,对吗?)并且值被完全消耗并且不能被读回(只写模式)。
因此,套接字共享的 MSR 可能位于处理器核心之外,甚至非核心,例如,位于电源管理设备中。CPU 的 rdmsr/wrmsr API 以及 ECX 中的数字(“地址”)究竟如何转换为特定事务取决于具体实现(例如使用具有重新映射地址的主 I/O 总线接口还是边带 I/O 总线接口进行访问)。
因此,MSR 是一个带有可选存储的函数,可以通过 RDMSR/WRMSR 指令通过其编号(“地址”)进行访问。
请参阅“英特尔® 64 和 IA-32 架构软件开发人员手册第 4 卷:特定于模型的寄存器”以了解所有关键技术细节。