Linux 内核如何知道要调用哪个驱动函数?
How does the Linux kernel know which driver functions to call?
我正在查看来自 https://github.com/o11s/open80211s/tree/master/drivers/net/wireless/rtl818x/rtl8180 的 802.11 Realtek 驱动程序代码,但无法弄清楚内核如何知道要调用哪个驱动程序函数。
例如,它如何知道它是否需要调用 write_grf5101 或 rtl8225_write 来传输数据报?
来自rtl8225.c:
static void rtl8225_write(struct ieee80211_hw *dev, u8 addr, u16 data)
{
...
}
来自grf5101.c:
static void write_grf5101(struct ieee80211_hw *dev, u8 addr, u32 data)
{
...
}
这两个函数不是内核自己调用的。它们是 static 并驻留在相应的文件中(可能是特定于芯片的文件)。此外,似乎它们在任何地方都没有用作 回调。
相反,您可能会看到,例如,write_grf5101()
在 struct pci_driver
类型的 rtl8180_driver
变量中是 used by grf5101_rf_init()
function in ./drivers/net/wireless/realtek/rtl818x/rtl8180/grf5101.c
file, and that function is set as a callback in rtl818x_rf_ops
structure which in turn, as you might understand, is some sort of like more generic entity within the driver. For instance, that grf5101_rf_ops
variable (which is of type struct rtl818x_rf_ops
) is set as a callback table by rtl8180_probe()
function in ./drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c
. And, finally, the latter rtl8180_probe()
is set as a callback,如您所见,它是某种类似于由内核本身维护的接口(所有 PCI 设备都向 struct pci_driver
注册)。下面的行 module_pci_driver(rtl8180_driver);
在此特定情况下执行此类注册。
所以,关键是 "the kernel" 不知道(而且可能不应该)这些微小的静态帮助程序。取而代之的是,内核需要一个 PCI 设备描述结构,该结构又将被用于连接特定设备。然而,一个典型的驱动程序 可能有 (并且经常有)它的 内部 回调结构 - 通常是芯片特定的(在驱动程序是旨在为某种类似设备系列中的多个芯片提供服务)——这反过来将指向位于相应 .c
文件中的特定于芯片的功能。内部函数可能会使用这样的助手(如 rtl8225_write()
或 write_grf5101()
),在这种情况下与 kernel 无关。它们只是一些芯片专用的小帮手。
我正在查看来自 https://github.com/o11s/open80211s/tree/master/drivers/net/wireless/rtl818x/rtl8180 的 802.11 Realtek 驱动程序代码,但无法弄清楚内核如何知道要调用哪个驱动程序函数。
例如,它如何知道它是否需要调用 write_grf5101 或 rtl8225_write 来传输数据报?
来自rtl8225.c:
static void rtl8225_write(struct ieee80211_hw *dev, u8 addr, u16 data)
{
...
}
来自grf5101.c:
static void write_grf5101(struct ieee80211_hw *dev, u8 addr, u32 data)
{
...
}
这两个函数不是内核自己调用的。它们是 static 并驻留在相应的文件中(可能是特定于芯片的文件)。此外,似乎它们在任何地方都没有用作 回调。
相反,您可能会看到,例如,write_grf5101()
在 struct pci_driver
类型的 rtl8180_driver
变量中是 used by grf5101_rf_init()
function in ./drivers/net/wireless/realtek/rtl818x/rtl8180/grf5101.c
file, and that function is set as a callback in rtl818x_rf_ops
structure which in turn, as you might understand, is some sort of like more generic entity within the driver. For instance, that grf5101_rf_ops
variable (which is of type struct rtl818x_rf_ops
) is set as a callback table by rtl8180_probe()
function in ./drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c
. And, finally, the latter rtl8180_probe()
is set as a callback,如您所见,它是某种类似于由内核本身维护的接口(所有 PCI 设备都向 struct pci_driver
注册)。下面的行 module_pci_driver(rtl8180_driver);
在此特定情况下执行此类注册。
所以,关键是 "the kernel" 不知道(而且可能不应该)这些微小的静态帮助程序。取而代之的是,内核需要一个 PCI 设备描述结构,该结构又将被用于连接特定设备。然而,一个典型的驱动程序 可能有 (并且经常有)它的 内部 回调结构 - 通常是芯片特定的(在驱动程序是旨在为某种类似设备系列中的多个芯片提供服务)——这反过来将指向位于相应 .c
文件中的特定于芯片的功能。内部函数可能会使用这样的助手(如 rtl8225_write()
或 write_grf5101()
),在这种情况下与 kernel 无关。它们只是一些芯片专用的小帮手。