gpt4 book ai didi

c - 在 Linux 内核 2.6.32 或更高版本中,每个 net_device 的私有(private)数据存储在哪里?

转载 作者:太空狗 更新时间:2023-10-29 11:44:41 25 4
gpt4 key购买 nike

对于 2.6.31 之前的 Linux 内核 2.4 或 2.6,每个已注册网络设备的 net_device 结构都有一个与之关联的私有(private)数据 block ,由 priv net_device 结构中的指针。但是,对于内核版本 2.6.32 或更高版本,priv 指针已被弃用。

我想知道网络接口(interface)驱动程序的私有(private)数据现在可以存储在哪里。有人清楚 net_device 结构的相对较新的实现吗?提前致谢。

最佳答案

此答案引用了 version 3.14 Linux 内核。

私有(private)数据存储在 net_device末尾结构。

你分配一个net_device调用alloc_netdev , 这只是 alloc_netdev_mqs 的一个宏.第一个参数是 int sizeof_priv,它指定您希望在 net_device 末尾为您的私有(private)数据分配的额外空间量。

您可以通过调用(内联)函数 netdev_priv 来访问此私有(private)数据.通过查看该函数,您可以看到它只是在真正的 struct net_device 结束后返回一个对齐的指针:

static inline void *netdev_priv(const struct net_device *dev)
{
return (char *)dev + ALIGN(sizeof(struct net_device), NETDEV_ALIGN);
}

我假设开发人员这样做是出于缓存原因。这样,私有(private)数据将与结构的其余部分位于同一缓存行,而不必通过 priv 指针访问距离 net_device 很远的内存.


例如,Intel e100 驱动程序定义了一个私有(private)的 struct nic在 e100.c 中,并在 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;

然后为了在别处访问这些私有(private)数据,他们调用了 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);
}

关于c - 在 Linux 内核 2.6.32 或更高版本中,每个 net_device 的私有(private)数据存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24051453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com