首页 > 解决方案 > 为什么加载内核模块时缺少 CFG80211 符号?

问题描述

我已经获得了无线驱动程序,该驱动程序已集成到我的 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 还是我缺少其他东西?

标签: modulelinux-kernelwifiyocto

解决方案


Yocto 默认不提供内核模块。您可以通过添加 package.json 在映像中包含所有内核模块kernel-modules。这通常在您的机器 conf 文件中MACHINE_EXTRA_RRECOMMENDSMACHINE_ESSENTIAL_EXTRA_RRECOMMENDS在您的机器 conf 文件中完成,因此人们可以说他们实际上不想要所有内核模块(这可能会占用大量存储空间)。

如果你想包含这个模块,它的名字可能是kernel-cfg80211(你可以通过使用找到oe-pkgdata-util find-path cfg80211.ko)。由于另一个模块需要它,我会将它添加到MACHINE_EXTRA_RDEPENDSMACHINE_ESSENTIAL_EXTRA_RDEPENDS仍然在您的机器 conf 文件中。

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


推荐阅读