硬件寄存器和内存映射寄存器有什么区别?

硬件寄存器和内存映射寄存器有什么区别?

这让人很困惑,所以我就在这里说出来。显然,通过多模光纤输入输出系统,您可以使用特定的内存映射地址访问外部设备,然后该地址将被重新路由到该设备本身(通过写入、命令包等)。然而,我听到过对这两种情况的混合描述硬件寄存器(例如 CPU/GPU 寄存器,甚至声音芯片)和内存映射寄存器可互换使用。它们是同一件事吗?

当您说“内存映射寄存器”时,您指的不就是将数据字节重新路由到该设备内特定地址的地址吗(例如理论上:GPU 的 0x500 地址用于寄存器 TEXTURE_BUFFER)。但是,内存映射设备无法映射 RAM 内的物理寄存器。

那么基本上,内存映射寄存器和硬件寄存器之间有什么区别?

答案1

内存映射硬件寄存器的访问方式与 RAM 类似。所有 CPU 都有用于读取/写入 RAM 的特定指令,这些指令也用于访问内存映射寄存器。

硬件寄存器一般不需要进行内存映射,这只是一种常见的惯例。

x86 提供两个地址空间,其中使用两组独立的指令进行读写 - 第一组是 RAM 或内存空间(所有指令MOV),第二组是 I/O 空间(使用INOUT指令)。在 x86 上,硬件寄存器可能出现在任一空间中。

您可能还需要经过间接层才能真正到达硬件寄存器。设备可能只在内存或 I/O 空间中公开一个“端口”。然后,您需要将寄存器编号写入该地址,然后将要实际写入的数据写入另一个地址。然后进行写入。Commodore 128 中的旧 8563 VDC 就是这样工作的。CMOS RAM 和一些 PCI 寄存器也是这样工作的。

CPU 硬件寄存器当然不是内存映射的(无论如何不在 x86 或任何常见的 CPU 上),这是硬件寄存器的另一个示例。

RDMSR现代 CPU 具有“特定型号寄存器”(MSR),这些寄存器使用自己的指令( 、 )进行读写WRMSR。其他 CPU 寄存器有自己的指令(LGDTMOV xx, CR2、基本 EAX/RAX 等)。

答案2

内存映射 I/O 和内存映射寄存器不是一回事,而且关系也没有那么密切。

例如,在早期的 PC 中使用了内存映射 I/O,其中部分 RAM 地址空间被映射到显示缓冲区。(在某些产品中,常规 RAM 实际上用于显示缓冲区,而不是将缓冲区放在显示适配卡上。)在其他情况下,磁盘驱动器控制器等硬件设备将使用内存映射寻址来设置/读取其控制寄存器。(我猜想现代显卡仍然将显示内存映射到图形处理器的地址空间,尽管我不知道这是事实。)

“内存映射寄存器” 可以表示多种含义。一种是上述带有内存映射控制寄存器的磁盘驱动器控制器的示例。另一种完全不同的情况是处理器的寄存器实际上位于 RAM 中。这在早期(50 年代到 70 年代早期)的处理器中相当常见,因为它大大减少了零件数量,并且还允许一些“聪明”的编程实践。在少数情况下,处理器有两种型号,一种带有内存映射寄存器,另一种带有(更快的)“硬件”寄存器。

在某些情况下,对于什么是寄存器、什么不是寄存器是模棱两可的,例如在 Burroughs“堆栈”机器中,使用“堆栈”代替标准寄存器(IIRC,有几种不同的方案用于在 RAM 中“隐藏”寄存器)。

答案3

我的猜测是基于计算机科学讲师在一本基础书籍中告诉我们的内容,但它与 MMIO 上的维基百科页面所说的相符。CPU 不知道它正在写入哪个设备。就它而言,它可能都是 RAM 内存。有些设备使用特定的 RAM 内存位置。我想这就是硬件映射的意思。但是硬件设备本身可能有一个内存位置,事实上可能必须有一个.. 来传输数据。CPU 不必等待它写入​​映射到设备上的寄存器的 RAM 中的位置。寄存器是 CPU 或硬件设备中的内存位置。不在 RAM 中。

更具体地回答您的问题。寄存器位于 CPU 或硬件外围设备中。不在 RAM/主内存中。RAM/主内存中的位置仅称为位置,而不是寄存器。CPU 或外围设备中的位置通常不称为位置或内存位置,而始终称为寄存器,这是它的特殊且正确的名称。如果寄存器映射到内存(毫无疑问许多硬件外围设备寄存器都是如此),那么我很确定这就是内存映射寄存器的含义。

因此,如果硬件寄存器不是内存映射的,例如,如果 CPU 直接写入它,那么它就不是内存映射的。从那篇维基百科文章看来,如果这些地址位于特殊空间,并且需要特殊引脚或特殊总线,那么这些位置可能在内存中,但不是 MMIO,不是内存映射的。

查看该维基百科页面。PMIO 即被认为不是内存映射的。是指 CPU 寄存器不映射到常规内存位置,而是映射到特殊地址空间。因此,它不是可以写入设备或内存的通用 CPU 寄存器,具体取决于地址总线上放置的地址。使用 PMIO(即不是内存映射寄存器),寄存器会映射到设备特定的内存位置,我猜他们称之为端口。

相关内容