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

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/

【讨论】:

以上是关于内核模块,在从一个进程调用时,从另一个进程写入页面的主要内容,如果未能解决你的问题,请参考以下文章

Linux设备驱动程序,内核线程无法打开文件?

如何从另一个模块调用导出的内核模块函数?

Windows内核之进程基本含义以及进程的创建

将变量从linux内核传递给进程

怎样截获linux内核导出的函数

为啥 UILable 在从另一个页面传递值之前不会显示?