从Linux内核模块执行copy_to_user时出现“Bad Address”错误

时间:2018-05-05 20:06:38

标签: linux module kernel

我正在实现一个可以写入/ proc的内核模块(版本2.6.32),并允许从/向用户空间和内核空间进行写入和读取。我对内核空间代码的写入工作正常,但在尝试copy_to_user时,我收到一条消息,说它有一个“坏地址”。

我正在运行echo "test" > procmodule(模块的名称)和cat procmodule以从模块内存中检索字符串。第二个命令的结果是

  

cat:procmodule:地址错误

以下是相关代码:

int read_info( char *page , char **start, off_t off, int count, int *eof, void *data) {    
    if(copy_to_user(page, info, count)){
     return -EFAULT;
    }
    return count;
}

Page是用户缓冲区的地址,info是当前包含我要打印的字符串的char数组。 Count是此字符串的长度。

我尝试了什么:

  • 打印“info”字符串,打印出我想要查看的内容,以便数组不是问题
  • 打印“页面”,指针存在
  • 在create_proc_entry中更改模块的权限仍然有错误
  • 返回0,数组本身的大小,以及copy_to_user的结果(这是写入的缓冲区大小,应该与count相同)在函数末尾,同样的错误。如果相关,copy_to_user返回3072

任何帮助都将不胜感激,如果我遗漏任何明显的东西,请告诉我(谷歌搜索导致代码看起来与我的相同)。

1 个答案:

答案 0 :(得分:0)

.read_proc函数(类型read_proc_t)的第一个参数实际上是内核地址。您可以直接写信给这个地址,不应该使用copy_to_user

您可能会将您的函数与.read结构中的file_operations函数混淆。该功能有签名

ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);

,它的第二个参数实际上是指向用户空间的指针(因此它有__user说明符),应该使用copy_to_user

请注意,您的函数的第一个参数没有__user说明符:

typedef int (read_proc_t)(char *page, char **start, off_t off,
          int count, int *eof, void *data);