内核模块在从一个进程调用时,从另一个进程写入页面

时间:2013-02-01 14:00:22

标签: memory-management linux-kernel kernel-module virtual-memory

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

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

要搜索我使用get_user_pages()的特定页面,显然会在(p2_task->mm)上调用它。然后我在前一个函数返回的页面上调用了kmap()。一旦我得到指针,我就使用典型的存储器函数(memset())来写入该存储器。最后叫kunmap()

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

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

我怀疑在回复来自p2的请求时,不能以某种方式写入内存属于进程p2。因为我们在不同的背景下。

这是真的,如果不是我还能检查的其他内容。如果是问题,反正我可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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