alloc_netdev_mqs中的内存对齐

时间:2015-07-16 16:20:14

标签: linux-kernel

最近我研究了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字节?

我只是无法弄清楚为什么,而不是通过谷歌搜索找到答案。 任何帮助将不胜感激!

1 个答案:

答案 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用于填充的提供字节(永远不会超过此值)。