我正在尝试使用以下函数将值从用户空间复制到内核空间:
static ssize_t device_write(struct file *filp, const char *buff, size_t len, loff_t *off)
{
unsigned long copy=0;
int desp=0;
copy = copy_from_user(&desp, &len, 4);
printk(KERN_ALERT "copy: %lx\n", copy);
printk(KERN_ALERT "desp: %d\n", desp);
}
其中“len”是用户空间中存在的变量,我想将其复制到内核空间中的“desp”
我从用户空间调用的函数是(根据file_operations结构,write是device_write):
write (fd,buffer,8, &off);
当我打印应该存储在“desp”中的值总是0(应该是8)。 我的代码有什么问题?我已经看到了几个例子,我实现了很多变化,但都没有。
答案 0 :(得分:4)
len
不存在于用户空间中。它按值传递,因此len
可作为内核空间中的普通变量访问。你只需要desp = (int)len
。但请注意,size_t与int不同,在64位平台上,size_t为8个字节。
copy_from_user()
用于您尝试编写的缓冲区(在您的用户空间代码中称为buffer
,在您的内核空间参数列表中称为buff
。传递的是指向仅存在于用户空间中的内存地址的指针,因此copy_from_user()
将该缓冲区复制到内核空间缓冲区。
答案 1 :(得分:4)
手册中的write
函数原型是:
ssize_t write(int fd, const void *buf, size_t count);
所以你只需要将3个值传递给write
,即:你的数据所在的文件描述符fd
,buffer
和你想要的count
个字节写。
这关于用户空间。现在让我们转到内核空间写入功能,即你的device_write
。
此函数的参数buf
是包含要从用户空间写入的数据的参数count
,buf
是由内核写入的数据长度。因此,您应该从len
指针而不是char *desp; //allocate memory for this in kernel using malloc
copy_from_user (desp, buff, len);
复制数据。
所以,正确的方法是:
{{1}}
应该这样做。