关于Windows下的DMA操作。

这几天遇到了64bit Win8下的一个Bug,我们的chip是支持ScatterGather的,但是在做DMA之前,我们修改对应的Memory却没有生效。

DMA传输出去的内容还是之前没有改过的。

回来的路上,看了下面这篇文章,终于明白其中的原因了。www.microsoft.com/whdc/driver/kernel/dma.mspx

Device跟Memory进行传输DMA的时候,Device能访问的地址访问受Device本身的寻址范围所限。

在我的环境下,Chip是32bit的Bus,所以只能访问0-4G的地址,而系统是64bit的,有些Memory(Mem1)的物理地址在4G以上的空间。

导致Device无法直接拿到,所以OS会额外在0-4G的物理地址开了一块Memory(Mem2),就是所谓的Map Register。

OS把4G以上的Mem1的内容Copy到Mem2,所以DMA拿的其实是Mem2的内容,这就是为什么我修改Mem1,DMA传输的数据却没有变化。

那OS把4G以上的Mem1 copy到4G以下的Mem2是在什么时候做的呢?答案就是NdisMAllocateNetBufferSGList。

所以只要在Call NdisMAllocateNetBufferSGList之前修改数据还是会生效的。

Windows在两种情况下会用到Map Register这种copy memory的机制。

1. Device不支持ScatterGather。

2. 需要DMA的内存的物理地址无法被Device的总线直接访问到。

那篇链接的文档里面关于DMA的操作有很详细的描述。

转载于:https://www.cnblogs.com/zzSoftware/archive/2013/01/30/2883804.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值