lver0929
驱动牛犊
驱动牛犊
  • 注册日期2007-03-21
  • 最后登录2008-07-21
  • 粉丝0
  • 关注0
  • 积分355分
  • 威望40点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
阅读:4062回复:2

关于DMA传输中common buffer的问题

楼主#
更多 发布于:2008-07-01 22:57
请教各位大侠一个问题:
我在看WDK的例子驱动 plx9x5x 的时候,发现例子程序在分配common buffer时用了这样一段代码

DevExt->MaximumTransferLength  = 0x2000;
DevExt->WriteTransferElements = BYTES_TO_PAGES((ULONG) ROUND_TO_PAGES(DevExt->MaximumTransferLength) + PAGE_SIZE);  // ------------------(1)
DevExt->WriteCommonBufferSize = sizeof(DMA_TRANSFER_ELEMENT) * DevExt->WriteTransferElements;                                                         // ------------------(2)
status = WdfCommonBufferCreate( DevExt->DmaEnabler,
                                    DevExt->WriteCommonBufferSize,
                                    WDF_NO_OBJECT_ATTRIBUTES,
                                    &DevExt->WriteCommonBuffer );       //---------------------------------------(3)
其中,DMA_TRANSFER_ELEMENT为一自定义struct类型

主要不明白的是第(1)行代码DevExt->WriteTransferElements为什么要这么赋值?
按我理解,如果PAGE_SIZE是4096的话,DevExt->WriteTransferElements的值就是3,这么赋值的道理何在?
请高人解惑,先谢谢了
chelalv
驱动牛犊
驱动牛犊
  • 注册日期2008-03-22
  • 最后登录2010-04-15
  • 粉丝1
  • 关注0
  • 积分22分
  • 威望146点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-07-17 12:30
我也是刚刚学,还不是很清楚,
这是和具体硬件相结合的,你看看用户手册,看有没有帮助
rsil@sohu.com
驱动牛犊
驱动牛犊
  • 注册日期2007-03-05
  • 最后登录2010-04-13
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望65点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-12-15 19:28
申请common buffer是以PAGE为单位,如果申请的大小不是PAGE的整数倍,则最后一个PAGE里面多出的内存将不能被申请者访问,同时由于整个PAGE已经分配给申请者,其他驱动甚至内核也不能再使用该段内存,从而造成浪费。
因此申请common buffer时需要保证申请的大小是PAGE的整数倍,即使实际用不到也这样申请。这里的写法就没有考虑所申请大小正好是PAGE整数倍,因此会刚好多申请一个PAGE。
游客

返回顶部