将2D数组从内核复制到用户

时间:2017-10-16 16:46:38

标签: c arrays linux-kernel

我正在制作一个SYSCALL,它接收用户的缓冲区和用户的2D数组。 SYSCALL将解析缓冲区,并在内核空间中将2D数组设置为我在缓冲区中解析的字符串。我已经看到其他帖子声明最简单的方法是只复制一个包含所有已解析信息的缓冲区,但我想要复制数组。这是我的SYSCALL的一般设置:

SYSCALL(..., char __user **doubleBuf, ...)
int len = 0; //stores the length of kdoubleBuf
char *kdoubleBuf[256]; //create 2D array

这些是我的类型。我解析缓冲区并在kdoubleBuf中获得我需要的内容。

for(i = 0; i < 0; i++)
{
    printk(KERN_INFO "%s\n", kdoubleBuf[i]);
}

这将在dmesg中正确打印出来

stringone
stringtwo
etc...

这完全是我想要的,我知道一切正常,就在我尝试将数组复制到用户阵列时。

我知道我错了,因为我试图将指针从内核复制到用户空间,所以当我打印出doubleBuf [i]时,它只是一个空指针。

for(i = 0; i < len; i++){
    //THIS IS WRONG!
    copy_to_user(doubleBuf[i], kdoubleBuf[i], sizeof(kdoubleBuf[i]));
    //check for errors here
}

如何将kdoubleBuf深度复制到doubleBuf并避免浅拷贝?

编辑:请注意,用户空间2D数组已经通过以下方式分配:

user_array[128][256]; //Or do I need to use malloc()?

编辑2&#34;已解决我动态分配doubleBuf。

0 个答案:

没有答案