【问题标题】:Linux Kernel: copy_from_user - struct with pointersLinux 内核:copy_from_user - 带有指针的结构
【发布时间】:2009-11-08 23:49:26
【问题描述】:

我已经实现了某种字符设备,我需要有关 copy_from_user 功能的帮助。

我有一个结构:

struct  my_struct{

int a;

int *b;
};

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

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

【问题讨论】:

    标签: linux device-driver kernel


    【解决方案1】:

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

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

    1. 它们确保指针指向用户空间而不是内核空间。如果没有这项检查,用户空间程序可能能够读取或写入内核内存,从而绕过正常的安全性。
    2. 它们正确处理页面错误。通常,内核模式下的页面错误会导致 OOPS 或恐慌——copy_*_user 系列函数有一个特殊的覆盖,它告诉 PF 处理程序一切正常,应该正常处理错误;如果 IO 无法满足故障(即通常会导致 SIGSEGVSIGBUS 的原因),则返回错误代码,以便调用者可以在使用 -EFAULT 返回用户空间之前进行任何必要的清理.

    【讨论】:

      【解决方案2】:

      你的猜测是正确的。如果您需要访问值*b,则需要使用copy_from_user(以及copy_to_user 在用户进程中更新它)。

      【讨论】:

      • 我还要指出,我想不出有任何系统调用或 ioctl 采用带有指针的结构。即使是那些有字符串的,也会在结构中有一个字符数组。为每个指针成员编写代码来执行此操作非常烦人的事实可能与此有关。 :-)
      猜你喜欢
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      相关资源
      最近更新 更多