使用lshw
查询我的 WiFi USB 适配器显示以下内容:
$ lshw -C network
*-network
description: Wireless interface
physical id: 12
bus info: usb@3:7
logical name: ...
serial: ...
capabilities: ethernet physical wireless
configuration: broadcast=yes driver=rtw_8822bu driverversion=6.5.0-28-generic firmware=N/A ip=... link=yes multicast=yes wireless=IEEE 802.11
适配器工作正常。然而,我很困惑driver=rtw_8822bu
。据我所知,我的系统上没有调用内核模型rtw_8822bu.ko
,相反,我有rtw88_8822bu.ko
,
/usr/lib/modules/6.5.0-28-generic/kernel/drivers/net/wireless/realtek/rtw88/rtw88_8822bu.ko
它还显示使用lsmod
:
$ lsmod | grep rtw
rtw88_8822bu 12288 0
rtw88_usb 24576 1 rtw88_8822bu
rtw88_8822b 229376 1 rtw88_8822bu
rtw88_core 356352 2 rtw88_usb,rtw88_8822b
mac80211 1720320 3 rtw88_core,rtw88_usb,rtl8xxxu
cfg80211 1323008 3 rtw88_core,mac80211,rtl8xxxu
问:为什么系统中的内核模块命名时会lshw
显示。以前的名字是从哪里来的?driver=rtw_8822bu
rtw88_8822bu
模块是包含可以加载到内核中的函数的库。
在编写模块时,您可以定义一个C数据
struct
包,它定义了驱动程序的名称,以及要调用的函数来检查是否有驱动程序可以处理的设备,当设备拔出时调用哪个函数,除其他事项外。然后,您在其中放置一个宏,将该数据结构注册为“驱动程序”的表示。因此,“驱动程序”实际上只是一个想法,包含一个名称和几个在特定情况下调用的函数(例如当您想要设置或拆除设备的功能时)。
所以,这是你的驱动程序的数据结构:
看到里面的“.name =”了吗?这 就是定义驱动程序名称的地方。
以下是它在模块中注册为驱动程序的方式:
您可以根据需要在单个模块中包含任意多个驱动程序,前提是每个驱动程序都有不同的名称。并且模块的名称没有必要与驱动程序的名称相同。您可以调用一个模块,
drivers_for_webcams.ko
并且它可以包含realtek_ssd_controller_driver1
throughrealtek_ssd_controller_driver98
,并且不会有任何问题;驱动程序名称 == 模块名称的假设是完全错误的。