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. 用户空间访问

这种符号链接使得用户空间工具(如 udevethtool 等)能够轻松找到网络设备对应的物理设备信息。例如,可以通过 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 函数中调用。
 
欢迎加入喵星计算机技术研究院,原创技术文章第一时间推送。
notion image
 
内核源码中为什么会存在同一个函数的多重定义?什么是符号的强弱性?【转载】EtherCAT主站IgH解析(一)--主站初始化、状态机与EtherCAT报文 - 沐多 - 博客园