【发布时间】: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分配的页面? -
我面临同样的问题。你能找到解决这个问题的方法吗?
标签: memory-management linux-kernel kernel-module virtual-memory