Linux kernel 如何将任意vm\u area\u结构从内核代码锁定到用户空间虚拟内存中? 问题:
我想将vma中的页面锁定到位,这样当通过用户空间中的虚拟地址进行访问时,它们就不会被调出,甚至不会产生页面错误 当前设置 我目前使用Linux kernel 如何将任意vm\u area\u结构从内核代码锁定到用户空间虚拟内存中? 问题:,linux-kernel,Linux Kernel,我想将vma中的页面锁定到位,这样当通过用户空间中的虚拟地址进行访问时,它们就不会被调出,甚至不会产生页面错误 当前设置 我目前使用alloc\u页面(GFP\u HIGHUSER)分配内存,并使用vm\u插入页面(vma,addr,page)将它们插入vma。之后,我用\uu free\u page(page)释放页面。这不会将refcount降为0,因为vm_insert_页面先前增加了它 问题 首先,我不确定通过vm\u insert\u page插入的页面是否被考虑逐出/交换。例如,我没
alloc\u页面(GFP\u HIGHUSER)
分配内存,并使用vm\u插入页面(vma,addr,page)
将它们插入vma。之后,我用\uu free\u page(page)
释放页面。这不会将refcount降为0,因为vm_insert_页面先前增加了它
问题
首先,我不确定通过vm\u insert\u page
插入的页面是否被考虑逐出/交换。例如,我没有找到vm\u insert\u page
调用lru\u cache\u add
(这是将页面标记为可交换的正确/唯一功能吗?)
此外,我还考虑从内核代码中调用vma的domlock()
。但是,vm_insert_页面
将vm_MIXEDMAP
添加到vma->vm_标志
(),这使得vma vm_特别()。不幸的是,这导致vma被mlock\u fixup
()和lru\u cache\u add\u inactive\u或\u unevictable
()拒绝(如果最后一个是相关的)
也许是解决办法
我考虑调用内部函数mlock_vma_页面
来锁定特殊的vma。但是,我不知道这是否解决了问题。是否有一种方法可以测试页面是否可交换,或者强制交换进程的可交换页面
或者,禁用交换(CONFIG_swap
)是否也会导致所需的行为(页面访问不会导致页面交换/逐出故障)