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

C 从用户空间到内核空间的指针为空,c,linux,linux-kernel,C,Linux,Linux Kernel,很抱歉,如果这个问题以前被问过,因为它看起来有点基本,但我在这个网站的任何地方都找不到。 我正在用linux(debian)进行操作系统编程,我试图给出一个从用户空间到内核空间函数的指针 也就是说,在我所做的用户空间中 ... long res; int x = -1; int *p1 = &x; // also tried doing a malloc, didn't change anything res = kernel_function(

很抱歉,如果这个问题以前被问过,因为它看起来有点基本,但我在这个网站的任何地方都找不到。 我正在用linux(debian)进行操作系统编程,我试图给出一个从用户空间到内核空间函数的指针

也就是说,在我所做的用户空间中

    ...
    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)。因此函数确实被调用了,但是指针丢失了,知道为什么会发生这种情况吗?

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

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

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


似乎已经有了一些答案,就像这样:

printk,除了缺少日志级别之外,还非常好。关于使用copy_from_user的说明也很好,也很有价值,尽管有点不完整-直接解除隔离不仅可能是一个安全性和可靠性问题,而且可能直接不适用于具有单独地址空间的体系结构。然而,OP搞砸了另一件事。他们很可能在包装器中调用了错误的系统调用。或者错误地指定了系统调用。这两个问题都可以通过查看实际代码来解决。