Linux 如何使属于特定进程的特定内存页无效

Linux 如何使属于特定进程的特定内存页无效,linux,memory,memory-management,linux-kernel,Linux,Memory,Memory Management,Linux Kernel,我想向Linux内核添加一个函数,在给定进程id和虚拟内存地址的情况下,该函数使属于该进程并包含该内存地址的页面失效 基本上,如果进程试图访问该页面,我想强制它进入页面错误 我不想使用缓存抖动或诸如此类的东西。我希望我的功能在浪费过程时间方面非常临床。例如,我不想冲洗整个tlb或类似的东西 对不起,伙计们没有包括我已经尝试过的东西。但是我试了很多。任何关于如何做到这一点的想法都是非常受欢迎和赞赏的 更新: 我看到有这些功能: flush_cache_all() flush_cache_mm(mm

我想向Linux内核添加一个函数,在给定进程id和虚拟内存地址的情况下,该函数使属于该进程并包含该内存地址的页面失效

基本上,如果进程试图访问该页面,我想强制它进入页面错误

我不想使用缓存抖动或诸如此类的东西。我希望我的功能在浪费过程时间方面非常临床。例如,我不想冲洗整个tlb或类似的东西

对不起,伙计们没有包括我已经尝试过的东西。但是我试了很多。任何关于如何做到这一点的想法都是非常受欢迎和赞赏的

更新:

我看到有这些功能:

flush_cache_all()
flush_cache_mm(mm)
flush_cache_dup_mm(mm)
flush_cache_range(vma, start, end)
flush_cache_page(vma, vmaddr, pfn)
flush_dcache_page(page)
flush_icache_range(start, end)
flush_icache_page(vma,pg)

但我不确定x86-64体系结构可以使用哪些。我看不出它们实现了这种特定的体系结构。

您必须执行与
mprotect
syscall相同的操作(请参见
mm/mprotect.c
),只是对于不同于
current
的进程,您必须执行与
mprotect
系统调用相同的操作(请参见
mm/mprotect.c
),仅针对与当前不同的流程,您的问题过于集中,可能无法获得有用的答案。如果你解释了你的最终目标可能会有帮助,因此如果有其他实现目标的方法,有人可以指出。你的问题太过集中,你可能得不到有用的答案。如果你解释了你的最终目标,这可能会很有帮助,所以如果有其他实现目标的方法,有人可以指出。谢谢你的指点。但是你能说得更具体些吗?我需要深入研究的是什么。我已经看过了,在某一点上看到调用函数
\uuuummu\u notifier\u invalidate\u range\u start()
,这就是你的意思吗?通过阅读有关此函数的内容,我看到它的目的是向来宾计算机(VM)通知主机中发生的事件…因此它可能不是我想要的。我没有发现任何其他有趣的东西。
mprotect
syscall已经做了您想要做的事情,您只需将
current
替换为所需进程的
task\u struct
。噢……在我写这篇文章时,我开始意识到您的意思。所以,您的意思是在特定页面上调用mprotect,但使用已经存在的页面保护标志?我还看到它调用了
flush\u cache\u range()
flush\u tlb\u range()
…这些函数在x86-64 arch中受支持吗?顺便说一句,是的,我需要任务结构不是
当前的
。。。但这很容易修改。
mprotect
是一个系统调用,适用于所有体系结构(使用MMU)。感谢您提供的指针。但是你能说得更具体些吗?我需要深入研究的是什么。我已经看过了,在某一点上看到调用函数
\uuuummu\u notifier\u invalidate\u range\u start()
,这就是你的意思吗?通过阅读有关此函数的内容,我看到它的目的是向来宾计算机(VM)通知主机中发生的事件…因此它可能不是我想要的。我没有发现任何其他有趣的东西。
mprotect
syscall已经做了您想要做的事情,您只需将
current
替换为所需进程的
task\u struct
。噢……在我写这篇文章时,我开始意识到您的意思。所以,您的意思是在特定页面上调用mprotect,但使用已经存在的页面保护标志?我还看到它调用了
flush\u cache\u range()
flush\u tlb\u range()
…这些函数在x86-64 arch中受支持吗?顺便说一句,是的,我需要任务结构不是
当前的
。。。但这很容易修改。
mprotect
是一个系统调用,适用于所有体系结构(使用MMU)。