【问题标题】: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 分配的页面?
  • 我面临同样的问题。你能找到解决这个问题的方法吗?

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


【解决方案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/

    【讨论】:

      猜你喜欢
      • 2013-05-16
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多