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

Sku*_*kum 2 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);
    ...
Run Code Online (Sandbox Code Playgroud)

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

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

我也做了通常的其他步骤,比如将函数的原型添加到syscalls.h,将文件名添加到syscall_32.tbl等.但是当我运行我的用户空间函数时,唯一被打印到内核日志的是(NULL).所以该函数被调用,但指针丢失,任何想法为什么会发生这种情况?

Zan*_*ynx 7

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

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

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

似乎已经有一些答案就像这样:使用copy_from_user的正确方法是什么?

  • printk,除了缺少日志级别,完全没问题.关于使用copy_from_user的注意事项也很好并且值得,虽然有点不完整 - 不仅直接derefence可能是安全性和可靠性问题,它可能直接不适用于具有单独地址空间的体系结构.然而,OP搞砸了别的东西.有可能他们要么在包装器中调用syscall错误.或错误地指定了系统调用.通过查看完成工作的真实代码,可以解决这两个问题. (3认同)