如何复制包含从用户空间的指针,内核
问题描述:
这里的结构是结构我得到:如何复制包含从用户空间的指针,内核
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。
要清楚:从一个局部对象
- 副本
- 验证缓冲区大小,看起来理智的(例如,它不是在大小兆字节,当你想到只有千字节)
- 创建另一本地对象。为缓冲区分配足够的内存并分配给本地对象
- 从第一步中创建的副本(例如localobj-> buffer)获取缓冲区的地址并从中复制该地址。
谢谢你的回复。我已经更新了这个问题。我希望它现在提供更多信息。 – manabinto