gpt4 book ai didi

linux - 从 Linux 内核模块执行 copy_to_user 时出现 "Bad Address"错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:46 25 4
gpt4 key购买 nike

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

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

cat: procmodule: Bad address

相关代码如下:

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数组。计数是这个字符串的长度。

我尝试过的:

  • 打印“信息”字符串,它打印我想看到的内容,所以数组不是问题
  • 正在打印“page”,指针存在
  • 修改create_proc_entry中模块的权限,还是报错
  • 返回0,数组本身的大小,以及函数结束时copy_to_user的结果(也就是写入的缓冲区大小,应该和count一样),同样的错误。如果相关,copy_to_user 返回 3072

非常感谢任何帮助,如果我遗漏了任何明显的东西,请告诉我(大量谷歌搜索导致代码似乎与我的实现相同)。

最佳答案

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


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

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);

关于linux - 从 Linux 内核模块执行 copy_to_user 时出现 "Bad Address"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50193572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com