哪些说明负责将总线映射到内存中



然后,CPU指令从内存中读取一些内容,CPU和MMU中有一个特殊的电路,以至于执行指令时,地址将发送到MMU,将地址发送到MMU,这通过总线通知要从内存中读取并将信息放入目标寄存器中。我还了解到,一些通常与RAM相对应的地址映射到某些设备。因此,我想有一种方法可以首先,告诉我在哪些设备上绘制的设备。然后,我们愚弄了处理器试图从内存地址读取的过程,并且通过某些电路,它最终会读取设备。

在哪里可以找到更好的解释?特别适用于处理PCI和更知名设备的X86体系结构。

没有指令 1 负责将设备映射到内存中。

一个完整的答案太宽了,但是我们可以做一个或两个例子。
首先,说服您的自我,可以通过简单地将其告知要收听的地址来配置设备。在硬件级别上,这仅仅是比较。

  1. 一些设备具有固定地址。
    这些是传统设备,在系统的第一次启动中存在,并由其他竞争对手克隆,并连续版本以向后兼容。

  2. 可配置的设备。
    这些设备具有跳线/开关来选择要收听的地址范围。用户的任务是避免冲突并适当配置软件。

  3. 插件和播放设备。
    最著名的PNP巴士是PCI,但是PNP也是ISA和MCA(ISA是"有点" PNP)。
    这些设备就像上面的设备一样,但可以在软件中配置,也可以在软件中(IRQ,DMA,MMIO)进行枚举,以便让固件和OS分配固件而不会发生冲突。

现在您想知道如何实现选项3。答案很简单:使用 meta地址空间

例如,在PCI的情况下,地址 0cf8h 0cfch 2 在使用设备上选择设备的地方,设备上的寄存器配置空间,并读取或写入该寄存器。
配置空间中的寄存器可用于反弹设备。

让我们假设寄存器10H保留了设备收听的地址,则该伪代码在设备上映射为888888888H

uint32_t* select = MAKE_POINTER(0xCF8);
uint32_t* data = MAKE_POINTER(0xCFC);
*select = MAKE_SELECT(0, 1, 31, 0x10);   //Bus 0, Device 1, Function 31, Register 0x10
*data = 0x88888888;                      //Set reg 0x10 to 0x88888888

您可以看到,推迟指针会在内存位置生成一个写入0cf8h和0cfch,但是这些位置并未通过硬件将这些位置路由到主内存,而是转到host tots to to to host tot to to to tots tot-pci bridge Controller将它们转换为PCI配置空间访问,这些空间将由感兴趣的设备拾取。

后来,当对88888888H进行访问时,这再次被访问为主要内存 3 ,而是在PCI总线(通常是由于减去分解的结果),其中配置的设备为听。


1 从某种意义上说,没有专门制作的CPU说明。一切都是执行某些说明的结果,因此从某种意义上说,某些指示必须对所映射设备负责。我认为,在此答案的其余部分中,您想知道MMIO的工作原理。

2 仅适用于io地址空间中的x86,但不要让我们分散我们的注意力。

3 硬件知道内存在哪里,如果软件映射了一个实际存在内存的设备,则后者优先且无法访问该设备。

最新更新