do_mmap_pgoff用于其他进程

时间:2011-11-11 13:21:20

标签: linux memory linux-kernel

在linux内核系统调用中,我想以与从用户模式调用mmap类似的方式映射内存区域。如果我想映射当前流程的区域,我可以简单地使用do_mmap_pgoff。相反,我想在内核模式下运行时在不同的进程中映射该区域。 do_mmap_pgoff假设/知道它是当前进程的映射,并且不允许其他任何内容。

我打算做的是复制do_mmap_pgoff以获取额外的参数,指定我要映射的任何进程的task_struct和mm_struct。但是,这是非常不受欢迎的,因为我必须手动遍历内核源代码中的许多函数,并且基本上复制这些函数,以便它们不再假设它们代表current正在工作。

在内核模式下运行时,是否有更好的方法在current以外的进程中映射内存?

1 个答案:

答案 0 :(得分:1)

毫不奇怪,内核源代码中的这些函数假设它们改变了当前进程的映射,并且在Linux存在的20年中它没有发生变化。流程没有改变其他进程的内存映射的原因。

非常“非UNIXy”。

如果你详细说明你想要完成什么,那么也许人们可以建议更多的UNIX-y方式。

无论如何,要专注于手头的问题,如果你不想对mm / *代码进行大量修改,那么我建议你实施一个解决方法:

  1. 找到一个上下文,您可以在其中使内核代码在目标进程的上下文中运行。例如,以模块化方式 - /sys/proc文件。或者,以非模块化的方式:修改频繁调用的系统调用或其他代码路径 - 例如信号处理代码。
  2. 实现一个“RPC”,源进程可以在一个请求中对映射的更改进行排队。然后,它可以休眠直到目标进程进入该上下文并获取请求,唤醒源进程完成修改自己的映射。这实际上是对do_mmap_pgoff()的“远程”调用的模拟,可以使用linux / wait.h中公开的机制来实现。