7

我正在编写一个由进程 p1 调用的内核模块,以覆盖属于目标进程 p2 的数据页。

首先,在内核模块内部,同时响应 p1 发出的对 proc 文件系统的写入事件。我使用目标进程(p2)的进程id来搜索后者的任务结构(p2_task)。

搜索我使用的特定页面get_user_pages(),显然在 ( p2_task->mm) 上调用它。然后我调用kmap()了前一个函数返回的页面。获得指针后,我使用典型的内存函数 ( memset()) 写入该内存。终于叫了kunmap()

但是,一旦进程再次开始运行,我可以看到我所做的对目标进程 p2 没有影响。

我不确定我做错了什么。任何人都可以帮忙吗?

我怀疑在响应来自 p2 的请求时,您无法以某种方式写入属于进程 p2 的内存。因为这里我们处于不同的环境中。

这是真的吗,如果不是我还能检查什么。如果是问题所在,无论如何我可以解决这个问题吗?

4

2 回答 2

0

也许您要写入的页面是只读的?在英特尔架构上,您可以设置写保护,请参阅http://badishi.com/kernel-writing-to-read-only-memory/

于 2013-08-04T21:33:44.047 回答
0

对我来说听起来像是一个 TLB 问题,其中 p2 具有缓存在硬件中的数据的虚拟地址。在 p1 更改值之前,p2 是否曾在其地址空间中读取/写入页面?

更改值后尝试在 p1 中调用它: flush_tlb_page(struct vm_area_struct * vma, unsigned long address)

于 2014-06-27T22:11:27.787 回答