如何复制包含从用户空间的指针,内核

问题描述:

这里的结构是结构我得到:如何复制包含从用户空间的指针,内核

struct my_struct { 
    int size; 
    int *buffer; 
}; 

现在,我想给一个变量从用户空间复制使用copy_from_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_from_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); 

所以我不认为我的第二个调用copy_from_user是正确的,即使演员之后。

Nb:dma_info是上面定义的结构类型。

如果你有最初的结构体复制进来,为什么你不能只是copy_from(arg-> buffer,....)而不是玩像arg + 4这样的游戏?

因为没有显示任何代码,所以很难肯定地说,但最有可能的问题是在上面。 “缓冲区”的偏移量不是 4个字节。由于对齐要求,它是8,假设x86_64。

要清楚:从一个局部对象

  1. 副本
  2. 验证缓冲区大小,看起来理智的(例如,它不是在大小兆字节,当你想到只有千字节)
  3. 创建另一本地对象。为缓冲区分配足够的内存并分配给本地对象
  4. 从第一步中创建的副本(例如localobj-> buffer)获取缓冲区的地址并从中复制该地址。
+0

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