【问题标题】:Pointers given from user space to kernel space are null从用户空间到内核空间的指针为空
【发布时间】:2016-06-26 12:10:16
【问题描述】:

很抱歉,如果以前有人问过这个问题,因为它看起来很基本,但我在这个网站上的任何地方都找不到。 我正在使用 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)。所以函数确实被调用了,但是指针丢失了,知道为什么会这样吗?

【问题讨论】:

    标签: c linux linux-kernel


    【解决方案1】:

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

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

    您需要使用 copy_from_user 来获取数据到内核空间。

    SO 上似乎已经有一些答案,例如:how is the correct way to use copy_from_user?

    【讨论】:

    • printk,除了缺少日志级别,非常好。关于使用 copy_from_user 的说明也很好,很有价值,虽然有些不完整 - 不仅直接取消引用可能是一个安全性和可靠性问题,它可能直接不适用于具有单独地址空间的体系结构。然而,OP搞砸了别的东西。他们可能在包装器中调用了错误的系统调用。或错误地指定了系统调用。这两件事都可以通过查看实际代码来解决。
    猜你喜欢
    • 2016-05-16
    • 2011-10-22
    • 1970-01-01
    • 2019-08-11
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2012-06-21
    相关资源
    最近更新 更多