152、 PCIE Linux驱动DMA操作:从一次深夜调试说起
凌晨两点,示波器上的波形还在跳动。板卡上的FPGA通过PCIE不断向主机发送数据,但dmesg里反复刷着“DMA mapping error”的警告。抓包工具显示TLP包已经发出,但驱动里的skb始终是空的。这场景是不是很熟悉?今天我们就来拆解PCIE Linux驱动中的DMA操作,那些手册里不会写的实战细节。
DMA为什么这么折腾
先明确一个概念:PCIE的DMA不是简单的内存拷贝。它涉及三个地址空间的转换——CPU物理地址、总线地址、设备视角地址。x86平台有IOMMU,ARM平台可能有SMMU,嵌入式SoC可能什么都没有。你的驱动代码得在所有这些场景下都能跑。
上次有个同事在驱动里直接用了virt_to_phys(),在启用IOMMU的系统上直接崩了。记住这个教训:永远不要假设物理地址和总线地址是相同的。
映射操作:三种姿势你得懂
先看这段典型代码:
/* 分配一个缓冲区 */
buf = kmalloc
订阅专栏 解锁全文

453

被折叠的 条评论
为什么被折叠?



