当我们写入内存映射的I/O区域时,数据是否写入主存?



我对内存映射I/O (MMIO)有一个基本的了解。以下内容摘自维基百科页面:

内存映射I/O使用相同的地址空间来为内存和I/O设备寻址。I/O设备的内存和寄存器被映射到(关联到)地址值。因此,内存地址既可以指物理RAM的一部分,也可以指I/O设备的内存和寄存器。因此,用于访问存储器的CPU指令也可以用于访问设备。每个I/O设备监视CPU的地址总线,并响应分配给该设备的地址的任何CPU访问,将数据总线连接到所需设备的硬件寄存器。为了容纳I/O设备,CPU使用的地址区域必须为I/O保留,而不能用于正常的物理内存。

我的问题是,假设MMIO区域的地址是addr,如果我们向addr发出写入,它是否也会写入主存中的addr?还是只写入I/O设备内的内存?

我的想法如下:

由于声明"一个内存地址可能指的是物理RAM的一部分,也可能指的是I/O设备的内存和寄存器",因此数据不会写入RAM,即数据永远不会进入RAM,相反,它将被I/O设备的内存控制器侦听,并写入设备内存。

如果我们从地址addr发出读指令,该读指令将被I/O设备的内存控制器捕获,数据将从设备内存传输到CPU的目标寄存器。如果我们想要数据在内存中,那么我们需要发出另一个写操作,到另一个地址addr_new(不与addr重叠)。

我可以知道我的理解是否正确吗?

在内存映射的I/O中,没有同时映射到RAM和I/O寄存器的地址——它是其中之一。

实际上是关于处理器指令集的。

x86处理器具有读写IO寄存器的特殊指令。

内存映射I/O是另一种选择。您使用相同的指令来使用内存或I/O,并且只有您使用的地址决定哪个是哪个。

最简单的旧式内存映射I/O实现可以只使用其中一条地址行来选择内存或I/O端口,要求两者实现类似的协议。但是,这在今天并不实际,因为RAM现在很复杂。

最新更新