Linux内核如何知道要调用哪个驱动程序函数?

问题描述:

我正在查看https://github.com/o11s/open80211s/tree/master/drivers/net/wireless/rtl818x/rtl8180的802.11 Realtek驱动程序代码,但无法弄清楚内核如何知道要调用哪个驱动程序函数。Linux内核如何知道要调用哪个驱动程序函数?

例如,它如何知道它是否需要调用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) 
{ 
... 
} 
+0

在这里发布适当的代码字段。如果不检查外部资源,应该回答问题。 – bolov

+1

我已经添加了我所指的传输函数的代码片段。 – charlesw

+1

根据该代码,驾驶员选择期间设置适当的功能[探测](https://github.com/o11s/open80211s/blob/master/drivers/net/wireless/rtl818x/rtl8180/dev.c#L1042)通过检查一些读取的值。 – Tsyvarev

这两个函数不是由内核本身调用。他们是静态并驻留在相应的文件(可能是芯片专用文件)。此外,它们似乎不是在任何地方都用作回调

相反,你可以看到,例如,write_grf5101()used通过grf5101_rf_init()功能./drivers/net/wireless/realtek/rtl818x/rtl8180/grf5101.c文件,该功能rtl818x_rf_ops结构set as a callback这反过来,你可能明白了,是一些有点像比较通用驱动程序内的实体。例如,该变量grf5101_rf_ops(这是struct rtl818x_rf_ops类型)是set as a callback table通过./drivers/net/wireless/realtek/rtl818x/rtl8180/dev.crtl8180_probe()功能。最后,后者rtl8180_probe()struct pci_driver,正如你可能会看到类型的rtl8180_driver变量set as a callback,是某种类似内核本身(所有PCI设备与struct pci_driver注册自己)保持的接口。下面的行module_pci_driver(rtl8180_driver);在这个特定的情况下执行这种注册。

所以,问题是,“内核”不知道(也可能不应该)对这种微小的静态辅助程序。取而代之的是,内核需要一个PCI设备描述结构,而这个结构反过来将被用来连接特定设备。一种典型的驱动器,但是,可以具有(常常具有)其内部回调结构 - 通常芯片特定的(在情况下,当驱动器被设计以某种类似的设备的家庭的服务于多个芯片) - 这在转向将指向位于相应的.c文件中的芯片专用功能。内部函数可能会使用这样的助手(如rtl8225_write()write_grf5101()),在这种情况下,与内核无关。他们只是一些小芯片特定的帮手。