将数据从内核空间复制到用户空间

我正在尝试进行自定义的系统调用

我的系统调用需要2个参数struct buffer **mybufferint size

它强加的任何变化发生在**mybuffer应该在用户空间反映,但它似乎不起作用。

所以我见过其他地方,我可以使用copy_to_user(void *dest, void *src, int size)将数据从内核空间复制到用户空间。

在用户空间中,我有一个叫做缓冲区的结构体,这个结构体在系统调用中也是一样的。

 typedef struct buffer { int n; }buffer; int main(void) { buffer **buf = malloc(sizeof(buffer *)); int i = 0 for(;i<8;i++) buf[i] = malloc(sizeof(buffer)); long int sys = systemcall(801,buf,8) //print out buf return 0; } 

在系统调用我有

 asmlinkage long sys_something(buffer **buf,int size) { //allocate buffer same as it appears in int main //fill buf with some data for(i = 0; i<size,i++) copy_to_user(buf[i],buf[i],sizeof(buffer)); 

我很确定我做错了什么。 实际上如何将数据从内核空间复制到用户空间?

Ps我正在使用Linux内核3.16.0

Solutions Collecting From Web of "将数据从内核空间复制到用户空间"

函数copy_to_user用于将数据从内核地址空间复制到用户程序的地址空间。 例如,要将已经分配了kmalloc的缓冲区复制到用户提供的缓冲区中。

编辑:你的例子有点复杂,因为你传递一个指向数组的指针。 要访问这些指针,必须首先使用copy_from_user将阵列buf复制到内核空间。

因此,你的内核代码应该是这样的:

 asmlinkage long sys_something(buffer **buf, int size) { /* Allocate buffers_in_kernel on stack just for demonstration. * These buffers would normally allocated by kmalloc. */ buffer buffers_in_kernel[size]; buffer *user_pointers[size]; int i; unsigned long res; /* Fill buffers_in_kernel with some data */ for (i = 0; i < size; i++) buffers_in_kernel[i].n = i; /* just some example data */ /* Get user pointers for access in kernel space. * This is a shallow copy, so that, the entries in user_pointers * still point to the user space. */ res = copy_from_user(user_pointers, buf, sizeof(buffer *) * size); /* TODO: check result here */ /* Now copy data to user space. */ for (i = 0; i < size; i++) { res = copy_to_user(user_pointers[i], &buffers_in_kernel[i], sizeof(buffer)); /* TODO: check result here */ } } 

最后但并非最不重要的是,你的main功能有一个错误。 在第一次malloc调用时,它只为1个指针分配足够的空间,而不是8个。它应该是:

 int main(void) { const int size = 8; buffer **buf = malloc(sizeof(buffer *) * size); for(int i=0; i<size; i++) buf[i] = malloc(sizeof(buffer)); long int sys = systemcall(801,buf,size) //print out buf return 0; }