对于早于2.6.31的Linux内核2.4或2.6,每个注册networking设备的net_device
结构都有一个私有数据块,它由net_device
结构中的priv
指针指向。 但是,对于内核版本2.6.32或更高版本, priv
指针已被弃用。
我想知道现在networking接口驱动程序的私人数据可以存储在哪里。 有没有人清除net_device
结构的相对较新的实现? 提前致谢。
这个答案引用了Linux内核的3.14版本 。
私有数据存储在 net_device
结构的末尾 。
你通过调用alloc_netdev
分配一个net_device
,这只是alloc_netdev_mqs
一个宏。 第一个参数是int sizeof_priv
,它指定了希望在net_device
的末尾为私有数据分配的额外空间量。
你可以通过调用(inline)函数netdev_priv
访问这个私有数据。 通过查看这个函数,你可以看到它只是在真正的struct net_device
结束之后返回一个对齐的指针:
static inline void *netdev_priv(const struct net_device *dev) { return (char *)dev + ALIGN(sizeof(struct net_device), NETDEV_ALIGN); }
我将假设开发者为缓存原因做了这个。 这样,私有数据将落在与结构的其余部分相同的缓存行上,而不必通过priv
指针访问离net_device
很远的内存。
例如,Intel e100驱动程序在e100.c中定义一个专用struct nic
,并在e100_probe中分配其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
,如mdio_write
:
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); }