释放物理内存页面并强制页面错误

我想编写一个内核函数/模块,它将复制特定进程中的特定页面,然后释放该特定页面。 然后,模块/函数将执行任何必要的操作,以在下一次引用页面时强制该过程成为页面错误。

然后页面错误将使用保留在一边的副本服务。 我可以使用vm_operations_struct或通过修改内核中的handle_mm_fault函数来拦截页面错误。

我不知道该怎么办是释放页面,并强制该过程成为页面错误。

这是计划的testing,将详细解释我想要做什么:

  • 开始一个testing过程,挂起它并把它的pid传递给内核模块/函数。
  • 内核函数将使用pid来获取指向该进程的mm结构体的指针。
  • 然后,内核函数从进程中select一个页面(比如一个堆页),将其复制到另一个页面,然后将该vm_area_structvm_ops指针分配给我自己的vm_operations_struct
  • 内核函数然后释放页面并从cpu刷新它。
  • 内核函数然后发送一个SIGCONT到进程。
  • 一旦该过程恢复,将会遇到页面错误。 页面错误将被使用vm_ops指针拦截,这将调用我的函数来服务页面错误。 我的error handling程序将使用重复页面来处理页面错误。

我的问题是关于粗体的步骤。

我需要弄清楚如何做到这一点。 任何想法?

谢谢。

看了这一段时间后,似乎try_to_unmap是我正在寻找的功能。