如何在内核模式下写入某个进程的虚拟内存

时间:2011-10-11 10:47:35

标签: module linux-kernel scheduled-tasks scheduling context-switch

我想使用我的Unix模块来写入另一个进程内存(我想在内核模式下执行它并避免使用pthread接口)。
我必须使用函数(如do_mmap(..),do_unmmap(..),sys_mprotect(..)等)来影响当前的进程内存,而不是我想要影响它的进程。

所以我想,我需要找到一种方法来对我想要的过程进行上下文切换,以便创建我想要的当前流程。我试图通过一个小的改动来复制schedule()的实现: 我换了一行:

next = pick_next_task(rq);

使用:

next = myNext;

我的问题是,时间表需要很多我不能包含的结构和功能,所以我必须重新实现它们。做这样的事似乎很糟糕。你有什么建议吗?

我想避免修改现有的内核,因此我不必强迫用户重新启动和修改他们的操作系统以便使用我的程序(这就是我使用模块的原因)。

顺便说一句,我使用Linux的“2.6.38-11-generic”版本。

1 个答案:

答案 0 :(得分:1)

  1. 使用get_user_pages()函数获取目标进程的页面(更准确地说,是mm_struct)
  2. 通过kmap()kmap_atomic()(取决于具体情况)映射您需要的网页
  3. 写入/读取映射返回的地址(带有页面大小)。
  4. 通过kunmap()kunmap_atomic()
  5. 销毁地图