为什么在加载内核模块时缺少 CFG80211 符号?
Why are CFG80211 symbols missing when loading a kernel module?
我已经获得了无线驱动程序,我已将其集成到我的 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 还是我缺少其他东西?
Yocto 默认不提供内核模块。您可以通过添加 kernel-modules
包将所有内核模块包含在您的映像中。这通常在您的机器 conf 文件中的 MACHINE_EXTRA_RRECOMMENDS
或 MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS
中完成,这样人们就可以说他们实际上不需要所有内核模块(它可能需要大量存储空间 space) .
如果你想包含这个模块,它的名称可能是kernel-cfg80211
(你可以使用oe-pkgdata-util find-path cfg80211.ko
找到)。由于另一个模块需要它,我会将它添加到仍在您的机器配置文件中的 MACHINE_EXTRA_RDEPENDS
或 MACHINE_ESSENTIAL_EXTRA_RDEPENDS
。
您实际上无法将它添加到您的其他内核模块配方的 RDEPENDS
中,因为如果有人直接在内核中而不是作为模块编译 80211 支持,它会破坏您的构建。其他解决方案是在模块配方中使用 RRECOMMENDS
或将其放在将内核模块包添加到图像的位置(在图像配方中或添加它的任何地方)。
我已经获得了无线驱动程序,我已将其集成到我的 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 还是我缺少其他东西?
Yocto 默认不提供内核模块。您可以通过添加 kernel-modules
包将所有内核模块包含在您的映像中。这通常在您的机器 conf 文件中的 MACHINE_EXTRA_RRECOMMENDS
或 MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS
中完成,这样人们就可以说他们实际上不需要所有内核模块(它可能需要大量存储空间 space) .
如果你想包含这个模块,它的名称可能是kernel-cfg80211
(你可以使用oe-pkgdata-util find-path cfg80211.ko
找到)。由于另一个模块需要它,我会将它添加到仍在您的机器配置文件中的 MACHINE_EXTRA_RDEPENDS
或 MACHINE_ESSENTIAL_EXTRA_RDEPENDS
。
您实际上无法将它添加到您的其他内核模块配方的 RDEPENDS
中,因为如果有人直接在内核中而不是作为模块编译 80211 支持,它会破坏您的构建。其他解决方案是在模块配方中使用 RRECOMMENDS
或将其放在将内核模块包添加到图像的位置(在图像配方中或添加它的任何地方)。