我最近研究了网络设备驱动程序。但不知何故不明白free_netdev这个功能。
我已阅读以下链接: Possible de-reference of private data using net_device
答案说,当释放网络设备时,私人数据也将是免费的。
检查此功能后,我发现它将调用以下函数:
void netdev_freemem(struct net_device *dev)
{
char *addr = (char *)dev - dev->padded;
kvfree(addr);
}
但是我无法理解为什么调用这个函数会释放所有net_device内存,还有私有数据?
或者我的理解是错误的......
只是想知道是否有人可以指导我理解free_netdev的机制。
提前致谢。
答案 0 :(得分:2)
在net / core / dev.c
中查看alloc_netdev()函数定义alloc_size = sizeof(struct net_device);
if (sizeof_priv) {
/* ensure 32-byte alignment of private area */
alloc_size = ALIGN(alloc_size, NETDEV_ALIGN);
alloc_size += sizeof_priv;
}
/* ensure 32-byte alignment of whole construct */
alloc_size += NETDEV_ALIGN - 1;
p = kzalloc(alloc_size, GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT);
if (!p)
p = vzalloc(alloc_size);
if (!p)
return NULL;
dev = PTR_ALIGN(p, NETDEV_ALIGN);
dev->padded = (char *)dev - (char *)p;
它有一个sizeof(struct net_device)+ sizeof_priv + padding_bytes的Kzalloc。
所以net_device private是紧跟struct net_device之后的内存,因此netdev的kfree()释放了net_device_private内存。
答案 1 :(得分:0)
谢谢@Nithin
在检查了alloc_netdev_mqs的代码后,我认为绘制图表来回答我自己的问题是很清楚的。所以从图中我们可以看到(char *)dev - dev-> padded只是想找到p的位置,而释放这个p变量只会释放所有分配的内存。
------------------- [p = kzalloc(alloc_size, GFP_KERNEL)]
------------------- [dev = PTR_ALIGN(p, NETDEV_ALIGN)]
since p may not aligned to NETDEV_ALIGN * n
and the final added NETDEV_ALIGN - 1 is for the space
of dev - p
------------------- [size of net_device struct]
------------------- [do the size alignment of net_device struct]
------------------- [private data]
------------------- [add final NETDEV_ALIGN - 1 for padding]