直接说结论:现代服务器上的主流 PCIe 设备(如 NVMe 盘、高速网卡、GPU/DPU、RAID 卡等),基本都已全面转向 MMIO(内存映射 I/O)访问,不再使用传统的 Port I/O(x86 的 IN/OUT 指令)来做主要数据交互。
不过,PCIe 协议出于向后兼容的考虑,依然保留了对 I/O 空间的支持,所以在特定场景下还能见到"PCIe 设备申请并使用 I/O 端口"的情况,但属于少数遗留或兼容用途。
📌 主流设备:全面使用 MMIO + DMA
现代高性能 PCIe 设备的驱动工作方式通常是:
-
MMIO(内存映射 I/O) :设备把内部寄存器或缓冲区映射到系统物理地址空间(通过 BAR 实现)。CPU 直接用普通内存读写指令(如
MOV)访问这些地址来控制设备,无需专用 I/O 指令,性能好且支持缓存、虚拟化等现代特性。 -
DMA(直接内存访问):大量数据传输由设备的 DMA 引擎直接在设备与主机内存之间搬运,CPU 只需通过 MMIO 配置一下 DMA 描述符,大幅降低开销。
像 NVMe 固态硬盘、100G/400G 网卡、GPU 加速卡、现代 RAID/HBA 卡等,其高性能路径完全基于 MMIO + DMA,不依赖传统 I/O 端口。
🧰 仍存在 I/O 空间申请的少数情况
虽然功能通信不靠它,但以下场景可能还会见到 PCIe 设备申请 I/O 端口区间(可用 lspci -v看到 I/O ports区域):
-
兼容旧式驱动/接口的设备:比如 PCIe 转串口(UART 16550 兼容)、并口、传统 PS/2 风格设备的桥接卡。它们会映射老式 I/O 端口,以便复用现有传统驱动。
-
遗留兼容模式:部分现代显卡会在 PCIe 配置空间申请少量 I/O 端口,只为保留 VGA/VESA 文本模式兼容(做服务器管理/调试用,正常图形或计算走 MMIO/DMA)。某些 SATA 控制器也可能留 IDE 兼容的 I/O端口,但实际数据路径还是 MMIO/DMA。
-
BMC/IPMI 管理等辅助芯片:服务器带外的管理控制器(如 ASPEED BMC)虽常挂在 PCIe Root Complex 下,但其简单控制通道有时也会涉及传统 I/O 区域,不过核心通信仍以 MMIO 为主。
📝 总结
-
业务面高性能设备(NVMe / 网卡 / GPU) :✅ 纯 MMIO + DMA,无 Port I/O 访问。
-
协议/架构层面:PCIe 仍支持 I/O 空间,但 PCI-SIG 明确建议新设计只用 MMIO,I/O 空间仅为 Legacy 兼容保留。
-
实际在服服务器:你一般只会因兼容旧式串口卡、VGA 兜底模式等,才见到 PCIe 设备占用 I/O 端口,不影响主流 I/O 性能路径。
如果你在具体服务器上用 lspci -v看到了某块 PCIe 卡带有 I/O ports,那基本就是在兼容某种老式编程接口,不必担心它成为现代业务数据通路的瓶颈。