请允许我通过声明我是驱动程序开发的新手来限定此问题。我试图了解使用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驱动程序可能是“挂钩到另一个内核子系统”的驱动程序。所以我想我的问题是,对于这样的驱动程序,不提供.fops
函数指针,如何与其他内核子系统进行交互?最终,我希望能够找到程序实际与之交互的驱动程序代码中的点以发送和接收数据,以便我可以继续分析代码的工作方式。
答案 0 :(得分: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
。这将设备放入内核的主要网络接口列表中,使其可用于ifconfig
和route
等。
大多数用户空间程序不直接与网络接口交互,它们只是将数据包发送到IP地址,内核使用路由表来选择传出接口。
答案 1 :(得分:0)
RTL8187驱动程序在其探测功能中通过calling ieee80211_alloc_hw()
and ieee80211_register_hw()
向IEEE 802.11无线网络子系统注册。