Linux 内核 : copy_from_user - struct with pointers

标签 linux device-driver kernel

我已经实现了某种字符设备,我需要有关 copy_ from_user 函数的帮助。

我有一个结构:

struct  my_struct{

int a;

int *b;
};

我在用户空间对其进行初始化,并使用“写入”函数将指向 my_struct 的指针传递到我的字符设备。在内核的空间字符设备“写入”函数中,我将它从 *char 转换为这种结构。我使用 kmalloc 为结构分配了一些内存,并向其中执行了 copy_from_user 操作。

对于简单的 'int a' 没问题,但它只复制 b 值的指针(地址),而不是 b 指向的值,所以我现在在内核空间中,我正在使用指向 a 的指针用户空间内存。这是不正确的吗?我不应该直接访问用户空间指针,我必须 copy_from_user 我结构中的每个指针,然后使用 copy_to_user函数?

最佳答案

您必须始终使用 copy_from_user 和类似的方法从内核空间访问用户空间内存,无论您如何获得指针。由于 b 是指向用户空间内存的指针,因此您必须使用 copy_from_user 来访问它。

这些函数执行两个重要的附加任务:

  1. 他们确保指针指向用户空间而不是内核空间。如果没有此检查,用户空间程序可能能够读取或写入内核内存,从而绕过正常的安全措施。
  2. 他们正确处理页面错误。通常,内核模式中的页面错误会导致 OOPS 或 panic - copy_*_user 函数族有一个特殊的覆盖,告诉 PF 处理程序一切正常,应该正常处理错误;如果 IO 无法解决故障(即通常会导致 SIGSEGVSIGBUS 的情况),则返回一个错误代码,以便调用者可以执行任何操作在使用 -EFAULT 返回用户空间之前进行必要的清理。

关于Linux 内核 : copy_from_user - struct with pointers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1698396/

相关文章:

linux - 这个脚本可以在 Linux 中运行吗?

c++ - 访问任何进程的内存

c++ - 设置 : C++ in VS Code under Linux (tasks. json 和 launch.json)

c# - 如何在 C#2.0 中从另一个泛型列表中减去一个泛型列表

linux-kernel - 驱动程序是否需要包含 DTS 文件?

linux - 用户地址内存是如何组织的?

php5无法通过apache连接到oracle

C - 构建后打开文本文件 - OpenWRT - opkg

linux - Linux中结构体iov_iter的用途是什么?

linux - 如何为i2c传感器编写I2C设备驱动程序?