gpt4 book ai didi

copy_from_user 和分割

转载 作者:太空狗 更新时间:2023-10-29 11:12:51 27 4
gpt4 key购买 nike

我正在阅读“The Linux Kernel Module Programming Guide”中的一段,我对下一段有一些疑问。

The reason for copy_from_user or get_user is that Linux memory (on Intel architecture, it may be different under some other processors) is segmented. This means that a pointer, by itself, does not reference a unique location in memory, only a location in a memory segment, and you need to know which memory segment it is to be able to use it. There is one memory segment for the kernel, and one for each of the processes.

但据我了解,Linux 使用分页而不是分段,并且 0xc0000000 及以上的虚拟地址具有内核映射。

  1. 我们是否使用 copy_from_user 来适应旧内核?
  2. 当前的 Linux 内核是否以任何方式使用分段?如果是,如何?
  3. 如果 (1) 不成立,使用 copy_from_user 是否还有其他优势?

最佳答案

是的。我也不喜欢这种解释。从技术意义上讲,细节基本上是正确的(另请参见 Why does Linux on x86 use different segments for user processes and the kernel? )但是正如您所说,linux 通常会映射内存以便内核代码可以直接访问它,所以我认为这不是为什么 copy_from_user等实际存在

IMO,使用 copy_from_user/copy_to_user(和 friend )的主要原因很简单,就是有很多事情需要检查(要防范的危险),将所有这些检查放在一个地方是有意义的。您不希望每个需要将数据复制进出用户空间的地方都必须重新实现所有这些检查。尤其是当细节可能因一种架构而异时。

例如,当您需要复制到该内存或从该内存复制时,用户空间页面可能实际上不存在,因此从可以容纳页面错误的上下文进行调用很重要(因此休眠)。

此外,用户空间数据指针需要仔细检查以确保它们实际指向用户空间和数据区域,并且副本长度不会超出有效区域的末尾,等等。

最后,有可能用户空间实际上与内核共享相同的页面映射。曾经有一个 32 位 x86 的 linux 补丁,它使完整的 4G 虚拟地址空间可供用户空间进程使用。在那种情况下,内核代码无法假设用户空间指针可以直接访问,并且这些函数可能需要一次映射一个单独的用户空间页面才能访问它们。 (参见 4GB/4GB Kernel VM Split)

关于copy_from_user 和分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36222246/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com