Memory 哪些指令负责将总线映射到内存?

Memory 哪些指令负责将总线映射到内存?,memory,linux-kernel,cpu,instructions,Memory,Linux Kernel,Cpu,Instructions,然后一条CPU指令从内存中读取一些内容,CPU和MMU中有一个特殊的电路,当指令执行时,地址被发送到MMU,MMU通过总线通知要从内存中读取的内容,并将信息放入目标寄存器。我还了解到,一些通常与RAM相对应的地址被映射到一些设备上。所以我想有一种方法,首先,告诉我一些设备将映射到哪个地址。然后,我们愚弄处理器试图读取内存地址,通过某些电路,它最终读取设备 我在哪里可以找到更好的解释?特别适用于处理PCI和更多知名设备的x86体系结构。没有指令1负责将设备映射到内存 完整的答案可能过于宽泛,但我们

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

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

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

完整的答案可能过于宽泛,但我们可以举一两个例子。
首先,让你自己相信一个设备可以通过简单地告诉它监听哪个地址来配置。在硬件层面,这不过是一种比较

  • 某些设备有固定地址。
    这些是遗留设备,在系统首次发布时就出现,并由其他竞争对手和后续版本克隆以实现向后兼容性

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

  • 设备。
    最著名的PnP总线是PCI,但ISA和MCA也有PnP(ISA是“某种”PnP)。
    这些设备与上述设备类似,但在软件中是可配置的,而且它们所需的资源(IRQ、DMA、MMIO)是可枚举的,以便固件和操作系统分配给它们时不会发生冲突

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

    例如,在PCI的情况下,地址0cf8h和0cfch2用于选择设备、设备上的寄存器以及读取或写入该寄存器。
    配置空间中的寄存器可用于重新设置设备的基址

    让我们假设寄存器10h保存设备侦听的地址,那么这个伪代码将设备映射到8888h

    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的写入,但这些位置不会被硬件路由到主内存,而是被路由到主机到PCI网桥控制器,该控制器将它们转换为感兴趣的设备将拾取的PCI配置空间访问

    稍后,当访问8888888 H时,它也不会被路由到主存储器3,而是路由到PCI总线(通常作为结果),在该总线上配置的设备正在侦听


    1在某种意义上说,没有精心编制的CPU指令。一切都是执行某些指令的结果,因此在某种意义上,某些“必须负责”映射的设备。我假设,在接下来的回答中,你想知道它是如何工作的

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


    3硬件知道内存的结束位置,如果软件将设备映射到实际有内存的位置,则内存优先,并且无法访问设备。

    您需要澄清您的问题。对于标题中的问题,答案将包含所有三个:I/O端口读/写、内存读/写、无(硬连线或由BIOS/芯片组预配置/任何内容)。你不会真的“愚弄”CPU。物理内存地址解码在CPU和内存/设备/总线之间路由数据。有些地址可能是硬连线的,而有些地址可能是可变的。