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

时间:2017-10-07 20:59:48

标签: linux-kernel driver 802.11

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

1 个答案:

答案 0 :(得分:2)

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

相反,您可能会看到write_grf5101() grf5101_rf_init() ./drivers/net/wireless/realtek/rtl818x/rtl8180/grf5101.c位于rtl818x_rf_ops文件中的grf5101_rf_ops功能,而该功能 struct rtl818x_rf_ops结构中的used反过来,正如您可能理解的那样,在驱动程序中某种类似更通用的实体。例如,rtl8180_probe()变量(./drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c类型)rtl8180_probe() rtl8180_driver struct pci_driver函数struct pci_driver。最后,后者module_pci_driver(rtl8180_driver);在类型为.c的{​​{1}}变量中为set as a callback,正如您所看到的那样,某种类似于内核本身维护的接口(所有PCI设备都使用rtl8225_write()注册自己)。下面的write_grf5101()行会在此特定情况下执行此类注册。

所以,重点是“内核”不知道(也可能不应该)关于这种微小的静态助手程序。相反,内核需要一个PCI设备描述结构,而后者将全程用于连接特定设备。但是,典型的驱动程序可能(并且通常具有)内部回调结构 - 通常是特定于芯片的(在驱动程序设计用于提供多个芯片的情况下)某种类似设备系列) - 反过来又指向位于相应requests文件中的芯片专用功能。内部函数可以使用这样的帮助程序(如import requests from bs4 import BeautifulSoup my_url = 'https://www.realtor.ca/Residential/map.aspx#CultureId=1&ApplicationId=1&RecordsPerPage=9&MaximumResults=9&PropertySearchTypeId=1&TransactionTypeId=2&StoreyRange=0-0&BedRange=0-0&BathRange=0-0&NumberofDays=4&LongitudeMin=-122.8479843139653&LongitudeMax=-122.68181610107467&LatitudeMin=49.244425437286374&LatitudeMax=49.303560989620294&SortOrder=A&SortBy=1&viewState=l&Longitude=-122.76490020752&Latitude=49.2740020751953&CurrentPage=1&ZoomLevel=13&PropertyTypeGroupID=1' req = requests.get(my_url) soup = BeautifulSoup(req.text, 'lxml') soup),在这种情况下与内核无关。他们只是一些特定于芯片的小帮手。