请允许我通过声明我是驱动程序开发的新手来限定此问题 . 我试图了解使用RealTek 8187L芯片的USB Wi-Fi卡的驱动程序源代码 . 基于对previous question的一个很好的答案,我确定我需要检查的相关驱动程序源代码是在 drivers/net/wireless/rtl818x/rtl8187/dev.c
(在Linux内核源代码内) .
做一些阅读,似乎USB驱动程序实例化了一个它向内核注册的 usb_driver
结构,它描述了(除其他外)驱动程序支持的设备( .id_table
),这是连接支持的设备时执行的功能( .probe
)和(可选)一组文件操作( .fops
),用于与用户空间交互 . 与8187L驱动程序关联的 usb_driver
结构不包含 .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);
因此,我很好奇用户空间程序如何与此驱动程序交互以发送和接收数据 .
在old Linux Journal post(2001)上,有以下摘录:
fops和次要变量是可选的 . 大多数USB驱动程序都挂钩到另一个内核子系统,例如SCSI,网络或TTY子系统 . 这些类型的驱动程序将自己注册到其他内核子系统,并通过该接口提供任何用户空间交互 . 但是对于没有匹配的内核子系统的驱动程序,例如MP3播放器或扫描仪,需要一种与用户空间交互的方法 . USB子系统提供了一种方法来注册次要设备号和一组file_operations [fops]函数指针,以实现此用户空间交互 .
所以听起来像8187L驱动程序可能是"hooks into another kernel subsystem" . 所以我想我的问题是,对于这样一个不提供 .fops
函数指针的驱动程序,如何与其他内核子系统进行交互?最终,我希望能够找到程序实际与之交互的驱动程序代码中的点以发送和接收数据,以便我可以继续分析代码的工作方式 .
2 回答
单个无线芯片组的驱动程序处于非常低的水平 . 它与用户空间之间有很多层 . 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
. 这将设备置于内核的主要网络接口列表中,使其可用于ifconfig
和route
之类的内容 .大多数用户空间程序不直接与网络接口交互,它们只是将数据包发送到IP地址,内核使用路由表来选择输出接口 .
RTL8187驱动程序在其探测功能中通过calling ieee80211_alloc_hw() and ieee80211_register_hw()向IEEE 802.11无线网络子系统注册自身 .