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

标签 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;
}

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

最佳答案

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

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

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

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

关于c - 从用户空间到内核空间的指针为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35936982/

相关文章:

将指针复制到指针在 C 中不起作用

linux - Octave strcat 忽略添加的空格

linux - 在 Redhat Linux 上检查硬盘问题的最佳策略

android - c undefined reference to function - 编译android/linux内核

linux - 内核中的 malloc

linux-kernel - 调试Linux内核预解压阶段

c - 带有图形的程序被中止,即使调用了 XInitThreads

c++ - OpenCL 编译器异常情况

普通变量可以保存另一个变量的地址吗?

mysql - 在 Ubuntu 中从 MySQL Workbench 启动 MySQL Server 时权限被拒绝