然后CPU指令从存储器读取内容,在CPU和MMU中有一个特殊的电路,当执行指令时,地址被发送到MMU,MMU通过BUS通知想要从内存中读取并将信息放入目标寄存器。我还了解到,一些通常与RAM对应的地址会映射到某些设备。所以我想这是第一种方法,告诉我某些设备将映射到哪些地址。然后,我们欺骗处理器试图从存储器地址读取,并且通过某些电路,它最终会读取设备。
我在哪里可以找到更好的解释?特别适用于处理PCI和更知名设备的x86架构。
答案 0 :(得分:1)
没有指令 1 负责将设备映射到内存。
完整的答案会过于宽泛,但我们可以做出一两个例子 首先,让自己说服一个设备可以通过简单地告诉它要听哪个地址来配置。在硬件层面,这仅仅是一个比较。
有些设备有固定地址 这些是传统设备,在系统首次启动时出现,并由其他竞争对手和后续版本克隆,以实现向后兼容。
可配置设备 这些设备具有跳线/开关,用于选择要收听的地址范围。用户的任务是避免冲突并适当地配置软件。
Plug and play设备。
最着名的PnP总线是PCI,但ISA和MCA也是PnP(ISA是"有点" PnP)。
这些设备与上面的设备类似,但可以在软件中配置,它们所需的资源(IRQ,DMA,MMIO)也可以枚举,让固件和操作系统分配它们而不会发生冲突。
现在您想知道如何实现选项3。答案很简单:使用元地址空间。
例如,在PCI的情况下,地址 0cf8h 和 0cfch 2 用于选择设备,设备上的寄存器configuration space,以及读或写该登记册 配置空间中的寄存器可用于重新绑定设备。
假设寄存器10h保存设备侦听的地址,然后此伪代码映射设备88888888h
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配置空间访问,将由感兴趣的设备获取。
稍后,当访问88888888h时,再次没有路由到主存储器 3 而是路由到PCI总线(通常是subtractive decoding的结果)配置的设备正在监听。
1 从某种意义上说,没有特制的CPU指令。一切都是一些指令被执行的结果,所以在某种意义上,一些人必须负责并且#34;对于要映射的设备。对于本答案的其余部分,我假设您想知道MMIO的工作原理。
2 仅适用于IO地址空间中的x86,但不要让我们分心。
3 硬件知道内存结束的地方,如果软件映射的是实际存在内存的设备,后者优先,并且不能访问设备。