我正在尝试使用以下函数将值从用户空间复制到内核空间:
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)。
我的代码有什么问题?我看过几个例子,并且实现了许多变体,但没有一个有效。
The 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);
这应该可以。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)