【问题标题】:Why are CFG80211 symbols missing when loading a kernel module?为什么加载内核模块时缺少 CFG80211 符号?
【发布时间】:2020-09-21 08:44:08
【问题描述】:

我获得了已集成到 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 还是我缺少其他东西?

【问题讨论】:

    标签: module linux-kernel wifi yocto


    【解决方案1】:

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

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

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

    【讨论】:

    • 您为我指明了正确的方向。问题是MACHINE_ESSENTIAL_EXTRA_RDEPENDS 是通过使用bb.utils.contains 函数填充的。出于某种原因,我需要在以下行中的“wifi”单词和撇号之间添加一个空格:MACHINE_FEATURES_append = "${@bb.utils.contains('MY_MODULE_FLAG', 'true', ' wifi', '',d)}" 以实际包含 cfg80211 模块。我现在可以加载 cfg80211 模块,然后是我的模块。
    • 嗨,Ricard,_append“运算符”不添加前导空格,并且大多数变量需要空格分隔的字符串列表,因此您必须在 wifi 之前添加空格。
    猜你喜欢
    • 2020-09-30
    • 2012-02-26
    • 2014-03-10
    • 2022-10-19
    • 2012-12-21
    • 2014-03-01
    • 1970-01-01
    • 2012-11-08
    • 2011-04-04
    相关资源
    最近更新 更多