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 无关。它们只是一些芯片专用的小帮手。