从用户空间到内核空间的指针为空

时间:2016-03-11 09:54:18

标签: c linux linux-kernel

很抱歉,如果之前已经问过这个问题,因为它看起来很基本,但我在这个网站的任何地方都找不到它。 我正在使用linux(debian)进行OS编程,我正试图从我的用户空间给我的内核空间函数指针。

即我在用户空间

    ...
    long res;
    int x = -1;
    int *p1 = &x;  // also tried doing a malloc, didn't change anything
    res = kernel_function(p1);
    ...

在内核空间文件kernel_function.c中我做

asmlinkage long kernel_function( int __user *p){
    printk("%p \n", (void*) p);
    return 0;
}

我还做了通常的其他步骤,比如将函数的原型添加到syscalls.h,将文件名添加到syscall_32.tbl等。但是当我运行我的用户空间函数时,唯一被打印到内核日志的是(NULL)。所以函数会被调用,但是指针会丢失,不知道为什么会这样?

1 个答案:

答案 0 :(得分:7)

您没有查看任何其他Linux内核函数?

你不能只传递一个指针。那将是非常不安全的。

您需要使用copy_from_user将数据导入内核空间。

似乎有一些答案就像这样:how is the correct way to use copy_from_user?