我对内存映射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现在很复杂。