如何正确使用copy_from_user?

时间:2013-07-05 13:50:46

标签: c linux-kernel 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);
}

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

我从用户空间调用的函数是(根据file_operations结构,write是device_write):

 write (fd,buffer,8, &off);

当我打印应该存储在“desp”中的值总是0(应该是8)。 我的代码有什么问题?我已经看到了几个例子,我实现了很多变化,但都没有。

2 个答案:

答案 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,即:你的数据所在的文件描述符fdbuffer和你想要的count个字节写。

这关于用户空间。现在让我们转到内核空间写入功能,即你的device_write

此函数的参数buf是包含要从用户空间写入的数据的参数countbuf是由内核写入的数据长度。因此,您应该从len指针而不是char *desp; //allocate memory for this in kernel using malloc copy_from_user (desp, buff, len); 复制数据。

所以,正确的方法是:

{{1}}

应该这样做。