type
status
date
slug
summary
tags
category
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 访问设备的物理信息。

宏定义

  • 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 函数中调用,例如:
在这个例子中:
  • pdev 是 PCI 设备的结构体指针。
  • netdev 是网络设备的结构体指针。
  • 通过 SET_NETDEV_DEV(netdev, &pdev->dev),网络设备的父设备被设置为 PCI 设备。

内核设备模型中的作用

在内核设备模型中,每个设备都有一个 struct device 结构体,用于表示设备及其在设备树中的位置。net_device 结构体中包含一个 struct device dev 字段,用于表示网络设备在内核设备模型中的实例。
通过设置 dev.parent,网络设备被挂载到物理设备的设备树中,从而在 sysfs 中形成以下层次结构:

总结

SET_NETDEV_DEV 宏的作用是将网络设备与物理设备关联起来,从而在内核设备模型和 sysfs 中建立父子关系。这种关系不仅有助于设备管理的层次化,还为用户空间工具提供了方便的访问路径。它是 PCI 网络设备驱动中一个非常重要的步骤,通常在 probe 函数中调用。
内核源码中为什么会存在同一个函数的多重定义?什么是符号的强弱性?【转载】EtherCAT主站IgH解析(一)--主站初始化、状态机与EtherCAT报文 - 沐多 - 博客园
Loading...