【发布时间】:2011-09-09 06:32:09
【问题描述】:
除了手动遍历页面目录条目之外,还有什么合适的方法可以通过逻辑地址获取物理地址?我在内核的源代码中寻找了这个功能,发现有一个follow_page 函数可以很好地支持内置的大页面和透明大页面。但它没有导出到内核模块(为什么???)...
所以,我不想发明轮子,我认为手动重新实现 follow_page 功能并不是很好。
【问题讨论】:
-
为什么不用mmap()和ioremap()读写物理内存呢?如果这不是你想要的,你能详细说明你的目的吗?
-
我已经连接了
page_fault处理程序,并尝试在用户页面的分配上进行操作。所以,当异常发生时,我需要确切地知道物理页面地址和大小...... -
最简单的答案是没有简单的答案。这是因为用户虚拟地址映射的物理地址的存在/持久性不是给定的;它可以被调出或重新定位,例如随时复制。为了使其“可检查”,必须以某种方式锁定映射,如前所述,例如通过
ioremap()或类似方式,使其永久化。即使您通过 pagedir walk 计算出一个时间点值,您如何确保其他一些内核活动不会立即更改它? -
好吧,介绍一下...想象一下,您可以挂钩
page_fault处理程序,并且您的代码的一部分在do_page_fault之前运行,而另一部分在它之后运行。因此,如您所知,在do_page_fault之前无法获得#PF,因为中断被禁用。至于刚刚分配的页面在我们仍在异常处理程序中时被调出的可能性,我认为这是非常非常理论的情况,正如您提到的锁定很重要。那么,有了这个假设,有没有一种简单的方法可以将虚拟地址转换为物理地址?
标签: linux memory-management linux-kernel