linux 内核版本 4.12.8 中未定义的 copy_to_user

Posted

技术标签:

【中文标题】linux 内核版本 4.12.8 中未定义的 copy_to_user【英文标题】:copy_to_user undefined in linux kernel version 4.12.8 【发布时间】:2018-02-28 08:41:20 【问题描述】:

在我的项目中,我使用 char 驱动程序在用户空间和内核空间之间进行通信。我使用函数copy_to_user(void user *to, const void *from, unsigned long n) 将数据从内核空间复制到用户空间缓冲区。我们可以在#include < asm/uaccess.h >头文件下找到这个函数。 我使用 Linux Kernel 版本 4.4.0-59-generic、Ubuntu OS 版本 16.04 LTS 编译了该项目,它工作正常,没有任何错误和警告。我得到了想要的输出。

我使用 Linux 内核版本 4.12.8、Ubuntu OS 版本 16.04.2 LTS 编译了同一个项目,它在编译时向我抛出了警告 WARNING: "copy_to_user" [/home/ldrv1/Desktop/Vijay/code/build/uts.ko] undefined!。当我对我的模块执行 insmod 时,出现如下错误insmod: ERROR: could not insert module uts.ko: Unknown symbol in module。我认为 4.12.8 内核版本仍然支持 #include <asm/uaccess.h> 头文件,否则我会遇到致命错误:编译时没有此类文件或目录错误。我尝试使用 apt-get install linux-headers-$(uname -r) 命令更新 linux 内核头文件,得到以下响应:

Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package linux-headers-4.12.8
E: Couldn't find any package by glob 'linux-headers-4.12.8'
E: Couldn't find any package by regex 'linux-headers-4.12.8'

此操作系统版本 16.04.2 LTS 具有 linux-headers-4.10.0-35。 我如何摆脱这个警告?建议和支持表示赞赏。如果需要更多信息,请随时询问。

【问题讨论】:

【参考方案1】:

    对于 4.12.8,您应该使用 #include <linux/uaccess.h>。 这是definition。

    4.4 中,一些驱动程序使用 #include <asm/uaccess.h> 而其他驱动程序 使用#include <linux/uaccess.h>

    #include <linux/uaccess.h> 更可取,我认为。

    你应该先apt-get update 然后apt-get install linux-headers-generic

【讨论】:

在 4.15 中,您似乎需要 和 include/linux 中的头文件定义了 copy_to_user,include/asm 中的头文件定义了 raw_copy_to_user .【参考方案2】:

asm/uaccess.h中定义的copy_to_usercopy_from_user函数。我认为您在定义此功能时遇到了一些问题。我用一些关于内核空间和用户空间之间数据传输的例子编写了字符设备驱动程序。查看我的github:my code供参考。如果您觉得对您有帮助,请加注星标:)。它在示例 3 中存在小错误。我正在计算它们,但示例 1 和示例 2 运行良好

【讨论】:

嗨,我的问题得到了解决方案,我浏览了你的示例代码,它很好。我给了你一颗星。感谢您的回复。 :)【参考方案3】:

Bronislav Elizaveti 给出的答案是正确的。如果我们使用#include <linux/uaccess.h> 而不是#include <asm/uaccess.h>,那么我们将不会收到警告。

如果您仍只想使用#include <asm/uaccess.h>,则需要使用_copy_to_user 而不是copy_to_user(具有相同的参数)。一个简单的 _ 就可以完成这项工作。

【讨论】:

以上是关于linux 内核版本 4.12.8 中未定义的 copy_to_user的主要内容,如果未能解决你的问题,请参考以下文章

宏中未使用的参数会怎样?

更改 PHP 版本后调用 Xampp 中未定义的函数 mb_detect_encoding() (PHPmyadmin)

怎么查看linux的内核符号表?

基于Linux制作驱动过程中需要认识的 ------内核模块

访问未通过 EXPORT_SYMBOL* 导出的 Linux 内核符号

Linux内核C语言将升级