最近我研究了linux网络驱动程序,我对结构中的内存对齐有一些问题。
这是net / core / dev.c中的代码片段alloc_netdev_mqs:
alloc_size = sizeof(struct net_device)
if(sizeof_priv)
{
alloc_size = ALIGN(alloc_size, NETDEV_ALIGN) ---------(1)
alloc_size += sizeof_priv;
}
/*ensure 32-byte alignment of whole construct*/
alloc_size += NETDEV_ALIGN - 1; ----------(2)
在(1)中,我认为做ALIGN是合理的,因为我们想将struct net_device与NETDEV_ALIGN的乘数对齐。
但是在(2)处,为了进行对齐,为什么不使用: 再次ALIGN(alloc_size,NETDEV_ALIGN)??
例如,如果我们有:net_device 3字节,NETDEV_ALIGN 4字节和私有日期2字节:
在(1)中我们有ALIGN(3,4)=> 4字节 那么(私有数据大小)+(净设备大小)= 4 + 2 = 6字节
在(2)中为什么不使用ALIGN(6,4)=> 8字节?
我只是无法弄清楚为什么,而不是通过谷歌搜索找到答案。 任何帮助将不胜感激!
答案 0 :(得分:0)
问题是NETDEV_ALIGN = 32不仅仅是kmalloc提供的对齐(最多16个字节)。因为使用额外的填充强制结构的对齐:
p = kzalloc(alloc_size,...);
....
dev = PTR_ALIGN(p, NETDEV_ALIGN);
dev->padded = (char *)dev - (char *)p;
附加值NETDEV_ALIGN - 1
用于填充的提供字节(永远不会超过此值)。