9 memory register data-transfer cpu-architecture bus
这一直令人费解,所以我会把它全部放在这里。显然,通过MMIO,您可以使用某个内存映射地址访问外部设备,然后将其重新路由到该设备本身(通过写入、命令包等)。但是,我一直听到对硬件寄存器(例如 CPU/GPU 寄存器,甚至声音芯片)和可互换使用的内存映射寄存器的混合描述。它们是一样的吗?
当您说“内存映射寄存器”时,您是不是指数据字节重新路由到该设备内的特定地址的地址(例如,理论上:GPU 的 0x500 地址用于寄存器 TEXTURE_BUFFER)。但是,内存映射设备无法映射 RAM 内的物理寄存器。
那么基本上,内存映射寄存器和硬件寄存器之间有什么区别?
内存映射硬件寄存器的访问方式与 RAM 类似。所有 CPU 都有用于读/写 RAM 的特定指令,并且这些相同的指令用于访问内存映射寄存器。
硬件寄存器通常不必进行内存映射,这只是一个常见的约定。
x86 提供了两个地址空间,其中两组独立的指令用于读取和写入 - 第一个是 RAM 或内存空间(所有指令MOV
),第二个是 I/O 空间(使用IN
和OUT
指令)。在 x86 上,硬件寄存器可能出现在任一空间中。
您可能还需要经过一定程度的间接访问才能真正到达硬件寄存器。设备只能公开内存或 I/O 空间中的“端口”。然后,您需要将寄存器编号写入该地址,然后将要实际写入的数据写入另一个地址。然后写入发生。Commodore 128 中的旧 8563 VDC 是这样工作的。CMOS RAM 和一些 PCI 寄存器也是这样工作的。
CPU 硬件寄存器当然不是内存映射的(无论如何不在 x86 或任何常见 CPU 上),这是硬件寄存器的另一个示例。
现代 CPU 具有“特定于型号的寄存器”(MSR),并且使用它们自己的指令 ( RDMSR
、WRMSR
) 来读取/写入这些寄存器。其他CPU寄存器有自己的指令(LGDT
、MOV xx, CR2
、基本EAX/RAX等)
bar*_*lop -1
我的猜测是基于计算机科学讲师从一本基础书籍中告诉我们的内容,但它与 MMIO 上的维基百科页面所说的相符。CPU 不知道它正在写入哪个设备。就其而言,它也可能都是 RAM 内存。某些设备使用特定的 RAM 内存位置。我想这就是硬件映射的含义。但硬件设备本身可能有一个内存位置,实际上可能必须有一个内存位置来传输数据。CPU 不必等待它写入 RAM 中映射到设备上寄存器的位置。寄存器是 CPU 或硬件设备中的存储位置。不在内存中。
更具体地回答你的问题。寄存器位于CPU 或硬件外围设备中。不在 RAM/主存中。RAM/主存中的位置仅称为位置,而不是寄存器。CPU 或外围设备中的位置通常不称为位置或内存位置,而始终称为寄存器,这是其特殊且正确的名称。如果寄存器像许多硬件外围设备寄存器一样映射到内存,那么我非常确定这就是内存映射寄存器的含义。
因此,如果硬件寄存器不是内存映射的……例如,如果 CPU 直接写入它,那么它就不是内存映射的。从维基百科文章看来,如果这些地址位于特殊空间并且它们需要特殊引脚或特殊总线,那么这些位置可能位于内存中,但不是 MMIO,不是内存映射。
看看维基百科页面.. PMIO 即被认为不是内存映射的。CPU 寄存器没有映射到常规内存位置,而是映射到特殊的地址空间。因此,而不是可以写入设备或内存的通用 CPU 寄存器,具体取决于地址总线上放置的地址。使用 PMIO(即不是内存映射寄存器),寄存器被映射到设备特定的内存位置,我猜他们正在调用端口。
归档时间: |
|
查看次数: |
12961 次 |
最近记录: |