Jet*_*lue 5 io cpu cpu-architecture memory-mapping
IO 设备如何知道与其相关的内存中的值在内存映射 IO中已更改?
例如,假设内存地址 0 专用于保存 VGA 设备的背景颜色。当我们改变内存[0]中的值时,VGA设备如何知道?VGA 设备是否不断轮询内存位置?或者CPU在改变值时是否以某种方式通知设备(如果是的话,如何通知?)?
一个示例架构是 MIPS。鉴于MIPS 指令集没有in或out指令,我不明白它如何可能与示例中的 VGA 设备进行通信(在更改时)。另一个例子是ARM架构。
小智 4
在内存映射 I/O 中,对设备的内存区域执行内存读/写将导致 CPU 与设备执行事务以获取/存储该值——直接通过 CPU 的内存总线,或通过辅助内存总线总线(例如 ARM 系统上的 AHB/APB)。此内存事务直接通知设备某个值正在更改;无需单独通知。
您假设内存映射 I/O 是由普通 RAM 映射的。不是这种情况。事实上,这些设备的行为方式可能与真实内存完全不同!例如,典型的 UART 或 SPI 设备实现可能具有单个数据寄存器,可以写入该数据寄存器以传输数据,或读取该数据寄存器以检索接收到的数据。同样,中断寄存器具有“读取时清除”或“写入 1 清除”语义的情况也并不罕见。
值得一提的是:在实践中,许多帧缓冲区图形实现实际上表现得与普通内存一样。不同之处在于,内存存储在双端口 RAM(或时分复用总线)中,视频 RAMDAC 连续读取该内存,将其内容传输到连接的显示器。