无法从系统调用向用户空间中分配的(char *缓冲区)写入数据

时间:2016-03-12 03:01:56

标签: c linux linux-kernel embedded-linux system-calls

我目前正在尝试通过传递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_usercopy_to_user返回的值为1。关于我能做什么的任何建议?

0 个答案:

没有答案