我一直在阅读数据结构alignment的文章,但我无处可去。 也许事情太复杂了,我不明白。 我也遇到了数据结构填充 ,这也是alignment数据所必需的。 如何添加一个数据结构填充结构usb_ep? 另外我怎样才能确保每当我执行kmalloc读取的数据应该是一个内存偏移量是4的倍数?
关于对齐,kmalloc将正确地对齐结构。 如果你有一个4字节的变量,它将是4字节对齐,如果你有一个8字节的变量,它将被对齐8字节。 理解对齐是需要填充的原因。
你不想得到的是你的结构中的变量之间的garbade填充。 您可以使用pragma pack指令 (可能最简单)或通过手动添加填充来完成此操作。
例
struct usb_ep { short a; /* 2 bytes*/ int b; /* 4 bytes*/ short c; /* 2 bytes*/ };
所有元素的大小都是8字节,但由于对齐的要求,大小将是12字节。 内存布局会是这样的:
short a - 2 bytes char pad[2] - 2 bytes of padding int b - 4 bytes short c - 2 bytes char pad[2] - 2 bytes of padding
为了不获取任何填充或增加结构的大小,可以重新排列元素以满足对齐要求。
这是一个结构:
struct usb_ep { short a; /* 2 bytes*/ short c; /* 2 bytes*/ int b; /* 4 bytes*/ };
将有8字节的大小,并且不需要添加填充。
这来自http://minirighi.sourceforge.net/html/kmalloc_8c.html
void * kmemalign (size_t alignment, size_t size) Allocate some memory aligned to a boundary. Parameters: alignment The boundary. size The size you want to allocate. Exceptions: NULL Out-of-memory. Returns: A pointer to a memory area aligned to the boundary. The pointer is a aligned_mem_block_t pointer, so if you want to access to the data area of this pointer you must specify the p->start filed. Note: Use kfree(void *ptr) to free the allocated block.
在结构中填充字段的最好方法是以降序大小声明变量。 所以,你最大的那个,然后是最小的。
struct example { double amount; char *name; int cnt; char is_valid; };
这并不总是以结构中逻辑上连接的项目结束,而是通常给出最紧凑和容易访问的内存使用。
你可以在你的struct声明中使用填充字节,但是它们混淆了代码,并不保证紧凑的结构。 编译器可以对齐4字节边界上的每个字节,所以你可能会结束
struct example2 { char a; char padding1[3]; char b; char padding2[3]; };
a为4个字节,padding1为4个字节,b为4个字节,padding2为4个字节。 一些编译器允许你指定在这种情况下会产生正确结果的打包结构。 通常我只是宣布从最大到最小类型的领域,并离开它。 如果你需要在两个语言/编译器之间共享内存,那么你需要确保结构在内存中相同。