03:00.0 Non-Volatile memory controller: Intel Corporation SSD 600P Series (rev 03) (prog-if 02 [NVM Express])
Subsystem: Intel Corporation SSD 600P Series
Flags: bus master, fast devsel, latency 0, IRQ 16, NUMA node 0
Memory at f7000000 (64-bit, non-prefetchable) [size=16K]
Capabilities: <access denied>
Kernel driver in use: nvme
现代硬盘驱动器控制器不会让 CPU 使用“编程 I/O”一次复制 4 或 8 个字节的数据。这是经典 IDE / ATA 控制器的一个选项,但仅作为后备,以防万一在您的主板或 PCI HD 控制器上发生不良事件(如锁定或数据损坏),当hdparm用于将 Linux 驱动程序设置为在 pre-SATA 上使用 DMA 传输时系统。
显然,从技术上讲,PIO 仍然是 AHCI SATA 控制器的一个选项。但它从来都不是默认的;与过去很可能损坏硬件的糟糕日子不同,现代操作系统可以安全地期望 DMA 能够正常工作。
脚注 1:除非您的“硬盘驱动器”实际上是内存插槽中的非易失性 DIMM,例如Intel Optane DC PM,或电池供电的 DRAM)。将最近存储的数据从回写式 CPU 缓存推送到非易失性内存映射存储是clflushopt或之类指令的一个用例clwb。
硬盘上的数据不是物理地址空间的一部分。1数据不是内存映射的 。
SATA 控制器(例如)具有 CPU 需要写入的 I/O 寄存器,以对其进行编程以
n
从某个磁盘偏移量到某个物理内存地址进行 DMA 扇区传输。这些 I/O 寄存器中的部分或全部可能可以通过 MMIO(正常加载和存储到特殊地址)而不是
in
/out
端口 IO 访问。但这仍然只是向 SATA 控制器发送所需命令的问题。(有关详细信息,请参阅https://wiki.osdev.org/AHCI。)AHCI是使用最广泛的内核 <-> 硬件驱动程序接口,但也存在其他接口(例如,需要自己的驱动程序的奇特 RAID 控制器).例如,我的主板上的 AHCI SATA 控制器,根据
lspci -v
:那些小的两个“内存”区域(2k 和 8k)几乎可以肯定是 MMIO 端口,但它在 I/O 地址空间中也有一些 I/O 端口。“不可预取”是那里的一个暗示;如果读取有副作用,则必须禁用预取。
注意
flags: bus master
. 这意味着它可以 DMA 到/从主内存。但是我的 NVMe SSD只有MMIO 空间,没有传统的 I/O 端口。
现代硬盘驱动器控制器不会让 CPU 使用“编程 I/O”一次复制 4 或 8 个字节的数据。这是经典 IDE / ATA 控制器的一个选项,但仅作为后备,以防万一在您的主板或 PCI HD 控制器上发生不良事件(如锁定或数据损坏),当
hdparm
用于将 Linux 驱动程序设置为在 pre-SATA 上使用 DMA 传输时系统。显然,从技术上讲,PIO 仍然是 AHCI SATA 控制器的一个选项。但它从来都不是默认的;与过去很可能损坏硬件的糟糕日子不同,现代操作系统可以安全地期望 DMA 能够正常工作。
脚注 1:除非您的“硬盘驱动器”实际上是内存插槽中的非易失性 DIMM,例如Intel Optane DC PM,或电池供电的 DRAM)。将最近存储的数据从回写式 CPU 缓存推送到非易失性内存映射存储是
clflushopt
或之类指令的一个用例clwb
。