我想编写一个内核函数/模块,它将从特定进程复制特定页面,然后释放该特定页面。然后,模块/函数将在下次引用该页面时执行任何必要的操作来强制该进程进入页面错误。
然后将使用保留在一边的副本来提供页面错误。vm_operations_struct
我可以使用或 通过修改handle_mm_fault
内核中的函数来拦截页面错误。
我不知道该怎么做的部分是释放页面并强制进程进入页面错误。
这是计划中的测试,它将详细解释我想要做什么:
- 启动一个测试进程,挂起它并将它的 pid 传递给内核模块/函数。
- 内核函数将使用 pid 获取指向该进程的 mm 结构的指针。
- 然后,内核函数从进程中选择一个页面(比如堆页面),将其复制到另一个页面,然后将
vm_ops
指向该页面的指针分配vm_area_struct
给我自己的vm_operations_struct
. - 然后内核函数释放页面并将其从 cpu 中刷新。
- 然后内核函数向进程发送一个 SIGCONT。
- 一旦进程恢复,它将遇到页面错误。页面错误将使用 vm_ops 指针拦截,这将调用我的函数来处理页面错误。我的故障处理程序将使用重复页面来处理页面故障。
我的问题与粗体中的步骤有关。
我需要弄清楚如何做到这一点。任何想法?
谢谢。