1

我在页面级别实现了增量进程检查点(我只是将数据从进程地址空间转储到文件中)。

我使用的方法如下。我使用了两个系统调用:

  1. 完成检查点:复制整个地址空间。此外,如果为页面设置了写位,请将其清除。

  2. 增量检查点:仅在设置写入位并再次清除时转储数据。所以基本上,我检查是否为增量检查点设置了写入位。如果是,则转储页面数据。

测试程序:

char a[10000];
sys_cp_range(a,a+10000);
a[3]='A'; 
sys_incr_cp_range(a,a+10000);

据我所知,内核应该通过使用 SIGSEGV 终止进程来进行页面错误并处理非法写入情况。然而,该程序已成功检查点。这里到底发生了什么?

4

1 回答 1

2

如果您在 PTE 仍缓存在 TLB 中时对其进行修改,则修改的效果可能会暂时看不到(直到 PTE 从 TLB 中被逐出并且必须从页表中重新读取)。

您需要invlpg在 PTE 修改后使用(我假设是 x86)指令使 TLB 中的 PTE 无效。它必须在所有 CPU 上完成。内核中必须有一个专门用于此目的的函数。

此外,仔细检查编译器是否没有重新排序或丢弃上述代码中的任何内容也没有什么坏处。

于 2013-03-23T05:57:22.397 回答