【问题标题】:How to use mmap to share user-space and kernel threads如何使用 mmap 共享用户空间和内核线程
【发布时间】:2011-12-18 03:26:12
【问题描述】:

我很难找到一些合适的例子来解决我的问题。我想在用户和内核空间之间共享 4K(4096)字节的数据。我发现很多想法说我必须从内核分配内存并将其映射到用户空间。有人可以提供有关如何在 Linux 2.6.38 中执行此操作的示例。有什么好的文档可以解释吗?

提前致谢。

【问题讨论】:

标签: linux-kernel kernel mmap


【解决方案1】:

您提出的方法是一种方法,但由于用户空间不在您的控制范围内(这意味着任何用户空间程序都有可能进入内核),您正在为来自用户空间的恶意攻击提供机会。此处还描述了这种基于内核的与用户空间共享内存:

http://www.scs.ch/~frey/linux/memorymap.html

相反,如何在用户空间分配内存,然后从内核使用 API copy_from_user() 和 copy_to_user() 复制到/从用户空间内存?如果您想在不同的进程之间共享内存,那么您可以随时使用 IPC 相关的 API 来分配和定义内存,例如 shmget() 等。在这种情况下,内核源代码本身中有很多示例代码。

例如。

fs/checksum.c: 缺失 = __copy_from_user(dst, src, len);

【讨论】:

  • 这个链接对我有用以获得内存映射。我首先尝试从用户空间分配内存并将指针传递给内核空间并通过 copy_from_user 使用它。但问题是,我需要从内核线程访问,并且内核线程不会一直在我的进程上下文下运行,因此 copy_from_user 不会从我想要的内存中复制。
  • 我明白了,所以这意味着你不是在单个用户进程之间共享内存,而是在许多用户进程和内核之间共享内存,对吧?如果是这样,那么是的,最好在内核中分配一次,然后将其映射到用户空间。这意味着您正在创建许多指向同一内核内存区域的页表条目(对于每个进程的用户空间组件,尽管它们都共享相同的内核组件)。性能会非常糟糕,因为每次更新都会通过正常的页面错误机制同步复制到所有进程。
  • 只有一个流程实例。该进程有多个线程。还有多个从系统调用创建的内核线程。这些内核线程和用户级线程共享内存。内核级线程放了一些东西。用户线程将其拾取。和类似的东西。
  • 我明白了,因为一个进程,多个线程,那么通过 malloc() 在进程中分配的任何内存总是可以从任何线程访问。并且由于这些是进行系统调用的用户线程,而这些调用又会转换到内核上下文中,因此您始终可以在内核中使用 copy_to/from_user 来访问用户线程分配的内存。即,这里没有使用内核线程。我不知道为什么你需要内核线程?它通常用于每个硬件的异步交互(例如,每个 CPU、每个磁盘等),即便如此,它的使用也被劝阻和消失:
  • 我明白了,因为一个进程,多个用户线程,那么通过 malloc() 在进程中分配的任何内存总是可以从任何线程访问。并且由于这些是进行系统调用的用户线程,而这些调用又会转换到内核上下文中,因此您始终可以在内核中使用 copy_to/from_user 来访问用户线程分配的内存。即,这里没有使用内核线程。不知道为什么你需要内核线程?通常用于每个硬件的交互(例如,每个 CPU、每个磁盘等),即便如此,它的使用也不鼓励和消失:lwn.net/Articles/403891
猜你喜欢
  • 2016-08-14
  • 2011-12-16
  • 2014-10-01
  • 2012-03-02
  • 2014-07-29
  • 2016-10-12
  • 2016-03-10
  • 2018-03-27
  • 2018-06-08
相关资源
最近更新 更多