3

在我的项目中,我使用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编译了该项目,并且其工作正常,没有任何错误和警告。我得到所需的输出。copy_to_user在Linux内核版本4.12.8中未定义

我使用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内核版本否则我会得到致命的错误:编译时没有这样的文件或目录错误。我试着用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的头,4.10.0-35。 如何摆脱此警告?建议和支持表示赞赏。如果需要更多信息,请随时询问。

回答

3
  1. 您应该使用#include <linux/uaccess.h>4.12.8。 这是definition

    4.4一些司机使用#include <asm/uaccess.h>而其他 使用#include <linux/uaccess.h>

    #include <linux/uaccess.h>是可取的,我想。

  2. 你应该做apt-get update然后apt-get install linux-headers-generic

+0

谢谢布罗尼斯拉夫。您的解决方案奏效 –

+0

不客气。 –

0

功能copy_to_user调用copy_from_userASM/uaccess.h中定义。我想你在定义这个函数时遇到了一些问题。我用字符设备驱动程序编写了一些关于内核空间和用户空间之间数据传输的例子。查看我的github:my code以供参考。如果你觉得它对你有帮助,请明星:)。它在示例3中有一个小错误。我正在计算它们,但示例1和示例2工作正常

+0

嗨海,我得到了我的问题的解决方案,我经历了您的示例代码和它的好。我给你一颗星星。感谢您的回复。 :) –

0

由Bronislav Elizaveti给出的答案是正确的。而不是#include < asm/uaccess.h>如果我们使用#include < linux/uaccess.h>我们不会得到警告。 如果你仍然想使用#include < asm/uaccess.h>然后将函数改为_copy_to_user(void user * to,const void * from,unsigned long n)而不是copy_to_user(void user * to,const void * from,unsigned long n)。一个简单的_将会完成这项工作。