请允许我通过说明我是驱动程序开发的新手来限定这个问题。我正在尝试了解使用 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
函数指针的驱动程序,如何与其他内核子系统进行交互?最终,我希望能够在驱动程序代码中找到程序实际与之交互以发送和接收数据的点,以便我可以继续分析代码的工作原理。