内核模块,在从一个进程调用时,从另一个进程写入页面
Posted
技术标签:
【中文标题】内核模块,在从一个进程调用时,从另一个进程写入页面【英文标题】:kernel module, while being called from one process, writes to a page from another process 【发布时间】:2013-01-16 20:43:44 【问题描述】:我正在编写一个内核模块,该模块将由进程 p1 调用以覆盖属于目标进程 p2 的数据页。
首先,在内核模块内部,并在响应 p1 发出的对 proc 文件系统的写入事件时。我使用目标进程(p2)的进程id来搜索后者的任务结构(p2_task)。
要搜索我使用get_user_pages()
的特定页面,显然是调用它 (p2_task->mm
)。然后我在前一个函数返回的页面上调用了kmap()
。获得指针后,我使用典型的内存函数 (memset()
) 写入该内存。最后叫kunmap()
。
但是,一旦进程再次开始运行,我可以看到我所做的对目标进程 p2 没有任何影响。
我不确定我做错了什么。有人可以帮忙吗?
我怀疑在响应来自 p2 的请求时,您无法以某种方式写入属于进程 p2 的内存。因为这里我们处于不同的环境中。
这是真的吗,如果不是,我还能检查什么。如果是这个问题,有什么办法可以解决吗?
【问题讨论】:
我的理解是kmap()
返回一个物理页面的虚拟地址(在低内存中)。也就是说,如果物理页面已经有一个内核空间虚拟地址kmap()
会返回它。否则,它将相同的物理页面重新映射到内核空间虚拟地址,然后返回这个新的虚拟地址。因此,不需要新的物理页面。另请注意,新的虚拟地址是在内核空间中创建的,而不是在 p2 中。
一切都在内核空间内完成。
抱歉,我以为你想让 p1 覆盖 p2。我现在看到,您只提到 p1 表示它是从不同的用户上下文中调用的。请参阅makelinux.net/ldd3/chp-15-sect-3,它正在执行您上面概述的操作。我看到的唯一区别是抓取/释放 mmap_sem 并调用 SetPageDirty()。
如何在kunmap
之后释放通过get_user_pages
分配的页面?
我面临同样的问题。你能找到解决这个问题的方法吗?
【参考方案1】:
对我来说,这听起来像是一个 TLB 问题,其中 p2 具有缓存在硬件中的数据的虚拟地址。在 p1 更改值之前,p2 之前是否已在其地址空间中读/写过页面?
更改值后尝试在 p1 中调用它:
flush_tlb_page(struct vm_area_struct * vma, unsigned long address)
【讨论】:
【参考方案2】:也许您尝试写入的页面是只读的? 在 Intel 架构上可以设置写保护,见http://badishi.com/kernel-writing-to-read-only-memory/
【讨论】:
以上是关于内核模块,在从一个进程调用时,从另一个进程写入页面的主要内容,如果未能解决你的问题,请参考以下文章