模块加载期间出现“未知符号 __copy_to_user”错误

问题描述

我有基于 arm64 Realtek RTD1296 cpu 的 NAS Terramaster F4-210。它具有基于 OpenWrt 15.05.1自定义固件和 4.4.18 linux 内核。我想创建内核模块以使用我的 zigbee 棒(cdc-acm - USB 调制解调器(CDC ACM)支持)并在其上运行 homeassistant。

# uname -a
Linux TNAS-BA68 4.4.18-g8bcbd8a-dirty #1327 SMP Mon Aug 31 11:55:52 CST 2020 aarch64 GNU/Linux

我下载了合适的 kernel,创建了一些配置,在安装我新编译的模块后,我在内核日志中收到以下错误

# modprobe cdc-acm
1 module Could not be probed
- cdc-acm

# dmesg
...
cdc_acm: UnkNown symbol __copy_to_user (err 0)
cdc_acm: UnkNown symbol __copy_from_user (err 0)
cdc_acm: UnkNown symbol _mcount (err 0)

据我所知,这意味着模块期望 copy_to_usercopy_from_usermcount 成为内核(或其他加载的模块)的一部分。但内核不导出这些符号:

# cat /proc/kallsyms | grep copy_to_user
ffffff80082923f0 T copy_to_user_page
ffffff80087d2600 T __arch_copy_to_user
ffffff80087e67b0 t kfifo_copy_to_user
ffffff8008871854 T my_copy_to_user

文件 arch/arm64/include/asm/uaccess.hcopy_to_user 的定义:

extern unsigned long __must_check __copy_to_user(void __user *to,const void *from,unsigned long n);
...
static inline unsigned long __must_check copy_to_user(void __user *to,unsigned long n)

文件 arch/arm64/lib/copy_to_user.S 包含 __copy_to_user 的源代码

ENTRY(__copy_to_user)
ALTERNATIVE("nop",__stringify(SET_PSTATE_PAN(0)),ARM64_HAS_PAN,CONfig_ARM64_PAN)
...
ENDPROC(__copy_to_user)

我最初的想法是我的内核配置或工具链不好。所以我使用了具有相同 cpubanana pi W2 板上的工具链和 OpenWrt+内核配置。没有任何运气,但编译警告消失了。

那么有人可以确认问题不能通过应用一些不同的内核配置或适当的工具链来解决。相反,必须修改内核源代码。例如。而不是 __copy_to_user 必须使用 __arch_copy_to_usermy_copy_to_user 之一。

所以我的假设是:Terramaster 获取内核源代码修改(可能使用 __arch_copy_to_user 而不是 __copy_to_user),然后编译源代码

顺便说一句:我还检查了内核源代码,但没有找到 __arch_copy_to_user。这是否意味着它是由内核源代码修改引入的,还是仍然存在,从而使用了一些讨厌的定义。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)