设置缓冲区对齐掩码
执行DMA传输的设备直接使用内存中的数据缓冲区工作。HAL要求DMA传输中使用的缓冲区必须按某个特定界限对齐,而且设备也可能有更严格的对齐需求。设备对象中的AlignmentRequirement域表达了这个约束,它是一个位掩码,等于要求的地址边界减一。下面语句可以把任何地址圈入这个界限:
- PVOID address = ...;
- SIZE_T ar = fdo->AlignmentRequirement;
- address = (PVOID) ((SIZE_T) address & ~ar); //特别是这句 ,看不懂
-
- //还可以把任意地址圈入下一个对齐边界:
- PVOID address = ...;
- SIZE_T ar = fdo->AlignmentRequirement;
- address = (PVOID) (((SIZE_T) address + ar) & ~ar);//更看不懂了.
把任何地址圈入这个界限://这句话是什么意思??
希望前辈们帮我分析分析.
这就是一个地址对齐问题.
(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.
明白了吧.
引用: 引用 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.到底想干什么呢?
向上对齐又是为了什么 ??
地址对齐嘛,地址对齐的作用和为什么对齐其实我也是一知半解,只知道跟CPU寻址有关,对齐后CPU寻址更快,再具体的我也说我也说不上来了.
------------
那么改变了Address的值为44.到底想干什么呢?
向上对齐又是为了什么 ??
------------
这个要放到整个代码中去看才知道是为什么,要不然鬼才知道这几句代码要干什么.
一般的是不用我们自己去调整地址对齐的,出现这种情况极有可能是这个地址是从用户那里得到的,比如比文件中读进来的或者从注册表中读取的.所以我们要自己对它进行对齐.