究竟什么是内存映射 io 和基于端口的 io

问题描述

好吧,我对内存映射 io 和基于端口的 io 有一些困惑。问题是:-

  1. 在基于端口的 io 中,如果我写入一个端口,它是否会影响相应的内存地址,反之亦然。
  2. x86 是使用基于端口的 io 还是内存映射 io。(我认为这取决于主板,x86 可以同时使用两者,如果我错了,请纠正我)。
  3. 在内存映射 io 中存在一些与缓存相关的问题,这些问题是什么?
  4. 我们可以在设备上同时使用这两种类型的 io 吗?
  5. DMA 如何与 HDD 结合使用?

提前致谢。

解决方法

IO 空间 (in / out) 是一个独立于物理内存的地址空间,包括在现代 PCI / PCIe 设备中。这取决于您需要如何与之交谈的设备;现代设备通常只有(或大部分)有 MMIO 寄存器(在物理地址空间中),因为 MMIO 比端口 IO 更有效率。

包含 MMIO 寄存器的部分物理地址空间应在您的 MTRR 或 PAT 中设置为不可缓存;显然,CPU 根本不支持 MMIO 的可缓存内存类型,如果您尝试,可能会锁定。 (您可以将 WC 写入组合内存用于 VGA RAM 之类的东西,即设备内存,允许写入组合产生 64 字节存储事务。https://sites.utexas.edu/jdm4372/2013/05/29/notes-on-cached-access-to-memory-mapped-io-regions/

DMA 如何与 hdd 结合使用?

请参阅 https://wiki.osdev.org/AHCI 了解如何告诉控制器(具有 MMIO 访问权限)您希望它通过 DMA 将数据传入或传出物理 RAM。