#pragma pack()
对齐,对于这个我的猜想是这样的。操作系统会把不同数据类型的变量放在不同的内存区间。比如将int变量,全部在0x**************00这样的地址中,就可以实现所有的int变量均在地址为4的倍数的地址上了。可能在内核处理的时候可以使用较为简单的运算和便于管理吧。而对short型的地址,便是在最后几位为***0这种地址,最后一位必须为零,这样所有的short型地址,自然就是2的倍数。可能这也是对齐的由来吧。这和内存中页的管理相似,使低10位为零,来作为页的目录的地址。这样可以使用计算机中的逻辑运算便可以达到搜索,如果地址对不齐的话,将要使用算术运算来访问地址,这样的话会降低效率。下面是从msdn copy下来的程序,用于根据设备要求进行数据缓冲区的对齐,其中AlignmentMask是通过IOCTL_STORAGE_QUERY_PROPERTY命令获取的结构体STORAGE_ADAPTER_DESCRIPTOR中的。意思就是先向设备发通过deviceiocontrol函数送一个IOCTL_STORAGE_QUERY_PROPERTY命令,系统返回一个STORAGE_ADAPTER_DESCRIPTOR结构体,其中包含有AlignmentMask项,决定了对齐方式。
PVOID AllocateAlignedBuffer(ULONG size, ULONG AlignmentMask, PVOID *pUnAlignedBuffer)
{
PVOID AlignedBuffer;
ULONG_PTR FullWordMask = (ULONG_PTR)AlignmentMask;
if (AlignmentMask == 0)
{
AlignedBuffer = malloc(size);
// return the original buffer to free later
*pUnAlignedBuffer = AlignedBuffer;
}
else
{
// expand the size for the alignment window
size += AlignmentMask;
AlignedBuffer = malloc(size);
// return the original buffer to free later
*pUnAlignedBuffer = AlignedBuffer;
// adjust buffer pointer for the desired alignment
AlignedBuffer = (PVOID)(((ULONG_PTR)AlignedBuffer + FullWordMask) & ~FullWordMask);
}
return AlignedBuffer;
}
阅读(1059) | 评论(0) | 转发(0) |