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)
{
...
}
这两个函数不是由内核本身调用。他们是静态并驻留在相应的文件(可能是芯片专用文件)。此外,它们似乎不是在任何地方都用作回调。
相反,你可以看到,例如,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.c
rtl8180_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()
),在这种情况下,与内核无关。他们只是一些小芯片特定的帮手。
在这里发布适当的代码字段。如果不检查外部资源,应该回答问题。 – bolov
我已经添加了我所指的传输函数的代码片段。 – charlesw
根据该代码,驾驶员选择期间设置适当的功能[探测](https://github.com/o11s/open80211s/blob/master/drivers/net/wireless/rtl818x/rtl8180/dev.c#L1042)通过检查一些读取的值。 – Tsyvarev