加载内核模块时,为什么CFG80211符号丢失了?

时间:2020-09-21 08:44:08

标签: module linux-kernel wifi yocto

我获得了集成在Yocto项目中的无线驱动程序。内核使用的.config设置了以下标志:

CONFIG_CFG80211=m

这应该使用CFG80211作为模块编译内核。但是,当我尝试使用以下命令加载MY_MODULE时:

insmod MY_MODULE.ko fw_name=mrvl/MY_MODULE.bin cfg80211_wext=0xf cal_data_cfg=none fw_serial=0

该模块无法加载:

insmod: ERROR: could not insert module MY_MODULE.ko: Unknown symbol in module

失败的原因是在加载模块时CFG80211符号不存在。这可以在运行dmesg时看到:

[ 1534.508504] sd8xxx: Unknown symbol mlan_main_process (err 0)
[ 1534.508560] sd8xxx: Unknown symbol cfg80211_sched_scan_results (err 0)
[ 1534.508704] sd8xxx: Unknown symbol cfg80211_rx_assoc_resp (err 0)
[ 1534.508847] sd8xxx: Unknown symbol cfg80211_scan_done (err 0)
[ 1534.508911] sd8xxx: Unknown symbol cfg80211_sched_scan_stopped (err 0)
[ 1534.508948] sd8xxx: Unknown symbol mlan_shutdown_fw (err 0)
[ 1534.509037] sd8xxx: Unknown symbol mlan_rx_process (err 0)
[ 1534.509064] sd8xxx: Unknown symbol cfg80211_remain_on_channel_expired (err 0)
[ 1534.509077] sd8xxx: Unknown symbol cfg80211_cac_event (err 0)
...

我尝试手动加载CFG80211模块,但是lib/modules/3.14.55-yocto-standard/kernel/net文件夹中没有该模块。这些文件夹中当前可用的模块是:

./kernel/net/wireless
./kernel/net/wireless/lib80211_crypt_tkip.ko
./kernel/net/wireless/lib80211_crypt_ccmp.ko
./kernel/net/wireless/lib80211.ko
./kernel/net/wireless/lib80211_crypt_wep.ko

为什么在加载内核模块时缺少CFG80211个符号?我应该装载80211.ko还是缺少其他东西?

1 个答案:

答案 0 :(得分:2)

Yocto默认情况下不提供内核模块。您可以通过添加kernel-modules软件包将所有内核模块包括在映像中。通常,这是在您的计算机conf文件的MACHINE_EXTRA_RRECOMMENDSMACHINE_ESSENTIAL_EXTRA_RRECOMMENDS中完成的,因此人们可以说他们实际上不想要所有内核模块(这会占用很多存储空间)。

如果要包含此模块,其名称可能为kernel-cfg80211(您可以使用oe-pkgdata-util find-path cfg80211.ko来查找)。由于它是另一个模块所需要的,因此我将其添加到您的计算机配置文件中的MACHINE_EXTRA_RDEPENDSMACHINE_ESSENTIAL_EXTRA_RDEPENDS中。

您不能现实地将其添加到其他内核模块配方的RDEPENDS中,因为如果有人直接在内核中而不是作为模块来编译80211支持,它将破坏您的构建。其他解决方案是在模块配方中使用RRECOMMENDS或将其放在将内核模块软件包添加到映像的位置(在映像配方中或添加映像的位置)。