阅读:4151回复:2
关于DMA传输中common buffer的问题
请教各位大侠一个问题:
我在看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,这么赋值的道理何在? 请高人解惑,先谢谢了 |
|
沙发#
发布于:2008-07-17 12:30
我也是刚刚学,还不是很清楚,
这是和具体硬件相结合的,你看看用户手册,看有没有帮助 |
|
板凳#
发布于:2008-12-15 19:28
申请common buffer是以PAGE为单位,如果申请的大小不是PAGE的整数倍,则最后一个PAGE里面多出的内存将不能被申请者访问,同时由于整个PAGE已经分配给申请者,其他驱动甚至内核也不能再使用该段内存,从而造成浪费。
因此申请common buffer时需要保证申请的大小是PAGE的整数倍,即使实际用不到也这样申请。这里的写法就没有考虑所申请大小正好是PAGE整数倍,因此会刚好多申请一个PAGE。 |
|