内存映射IO- IO设备知道值如何变化



io设备如何知道与其有关的内存中的值在内存映射IO中发生了变化?

例如,假设内存地址0已致力于保存VGA设备的背景颜色。VGA设备如何更改内存中的值[0]时如何知道?VGA设备是否会不断轮询内存位置?或CPU更改值时会以某种方式通知设备(如果是这样,则如何?(?

示例架构是MIPS。鉴于MIPS指令集没有inout指令,我不明白它如何与示例中的VGA设备进行通信(更改(。另一个例子是ARM架构。

在内存映射的I/O中,执行内存读/写入设备的内存区域将导致CPU使用设备执行交易以获取/存储该值 - 要么直接通过CPU的内存总线,或通过辅助总线(例如AHB/APB在ARM系统上(。此内存事务直接通知设备正在更改值;无需单独的通知。

您假设内存映射的I/O由普通RAM映射。事实并非如此。的确,这些设备可能以与真实内存完全不同的方式行为!例如,典型的UART或SPI设备实现可能具有单个数据寄存器,该数据寄存器可以写入以传输数据,或从中读取以检索接收到的数据。同样,中断寄存器的"清晰读取"或"写1以清除"语义并不少见。

对于它的价值:实际上,许多FrameBuffer图形实现实际上确实是正常内存。与众不同的是,内存存储在双重端口的RAM(或时间多连线的总线(中,并且视频Ramdac连续读取该内存,以将其内容传输到附带的显示。

物理地址空间的一个区域,该区域被指定为内存映射I/O(MMIO(未映射到主内存(系统内存(;它映射到I/O寄存器的物理上是I/O设备的一部分。

要确定如何处理内存访问(读取或写入(,处理器首先检查目标内存地址所属区域的类型。在任何MIPS处理器中,至少有两种类型:未适应和缓存。MMIO区域总是没有隔离的。未经检查的内存访问请求直接发送到主内存控制器,而无需检查或影响任何缓存。但是,i/o未适应的内存访问请求已发送到I/O控制器,最终该请求将到达目标I/O设备。

现在,准确地说,CPU和I/O设备如何相互通信由I/O设备本身完全指定。因此,I/O设备的规范将讨论有多少个I/O寄存器以及如何使用它们。I/O寄存器可用于保存状态标志,控制标志,由CPU读取或编写的数据或某些组合。请注意,由于I/O寄存器实际上是I/O设备的一部分,因此可以设计I/O设备,以便它可以检测到何时从读取或写入任何寄存器的任何寄存器,并相应地采取操作需要。

一个I/O设备可以将中断发送到CPU,以告知它有些数据可用,或者可能出于任何原因想要注意。CPU还可以通过检查一些状态标志,然后采取相应的操作来经常对I/O设备进行轮询。

最新更新