我正在实现一个可以写入/ 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是此字符串的长度。
我尝试了什么:
任何帮助都将不胜感激,如果我遗漏任何明显的东西,请告诉我(谷歌搜索导致代码看起来与我的相同)。
答案 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);