152、 PCIE Linux驱动DMA操作:从一次深夜调试说起

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值