【发布时间】:2015-02-03 18:48:24
【问题描述】:
我想使用 struct vm_area_struct * 的 pagefault 处理程序将物理页面映射到用户空间。
我是这样进行的:
- 我在模块初始化期间使用
alloc_page(GFP_USER)全局分配了一个页面(我尝试了各种GFP)。 - 我创建了一个
struct vm_area_struct,设置了一个自定义页面错误处理程序,并将vma附加到current->mm。
当页面错误发生时:
- 我将
vmf->page设置为我之前分配的页面并返回0。
结果是vma 中的每个虚拟页面在页面错误后都应该映射到同一个物理页面。
但这是我注意到的:
- 当我从内核模块写入页面时,它会反映在我的用户空间程序中。
- 当我从用户空间写入页面时,我在内核模块中看不到它。
- 当我在内核模块中使用
get_user_pages来获取页面(而不是使用我的全局变量)时,我得到的物理地址与全局页面变量不同。我使用page_to_phys(page)打印地址。写入此页面会反映在我的用户空间程序中。
顺便说一句,所有这些都是在页面错误处理程序中完成的。
如何解释这种奇怪的行为?
为了从内核空间访问页面,我使用了kmap_atomic 和kunmap_atomic。
【问题讨论】:
标签: c linux-kernel virtual-memory