我正在编写一个内核模块,由进程p1调用以覆盖属于目标进程p2的数据页。
首先,在内核模块内部并在响应p1发出的proc文件系统的写事件时。我使用目标进程的进程id(p2)来搜索后者的任务结构(p2_task)。
要搜索我使用get_user_pages()
的特定页面,显然会在(p2_task->mm
)上调用它。然后我在前一个函数返回的页面上调用了kmap()
。一旦我得到指针,我就使用典型的存储器函数(memset()
)来写入该存储器。最后叫kunmap()
。
但是,一旦进程再次开始运行,我就可以看到我所做的对目标进程p2没有影响。
我不确定我做错了什么。有人可以帮忙吗?
我怀疑在回复来自p2的请求时,不能以某种方式写入内存属于进程p2。因为我们在不同的背景下。
这是真的,如果不是我还能检查的其他内容。如果是问题,反正我可以解决这个问题吗?
答案 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)