如何正确使用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()将该缓冲区复制到内核空间缓冲区。