C 如何将包含指针的结构从用户空间复制到内核
以下是我得到的结构:C 如何将包含指针的结构从用户空间复制到内核,c,linux,linux-kernel,driver,C,Linux,Linux Kernel,Driver,以下是我得到的结构: struct my_struct { int size; int *buffer; }; 现在,我想使用copy\u from\u user将一个变量从用户空间复制到内核空间,但它似乎不起作用。 我所做的是: 在用户空间中,我声明了一个变量struct my_struct data,我将其初始化并传递到一个ioctl,在内核中,我调用copy_from_user(&mydataInkernel,arg,sizeof(mydataInkernel)),然后为
struct my_struct {
int size;
int *buffer;
};
现在,我想使用copy\u from\u user
将一个变量从用户空间复制到内核空间,但它似乎不起作用。
我所做的是:
在用户空间中,我声明了一个变量struct my_struct data
,我将其初始化并传递到一个ioctl,在内核中,我调用copy_from_user(&mydataInkernel,arg,sizeof(mydataInkernel))
,然后为指针分配正确的内存并再次调用copy_from_user(mydataInkernel.buffer,arg+4,mydataInkernel.size)
。我不知道我做错了什么,但它不起作用
第一个副本是否也复制mydataInkernel.buffer指向的所有数据
是否有一种简单地使用copy\u from\u user
的方法来做到这一点
更新1:
对于我的体系结构上的指针大小,它确实是8字节(x86_64)。更清楚地说,我正在编写一个设备驱动程序,这是为了使用ioctl从用户空间到内核空间获取数据。下面是我尝试获取缓冲区的代码:
ret_val = copy_from_user(dma_info, (ioctl_dma *)arg, sizeof(dma_info));
if (ret_val)
printk(KERN_WARNING "COPY_FROM_USER failed !");
else
ret_val = copy_from_user(dma_info->buffer, (ioctl_dma *)arg->buffer, dma_info->taille);
if (ret_val)
printk(KERN_WARNING "COPY_FROM_USER failed !");
else
{
//Do the treatment
}
这是ioctl函数的原型:
long pci_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
所以我认为我的第二份拷贝并不正确,即使是在演员阵容之后
注意:dma_信息属于上面定义的结构类型。如果您复制了初始结构,为什么您不能从(arg->buffer,…)复制_而不是玩arg+4之类的游戏 由于没有显示任何代码,因此很难说清楚,但最有可能的问题是上述问题。“缓冲区”的偏移量不是4字节。“缓冲区”的偏移量是8字节,这是由于对齐要求,假设x86_64 为了说明这一点:
谢谢你的回复。我已经更新了问题。我希望它现在能提供更多信息。