2

请允许我通过说明我是驱动程序开发的新手来限定这个问题。我正在尝试了解使用 RealTek 8187L 芯片的 USB Wi-Fi 卡的驱动程序源代码。基于对我之前的问题的一个很好的回答,我确定我需要检查的相关驱动程序源代码位于drivers/net/wireless/rtl818x/rtl8187/dev.c(在 Linux 内核源代码中)。

做一些阅读,似乎 USB 驱动程序实例化了一个usb_driver它向内核注册的结构,它描述(除其他外)驱动程序支持的设备(.id_table),连接支持的设备时执行的功能(.probe)和可选,一组文件操作(.fops),用于与用户空间交互。usb_driver与 8187L 驱动程序关联的结构包括.fops

static struct usb_driver rtl8187_driver = {
    .name       = KBUILD_MODNAME,
    .id_table   = rtl8187_table,
    .probe      = rtl8187_probe,
    .disconnect = __devexit_p(rtl8187_disconnect),
    .disable_hub_initiated_lpm = 1,
};

module_usb_driver(rtl8187_driver);

因此,我很好奇用户空间程序如何与该驱动程序交互以发送和接收数据。

在一篇旧的 Linux Journal 帖子(2001 年)中,有以下摘录:

fops 和次要变量是可选的。大多数 USB 驱动程序连接到另一个内核
子系统,例如 SCSI、网络或 TTY 子系统。这些类型的驱动程序将自己注册到其他内核子系统,并且通过该接口提供任何用户空间交互。但是对于没有匹配内核子系统的驱动程序,例如 MP3 播放器或扫描仪,需要一种与用户空间交互的方法。USB 子系统提供了一种注册次要设备号和一组启用此用户空间交互的 file_operations [fops]函数指针的方法。

因此,听起来 8187L 驱动程序可能是“挂钩到另一个内核子系统”的驱动程序。所以我想我的问题是,对于这样一个提供.fops函数指针的驱动程序,如何与其他内核子系统进行交互?最终,我希望能够在驱动程序代码中找到程序实际与之交互以发送和接收数据的点,以便我可以继续分析代码的工作原理。

4

2 回答 2

3

单个无线芯片组的驱动程序处于非常低的级别。它和用户空间之间有很多层。rtl8187 之上的下一层是 mac80211。在drivers/net/wireless/rtl818x/rtl8187/dev.c观察对ieee80211_register_hw. 该注册调用提供了 mac80211 层和 rtl8187 设备之间的链接。

接下来看看 的实现ieee80211_register_hw,发现在net/mac80211/main.c. 那个调用ieee80211_if_add,发现在net/mac80211/iface.c,哪个调用register_netdevice。这会将设备置于内核的主要网络接口列表中,使其可用于诸如ifconfigroute.

大多数用户空间程序不直接与网络接口交互,它们只是将数据包发送到 IP 地址,内核使用路由表选择传出接口。

于 2012-07-27T03:47:51.083 回答
0

RTL8187 驱动程序通过调用ieee80211_alloc_hw() ieee80211_register_hw()在其探测函数中向 IEEE 802.11 无线网络子系统注册自身。

于 2012-07-27T03:44:34.717 回答