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

为了说明这一点:

  • 从复制到本地对象
  • 验证缓冲区大小看起来是否正常(例如,当您只需要KB时,缓冲区大小不是MB)
  • 创建另一个本地对象。为缓冲区分配足够的内存并分配给本地对象
  • 从第一步中复制的副本(例如localobj->buffer)中获取缓冲区的地址,然后从中复制

  • 谢谢你的回复。我已经更新了问题。我希望它现在能提供更多信息。