如何正确使用copy_from_user?
我试图使用以下函数将值从用户空间复制到内核空间:
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)。 我的代码有什么问题? 我一直在看几个例子,我实现了很多变化,但都没有。
手册中的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);
这应该做。
len
在用户空间中不存在。 它是通过值传递的,因此len
可以作为内核空间中的普通变量来访问。 desp = (int)len
就是你所需要的。 但请注意,size_t与int不同,在64位平台上,size_t为8个字节。
copy_from_user()
用于您尝试编写的buffer
在用户空间代码中称为buffer
,在内核空间参数列表中称为buffer
)。 传递的是指向仅存在于用户空间中的内存地址的指针,因此copy_from_user()
将该缓冲区复制到内核空间缓冲区。