【问题标题】:How does the Linux kernel know which driver functions to call?Linux 内核如何知道要调用哪些驱动程序函数?
【发布时间】:2018-03-19 09:37:04
【问题描述】:

我正在查看来自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)
{
...
}

【问题讨论】:

  • 在此处发布适当的代码尖峰。无需检查外部资源即可回答问题。
  • 我已经为我所指的传输函数添加了代码 sn-ps。
  • 根据代码,驱动程序通过检查读取的一些值来选择probing期间设置的正确功能。

标签: linux-kernel driver wifi


【解决方案1】:

这两个函数不是内核自己调用的。它们是静态的,并驻留在相应的文件中(可能是特定于芯片的文件)。此外,它们似乎在任何地方都没有用作 回调

相反,您可能会看到,例如,write_grf5101()used 通过 grf5101_rf_init() 函数在 ./drivers/net/wireless/realtek/rtl818x/rtl8180/grf5101.c 文件中,而该函数 set as a callbackrtl818x_rf_ops 结构中反过来,正如您可能理解的那样,它是驱动程序中某种更通用的实体。例如,rtl8180_probe() 中的rtl8180_probe() 函数struct rtl818x_rf_opsgrf5101_rf_ops 变量(类型为struct rtl818x_rf_ops)是set as a callback table。最后,后者rtl8180_probe()rtl8180_driver 类型为struct pci_driver 的变量中的set as a callback,如您所见,它有点像内核本身维护的接口(所有PCI 设备都使用@ 987654336@)。下面的行module_pci_driver(rtl8180_driver); 在这种特殊情况下执行此类注册。

所以,关键是“内核”不知道(而且可能不应该)这样小的静态辅助例程。相反,内核需要一个 PCI 设备描述结构,该结构反过来将被用于连接特定设备。然而,一个典型的驱动程序可能有(并且经常有)它的内部回调结构——通常是特定于芯片的(如果驱动程序被设计为服务于多个芯片)某种类似的设备系列) - 这反过来将指向位于相应.c 文件中的芯片特定功能。内部函数可能会使用这样的助手(如rtl8225_write()write_grf5101()),在这种情况下与kernel 无关。它们只是一些特定于芯片的小帮手。

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2010-10-31
    • 2014-07-09
    • 2014-09-30
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    相关资源
    最近更新 更多