对于早于2.6.31的Linux内核2.4或2.6,每个注册的网络设备的net_device
结构都有一个与之关联的私有数据块,由priv
指针指向该结构。 net_device
结构。但是,对于内核版本2.6.32或更高版本,不推荐使用priv
指针。
我想知道现在可以存储网络接口驱动程序的私有数据。有人清楚net_device
结构的相对较新的实现吗?提前谢谢。
答案 0 :(得分:4)
这个答案引用了Linux内核的version 3.14。
私人数据存储在net_device
结构的末尾。
您通过调用net_device
来分配alloc_netdev
,alloc_netdev_mqs
只是netdev_priv
的一个宏。第一个参数是int sizeof_priv
,它指定了您希望在私有数据的net_device
末尾分配的额外空间量。
您可以通过调用(内联)函数struct nic
来访问此私有数据。通过查看该函数,您可以看到它只是在真实struct net_device
结束后返回一个对齐的指针:
static inline void *netdev_priv(const struct net_device *dev)
{
return (char *)dev + ALIGN(sizeof(struct net_device), NETDEV_ALIGN);
}
我将假设开发人员出于缓存原因这样做。这样,私有数据将与结构的其余部分位于同一缓存行中,而不必通过net_device
指针访问距离priv
很远的内存。
例如,Intel e100驱动程序在e100.c中定义了一个私有e100_probe
,并在mdio_write
中分配了net_device
。您看到它将sizeof(struct nic)
传递给alloc_etherdev
,这是分配以太网设备的便利功能:
static int e100_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{
struct net_device *netdev;
struct nic *nic;
int err;
if (!(netdev = alloc_etherdev(sizeof(struct nic))))
return -ENOMEM;
然后,要在其他位置访问此私人数据,他们会调用netdev_priv
,如{{3}}中所示:
static void mdio_write(struct net_device *netdev, int addr, int reg, int data)
{
struct nic *nic = netdev_priv(netdev);
nic->mdio_ctrl(nic, addr, mdi_write, reg, data);
}