我目前正在尝试通过传递char*
缓冲区作为参数来调用系统调用。但是,我无法将任何数据写入char*
缓冲区,也无法从char*
缓冲区读取。我尝试使用char x = 'a'
将数据分配给copy_to_user
然后使用copy_from_user
,反之亦然,但没有任何结果,也没有复制任何值。我一直在尝试太久而且没有取得进展。有人可以帮我解决这个问题,或指出我哪里出错了。
系统调用是:
static void generate_Tasklist(char*,int);
static void generate_Tasklist(char *buffer,int size)
{
printk("\nINSIDE THE FUNCTION\n");
char x;
x = 'a';
int res = access_ok(VERIFY_WRITE,buffer,size);
printk("The return value of access_ok is %d\n",res);
int res1 = copy_to_user(buffer,&x,1);
printk("\nTHE RESULT AFTER copy_to_user IS %d\n",res1);
int res2 = copy_from_user(x,buffer,1);
printk("---------%c\n",x);
printk("\nTHE RESULT AFTER copy_from_user IS %d\n",res2);
}
asmlinkage long sys_syscall(char __user *buffer,int size) {
printk("\nThis is the system call to list processes!!!!!!!!!!!!!!!!!!!!!!!!\n");
generate_Tasklist(buffer,size);
return 0;
}
用户空间计划是:
int main(int argc, char *argv[]) {
char *bytes = (char *) malloc( sizeof( struct task_info ) * 3 );
int size = sizeof( struct task_info ) * 3;
for (int i=0; i < size; i++)
{
*(bytes + i) = 'x';
}
long int output = syscall(__NR_hello,1,bytes,size);
printf("\nThe value is %c\n",bytes[0]);
//print(bytes);
free( (void *) bytes );
printf ("The listprocess_syscall() returned %ld\n", output);
return 0;
}
所以我要做的是在缓冲区中用'x
'覆盖未发生的第一个字节的默认值'a
'。 copy_from_user
和copy_to_user
返回的值为1
。关于我能做什么的任何建议?