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

What exactly is memory mapped io and port based io

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

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

提前致谢。

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

包含 MMIO 寄存器的部分物理地址 space 应在您的 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/

How is DMA used in context with hdd?

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