1

ページレベルでインクリメンタルプロセスチェックポイントを実装しました(プロセスアドレス空間からファイルにデータをダンプするだけです)。

私が使用したアプローチは次のとおりです。2 つのシステム コールを使用しました。

  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 を変更すると、変更の効果はしばらくの間 (PTE が TLB から削除され、ページ テーブルから再度読み取る必要があるまで) 表示されない場合があります。

invlpgPTE の変更後に (x86 を想定しています) 命令を使用して、TLB の PTE を無効にする必要があります。また、すべての CPU で実行する必要があります。カーネルには、この目的のための専用関数が必要です。

また、コンパイラが上記のコードから何かを並べ替えたり破棄したりしていないことを再確認しても問題ありません。

于 2013-03-23T05:57:22.397 に答える