初学WDM遇到看不懂的了.

licaiquan77   2009-10-17 00:05 楼主
设置缓冲区对齐掩码
执行DMA传输的设备直接使用内存中的数据缓冲区工作。HAL要求DMA传输中使用的缓冲区必须按某个特定界限对齐,而且设备也可能有更严格的对齐需求。设备对象中的AlignmentRequirement域表达了这个约束,它是一个位掩码,等于要求的地址边界减一。下面语句可以把任何地址圈入这个界限:

  1. PVOID address = ...;
  2. SIZE_T ar = fdo->AlignmentRequirement;
  3. address = (PVOID) ((SIZE_T) address & ~ar); //特别是这句 ,看不懂


  4. //还可以把任意地址圈入下一个对齐边界:

  5. PVOID address = ...;
  6. SIZE_T ar = fdo->AlignmentRequirement;
  7. address = (PVOID) (((SIZE_T) address + ar) & ~ar);//更看不懂了.

把任何地址圈入这个界限://这句话是什么意思??
希望前辈们帮我分析分析.

回复评论 (3)

这就是一个地址对齐问题.

(PVOID) ((SIZE_T) address & ~ar); 这一句的作用是:将address以fdo->AlignmentRequirement+1(因为你题中说过"它是一个位掩码,等于要求的地址边界减一")个字节的对齐方式向下对齐. 举例说,假设address值为47,要以4个字节的对齐方式对齐,则fdo->AlignmentRequirement的值为3,所以这个表达式为:(PVOID)((SIZE_T)47 & ~3),其值为44. 44是第一个比47小的并且是4的倍数的数.

同理,(PVOID) (((SIZE_T) address + ar) & ~ar)是将address以fdo->AlignmentRequirement+1个字节的对齐方式向上对齐.注意这里是向上对齐.所以仍是上面那个例子的话,表达式的值应为48.

明白了吧.
点赞  2009-10-17 09:10
引用: 引用 1 楼 yangyang__ 的回复:
这就是一个地址对齐问题.

(PVOID) ((SIZE_T) address & ~ar); 这一句的作用是:将address以fdo->AlignmentRequirement+1(因为你题中说过"它是一个位掩码,等于要求的地址边界减一")个字节的对齐方式向下对齐. 举例说,假设address值为47,要以4个字节的对齐方式对齐,则fdo->AlignmentRequirement的值为3,所以这个表达式为:(PVOID)((SIZE_T)47 & ~3),其值为44. 44是第一个比47小的并且是4的倍数的数.

同理,(PVOID) (((SIZE_T) address + ar) & ~ar)是将address以fdo->AlignmentRequirement+1个字节的对齐方式向上对齐.注意这里是向上对齐.所以仍是上面那个例子的话,表达式的值应为48.

明白了吧.


就算把Address以向下4字节对齐方式对其,那么改变了Address的值为44.到底想干什么呢?
            向上对齐又是为了什么 ??
点赞  2009-10-17 19:16
地址对齐嘛,地址对齐的作用和为什么对齐其实我也是一知半解,只知道跟CPU寻址有关,对齐后CPU寻址更快,再具体的我也说我也说不上来了.

------------
那么改变了Address的值为44.到底想干什么呢?
            向上对齐又是为了什么 ??
------------
这个要放到整个代码中去看才知道是为什么,要不然鬼才知道这几句代码要干什么.

一般的是不用我们自己去调整地址对齐的,出现这种情况极有可能是这个地址是从用户那里得到的,比如比文件中读进来的或者从注册表中读取的.所以我们要自己对它进行对齐.
点赞  2009-10-17 20:08
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复