type
Post
status
Published
date
Feb 28, 2025
slug
2025/02/28/Detailed-explanation-of-SET_NETDEV_DEV-macro
summary
tags
Linux
category
Linux
created days
new update day
icon
password
Created_time
Mar 1, 2025 01:43 AM
Last edited time
Mar 1, 2025 01:53 AM
SET_NETDEV_DEV
宏详解
SET_NETDEV_DEV
是一个用于设置网络设备(net_device
)与物理设备(通常是 PCI 设备)之间关系的宏。它的主要作用是将网络设备的 dev.parent
字段指向物理设备,从而在 sysfs 文件系统中创建一个符号链接,方便用户空间程序或工具通过 sysfs 访问设备的物理信息。宏定义
/* Set the sysfs physical device reference for the network logical device * if set prior to registration will cause a symlink during initialization. */ #define SET_NETDEV_DEV(net, pdev) ((net)->dev.parent = (pdev))
net
: 指向net_device
结构体的指针,表示一个网络设备。
pdev
: 指向物理设备(通常是struct device
类型)的指针,表示与网络设备关联的硬件设备。
作用
1. 设置父设备
通过将
net->dev.parent
设置为 pdev
,网络设备与物理设备之间建立了父子关系。这种关系在内核的设备模型中非常重要,因为它决定了设备在 sysfs 中的层次结构。2. sysfs 符号链接
当网络设备注册到内核时(通过
register_netdev
),如果 dev.parent
已经设置,内核会自动在 sysfs 中创建一个符号链接,将网络设备与物理设备关联起来。例如:- 物理设备的 sysfs 路径可能是:
/sys/devices/pci0000:00/0000:00:01.0/
- 网络设备的 sysfs 路径可能是:
/sys/class/net/eth0/
- 通过
SET_NETDEV_DEV
,内核会在/sys/class/net/eth0/device
中创建一个符号链接,指向物理设备的路径。
3. 用户空间访问
这种符号链接使得用户空间工具(如
udev
、ethtool
等)能够轻松找到网络设备对应的物理设备信息。例如,可以通过 ethtool -i eth0
查看网卡的驱动信息和硬件信息。使用场景
SET_NETDEV_DEV
通常在 PCI 网络设备驱动的 probe
函数中调用,例如:static int my_netdev_probe(struct pci_dev *pdev, const struct pci_device_id *id) { struct net_device *netdev; netdev = alloc_etherdev(sizeof(struct my_priv_data)); if (!netdev) return -ENOMEM; // 设置网络设备的父设备 SET_NETDEV_DEV(netdev, &pdev->dev); // 其他初始化操作 // ... // 注册网络设备 if (register_netdev(netdev)) { free_netdev(netdev); return -EIO; } return 0; }
在这个例子中:
pdev
是 PCI 设备的结构体指针。
netdev
是网络设备的结构体指针。
- 通过
SET_NETDEV_DEV(netdev, &pdev->dev)
,网络设备的父设备被设置为 PCI 设备。
内核设备模型中的作用
在内核设备模型中,每个设备都有一个
struct device
结构体,用于表示设备及其在设备树中的位置。net_device
结构体中包含一个 struct device dev
字段,用于表示网络设备在内核设备模型中的实例。通过设置
dev.parent
,网络设备被挂载到物理设备的设备树中,从而在 sysfs 中形成以下层次结构:/sys/devices/pci0000:00/0000:00:01.0/ # 物理设备 /sys/class/net/eth0/ # 网络设备 /sys/class/net/eth0/device -> ../../pci0000:00/0000:00:01.0 # 符号链接
总结
SET_NETDEV_DEV
宏的作用是将网络设备与物理设备关联起来,从而在内核设备模型和 sysfs 中建立父子关系。这种关系不仅有助于设备管理的层次化,还为用户空间工具提供了方便的访问路径。它是 PCI 网络设备驱动中一个非常重要的步骤,通常在 probe
函数中调用。 欢迎加入“喵星计算机技术研究院”,原创技术文章第一时间推送。

- 作者:tangcuyu
- 链接:https://expoli.tech/articles/2025/02/28/Detailed-explanation-of-SET_NETDEV_DEV-macro
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章