我正在嘗試進行自定義系統調用。將數據從內核空間複製到用戶空間
我的系統調用需要2個參數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));
我敢肯定,我做錯了什麼。實際上如何將數據從內核空間複製到用戶空間?
P.s.我正在使用Linux內核3.16.0
有'dest'和'src'等於'BUF [I]'肯定是不對的。你想拷貝什麼** kernel **的數據?指向這些數據的指針應該用作'copy_to_user'的第二個參數。還要注意,因爲第一個syscall的參數實際上是一個*指針數組*,所以您需要使用'copy_from_user'來讀取這些指向內核(臨時)內存的指針,然後在'copy_to_user'調用中使用該內核內存中的指針。 – Tsyvarev