[英]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)
{
...
}
内核本身不调用这两个函数。 它们是静态的 ,位于相应的文件(可能是特定于芯片的文件)中。 另外,似乎它们在任何地方都没有用作回调 。
相反,你可以看到,例如, write_grf5101()
是使用由grf5101_rf_init()
函数./drivers/net/wireless/realtek/rtl818x/rtl8180/grf5101.c
文件,以及功能 设置为回调中rtl818x_rf_ops
正如您可能理解的那样,结构又像是驱动程序中更通用的某种实体。 例如,该grf5101_rf_ops
变量(它是类型的struct rtl818x_rf_ops
)被设定为回调表由rtl8180_probe()
函数./drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c
。 最后,将后者rtl8180_probe()
设置为 struct pci_driver
类型的rtl8180_driver
变量中的回调 ,如您所见,它有点像内核自身维护的接口(所有PCI设备都向struct pci_driver
注册) 。 行module_pci_driver(rtl8180_driver);
下面在这种特殊情况下执行这种注册。
因此,关键是“内核”不知道(也可能不应该)如此小的静态帮助程序。 取而代之的是,内核需要一个PCI设备描述结构,该结构随后将被用于与特定设备的接口。 但是,典型的驱动程序可能具有 (并且经常具有)其内部回调结构-通常是特定于芯片的(在该驱动程序设计为服务某种类型的设备系列中的多个芯片的情况下)-这又将指向特定于芯片的功能位于相应的.c
文件中。 内部函数可以使用此类帮助程序(如rtl8225_write()
或write_grf5101()
),在这种情况下,与内核无关。 他们只是一些特定于芯片的小助手。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.