我按照文档编译了一个驱动程序。但是当我尝试通过以下方式加载它们时
insmod onebox_wlan_nongpl.ko
,我收到一条错误消息:
insmod:错误:无法插入模块 onebox_wlan_nongpl.ko:模块中未知符号
我知道这是由于加载.ko
文件的顺序错误造成的,但它没有告诉我它依赖于哪个模块。我想知道哪个符号对于我应该首先加载的模块来说是未知的。
答案1
您可以使用 简单地检查 dmesg 中缺失的符号dmesg | tail
。如果您想检查符号是否确实在您的符号表中,请使用cat /proc/kallsyms | grep <function_name>
类似问题进行检查:
https://ubuntuforums.org/showthread.php?t=1360950
答案2
要查看哪些符号实际上缺失,请使用 查看内核日志dmesg
。它将向您显示确切的符号。如果您自己编写了内核模块,并且它依赖于设备映射框架之类的框架,则必须先加载依赖项。下面是我遇到的一个例子:
我写了一个设备映射器,这取决于设备映射框架。插入时,会发生以下情况:
$ sudo insmod some-module.ko
insmod: ERROR: could not insert module some-module.ko: Unknown symbol in module
检查内核日志:
$ sudo dmesg
[ XX.XXXXXX] some-module.ko: Unknown symbol dm_per_bio_data (err -2)
[ XX.XXXXXX] some-module.ko: Unknown symbol dm_put_device (err -2)
...
检查已加载的模块:
$ lsmod | grep dm
<NOTHING>
插入设备映射目标驱动程序:
$ sudo modprobe dm_mod
$ lsmod | grep dm
dm_mod 184320 0
现在插入原始模块,错误就解决。