【发布时间】:2016-03-13 14:14:40
【问题描述】:
我正在尝试进行自定义系统调用。
我的系统调用有两个参数struct buffer **mybuffer & int 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));
我很确定我做错了什么。实际上如何将数据从内核空间复制到用户空间?
附:我正在使用 linux 内核 3.16.0
【问题讨论】:
-
让
dest和src等于buf[i]肯定是错误的。您要复制什么内核的数据?指向这些数据的指针应用作copy_to_user的第二个参数。还要注意,因为第一个系统调用的参数实际上是一个指针数组,您需要使用copy_from_user读取这些指向内核(临时)内存的指针,然后在@ 中使用来自该内核内存的指针987654332@电话。
标签: c linux linux-kernel system-calls