如何使用copy_from_user的正确方法?

edu*_*fan 6 c kernel linux-kernel

我正在尝试使用以下函数将值从用户空间复制到内核空间:

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);
}
Run Code Online (Sandbox Code Playgroud)

其中“ len”是用户空间中存在的变量,我想将其复制到内核空间中的“ desp”

我从用户空间进行的函数调用是(根据file_operations结构写入device_write):

 write (fd,buffer,8, &off);
Run Code Online (Sandbox Code Playgroud)

当我打印时,应存储在“ desp”中的值始终为0(应为8)。我的代码有什么问题?我已经看到了几个示例,并且实现了许多变体,但没有任何效果。

小智 6

write手册中的功能原型为:

ssize_t write(int fd, const void *buf, size_t count);

因此,您只需要将3个值传递给write,即:文件描述符fdbuffer数据所在的位置以及count要写入的字节数。

这与用户空间有关。现在,让我们转到内核空间写入功能,即your device_write

buf函数的参数是包含要从用户空间写入的数据的参数,count是发送要由内核写入的数据的长度。因此,应该从而buf不是从指针复制数据len

因此,正确的方法是:

char *desp;  //allocate memory for this in kernel using malloc
copy_from_user (desp, buff, len);
Run Code Online (Sandbox Code Playgroud)

这应该做。