C 从用户处复制并分段

C 从用户处复制并分段,c,linux,linux-kernel,C,Linux,Linux Kernel,我正在读“”中的一段,我对下面的一段有一些疑问 从_user复制_或获取_user的原因是Linux内存(在 英特尔体系结构,在某些其他处理器下可能有所不同) 它是分段的。这意味着指针本身不引用 内存中唯一的位置,仅为内存段中的一个位置,以及 您需要知道它是哪个内存段才能使用它。 内核有一个内存段,每个内存段各有一个 过程 然而,据我所知,Linux使用分页而不是分段,并且0xc0000000及其以上的虚拟地址具有内核映射 我们是否使用copy_from_user来容纳旧内核 当前的linux内

我正在读“”中的一段,我对下面的一段有一些疑问

从_user复制_或获取_user的原因是Linux内存(在 英特尔体系结构,在某些其他处理器下可能有所不同) 它是分段的。这意味着指针本身不引用 内存中唯一的位置,仅为内存段中的一个位置,以及 您需要知道它是哪个内存段才能使用它。 内核有一个内存段,每个内存段各有一个 过程

然而,据我所知,Linux使用分页而不是分段,并且0xc0000000及其以上的虚拟地址具有内核映射

  • 我们是否使用copy_from_user来容纳旧内核
  • 当前的linux内核是否以任何方式使用分段?如果是,怎么做
  • 如果(1)不正确,那么使用“从用户处复制”是否还有其他好处

  • 嗯。我也不喜欢那种解释。从技术意义上讲,细节基本上是正确的(另请参阅),但正如您所说,linux通常会映射内存,以便内核代码可以直接访问它,因此我认为这并不能很好地解释为什么实际上存在
    copy\u from\u user
    ,等等

    在我看来,使用
    copy\u from\u user
    /
    copy\u to\u user
    (和朋友)的主要原因很简单,就是有很多东西需要检查(需要防范的危险),把所有这些检查放在一个地方是有意义的。您不希望每个需要从用户空间复制数据的地方都必须重新实现所有这些检查。特别是当细节可能因架构而异时

    例如,当您需要向内存中复制或从内存中复制时,用户空间页面可能实际上不存在,因此,从能够容纳页面错误的上下文中进行调用(并因此进入睡眠状态)非常重要

    此外,还需要仔细检查用户空间数据指针,以确保它们实际上指向用户空间,并且指向数据区域,并且拷贝长度不会超出有效区域的末尾,以此类推

    最后,用户空间实际上可能与内核不共享相同的页面映射。过去有一个32位x86的linux修补程序,可以为用户空间进程提供完整的4G虚拟地址空间。在这种情况下,内核代码不能假设用户空间指针可以直接访问,这些函数可能需要一次映射一个单独的用户空间页面才能访问它们。(见附件)