如何使用copy_to_user

时间:2013-11-17 14:03:35

标签: linux-kernel system-calls

我正在尝试将自定义系统调用添加到linux内核中。这是一个简单的代码:

#include <linux/mysyscall.h>
#include <linux/kernel.h>
#include <asm/uaccess.h>
#include <asm/system.h>

asmlinkage int sys_mysyscall(int *data){

    int a = 3;

    cli();
    copy_to_user(data, &a, 1);
    sti();

    printk(KERN_EMERG "Called with %d\n", a);

    return a;
}

我可以编译添加了mysyscall的内核,当我尝试使用以下用户程序访问它时:

#include <linux/mysyscall.h>

int main(void){

    int *data;
    int r;
    int a = 0;
    data = &a;

    r = mysyscall(data);

    printf("r is %d and data is %d", r, *data);
}

*数据不等于3,等于0。

我应该如何使用copy_to_user来修复它?

1 个答案:

答案 0 :(得分:3)

复制到用户代码行只复制'a'中的一个字节。如果是小端系统,它将为0.复制所有4个字节以获得正确的结果。