21天学pcie--:I/O 空间( 目录六、第三种I/O 空间已基本淘汰1️⃣ I/O 空间是什么2️⃣ 为什么当年要有 I/O 空间3️⃣ PCIe 里的 I/O 空间长什么样4️⃣ I/O 空间 vs MMIO核心对比5️⃣ PCIe 为什么几乎不用 I/O 空间① 地址空间太小② 架构不通用③ 性能差④ 规范不鼓励6️⃣ Linux 里怎么访问 I/O BAR获取 I/O 端口访问方式7️⃣ 一个真实“老设备”例子8️⃣ 现代 PCIe 设备的正确做法9️⃣ 一个常见误区必须澄清七、三种地址空间最终对比必背八、一句话终极总结第 7 篇收尾九、工程师小贴士强烈建议加框十、第 7 篇完整结构最终版十一、下一篇预告六、第三种I/O 空间已基本淘汰1️⃣ I/O 空间是什么I/O 空间I/O Space​ 是一种独立于内存地址空间的访问机制起源于 x86 架构。一句话定义I/O 空间是为早期外设设计的、专用的寄存器访问通道。它通过专门的 CPU 指令访问架构指令x86IN/OUT而不是普通的load / store。I/O 空间 ≠ 内存也不是 MMIO2️⃣ 为什么当年要有 I/O 空间在 PCI 时代内存地址宝贵总线结构简单设备数量少兼容 ISA 是刚需于是 PCI 保留了 I/O 空间给键盘给串口给老网卡给老存储控制器I/O 空间是“历史妥协的产物”3️⃣ PCIe 里的 I/O 空间长什么样在配置空间中BAR 的最低位[0]1→ I/O BAR其余位含义与 MMIO BAR 类似lspci中你会看到Region 0: I/O ports at e000 [size256]只要看到I/O ports就是 I/O 空间4️⃣ I/O 空间 vs MMIO核心对比对比项I/O 空间MMIO地址域独立CPU 物理地址访问指令IN / OUTload / store是否可缓存❌❌是否可预取❌部分可地址宽度16-bitx8632/64-bit扩展性极差极好现代设备支持❌✅PCIe 推荐❌✅MMIO 全方位碾压 I/O 空间5️⃣ PCIe 为什么几乎不用 I/O 空间原因非常现实① 地址空间太小x86 传统 I/O64KB高端设备根本不够用② 架构不通用ARM / RISC-V 大多不支持 I/O 空间PCIe 是跨平台总线③ 性能差串行化访问指令开销大不利于 DMA④ 规范不鼓励PCIe 规范明确指出I/O BARs are optional and not recommended for new designs.“可选 不推荐” 事实上的淘汰6️⃣ Linux 里怎么访问 I/O BAR获取 I/O 端口unsigned long io_port pci_resource_start(pdev, 0);访问方式#include linux/ioport.h outb(0x01, io_port REG_OFFSET); u8 val inb(io_port REG_OFFSET);只能在 x86 上用ARM 上直接不可用7️⃣ 一个真实“老设备”例子某些老 Realtek 网卡BAR0I/O ports兼容 DOS / BIOSBAR2MMIO现代 OS 用Linux 驱动会优先使用 MMIO只有在以下情况才用 I/OMMIO 分配失败平台限制调试模式I/O 是“保底方案”不是“主力方案”8️⃣ 现代 PCIe 设备的正确做法✅只用 MMIO BAR​✅控制寄存器 Non-Prefetchable MMIO​✅数据缓冲区 Prefetchable MMIO​✅完全不用 I/O BAR如果你在 FPGA 里新做一个 PCIe Endpoint❗不要实现 I/O BAR9️⃣ 一个常见误区必须澄清❌ 误区“I/O 空间比 MMIO 稳定因为是专用的。”✅ 正解**I/O 空间只是“老”不是“稳”。MMIO 才是现代系统的标准路径。**七、三种地址空间最终对比必背地址空间作用是否内存映射是否现代推荐配置空间​管理设备❌✅管理面MMIO​操作设备✅✅✅✅I/O 空间​兼容旧设备❌❌一句话记住配置空间负责“认人”MMIO 负责“干活”I/O 空间负责“怀旧”。八、一句话终极总结第 7 篇收尾**PCIe 的三种地址空间本质上是“历史、现实与未来”的共存配置空间是必须的骨架MMIO 是现代的血肉I/O 空间是即将消失的影子。**九、工程师小贴士强烈建议加框⚠️ 如果你在调试一个 PCIe 设备发现只有 I/O BAR或驱动强制使用inb/outb请先确认这是不是 10 年前的老设备是否能切换到 MMIO是否值得为其写新驱动在现代平台上I/O 空间 技术债。十、第 7 篇完整结构最终版一、三种地址空间总览 二、配置空间管理面 三、MMIO 空间数据面 四、I/O 空间历史包袱 五、三种空间对比总结十一、下一篇预告第 8 篇PCIe 事务层TLP长什么样不看协议也能懂​我们将第一次真正走进 PCIe 协议层TLP 的基本结构Header / Data / DigestMemory Read / Write TLP 示例为什么 PCIe 是“基于报文的总线”