Memory 为什么我们需要内存映射IO?

Memory 为什么我们需要内存映射IO?,memory,operating-system,hardware,Memory,Operating System,Hardware,为什么我们需要内存映射IO?根据我在CS课上学到的内容,MMIO抽象出控制设备的特定指令。但是,如果设备的控制寄存器(以及地址空间中的每个存储单元)取决于设备的品牌和型号,那么从抽象的角度来说,可以得到什么?基本上,CPU要能够执行IO,就需要一种向设备读写数据的方法。有很多方法可以做到这一点,例如x86上的专用CPU指令,如IN/OUT。MMIO是另一个在简化硬件设计方面广受欢迎的解决方案 在一个典型的CPU上,内核将全部连接到一个公共总线,该总线允许内核读/写主内存,可能还有共享缓存。然而,

为什么我们需要内存映射IO?根据我在CS课上学到的内容,MMIO抽象出控制设备的特定指令。但是,如果设备的控制寄存器(以及地址空间中的每个存储单元)取决于设备的品牌和型号,那么从抽象的角度来说,可以得到什么?

基本上,CPU要能够执行IO,就需要一种向设备读写数据的方法。有很多方法可以做到这一点,例如x86上的专用CPU指令,如IN/OUT。MMIO是另一个在简化硬件设计方面广受欢迎的解决方案

在一个典型的CPU上,内核将全部连接到一个公共总线,该总线允许内核读/写主内存,可能还有共享缓存。然而,总线对于数据的来源、目的地和内容是不可知的。因此,总线上的传输可以传输到不同的内存控制器、不同的内核、缓存等。因此,硬件设计人员可以简单地将IO设备连接到该总线,并通过与RAM相同的机制访问这些设备。这有一些好处:

  • IO硬件现在可以直接从RAM或其他IO设备检索数据,而无需涉及内核
  • CPU缓存硬件可以窥探IO生成的事务,以保持缓存的一致性
  • 当数据在总线上移动时,CPU可以执行有用的工作,而不是核心等待每个加载/存储完成
  • CPU不需要支持IO的特殊指令

这些优点中的大多数都被软件所掩盖,因此我认为MMIO对硬件设计者有利

每个设备都有一些内部寄存器,软件(设备驱动程序)使用这些寄存器来控制设备的状态、请求设备执行操作以及确定状态

软件(设备驱动程序)可以通过两种主要方式访问设备的内部寄存器——将这些寄存器映射到CPU物理地址空间(与内存映射到CPU物理地址空间的方式相同);并通过提供专用机制(例如80x86上的IO端口)

了解优点/缺点;最好考虑一下CPU/s和内存之间通信的性质。这种交流需要非常快,因为一切都取决于它;(对于电子产品而言)“快”往往意味着简单,总线长度短(由于电容和电阻等原因),负载最少(因为每个负载都增加了驱动总线所需的电流,这意味着更大的晶体管处理更大的电流,这意味着晶体管切换所需的时间更长)。当然,还有一些技巧可以让它更快,从缓存(可能还有缓存一致性)开始,预取和推测性执行,以使CPU在等待数据时保持忙碌

通过提供专用机制(例如80x86上的IO端口),一切看起来都很好;因为在高速内存总线和所有(慢得多的)东西之间会有分离

如果我们在最关键的数据路径中间(CPU和RAM之间)敲击一个很大的混乱,那么软件(设备驱动)可以使用内存映射IO来访问设备的内部寄存器?哦,孩子

首先,您将看到缓存的一些主要复杂性(至少,可以说“应该缓存这些区域,而不应该缓存这些区域”,并使用所有逻辑来确定哪些访问是缓存的,哪些访问不是缓存的,以及增加的延迟);加上CPU本身更大的复杂性(是否可以/是否应该尝试预取?是否可以/是否应该推测地执行读/写操作?);再加上处理“谁知道哪些设备可能会被插入”的速度较慢(负载越长)和/或成本更高的总线,可能会带来一些额外的痛苦(等待状态等),以处理比内存慢得多的设备。这听起来是个非常糟糕的主意

然而,事实证明,许多设备可以从直接访问内存总线(使用总线主控/DMA在设备和RAM之间直接传输数据;而不是内存映射IO)中获益,因此您最终还是希望使用较慢的总线,你最终也会想要处理所有其他的复杂问题

如果您查看历史记录(至少对于80x86);您会发现,从“简单,主要使用IO端口”逐渐转变为“极其复杂,主要使用内存映射IO”

为什么我们需要内存映射IO


不,这不是一个严格的必要条件(但如果你愿意接受性能/复杂性的后果,那就更好了)。

你有什么建议作为替代方案?当前CPU还可以如何访问I/O设备?好的,有些架构有一个单独的I/O映射,具有不同的时间和指令,但是映射是通过索引(即“地址”)访问的。