2011-08-10 5 views
3

私はある期間にわたってページフォールトを追跡することによって、おもちゃのワーキングセット見積もりを作成しようとしています。ページにフォールトが入るたびに、それが触れられたことを記録したい。既に存在するページへのアクセスを追跡しようとすると、このスキームが壊れます。フォールトを引き起こさずにページを読み書きする場合、私はそのアクセスを追跡する方法がありません。すでにページがtlbに入っていても、ページを強制的にフォルトにすることはできますか?

それで、私は、ページアクセスで "軽量"フォールトを発生させたいと考えています。私はある時点でいくつかの方法について聞いたことがありますが、なぜそれが働いているのかわからなかったので、それは私の心の中に固執しませんでした。汚いビットかもしれない?

答えて

2

これを行う通常の方法は、ページをメモリに残しながら、ページの「現在の」ビットをクリアし、カーネルがこれを知るように必要なカーネルデータ構造を定位置に置くことです。

しかし、x86アーキテクチャでは、PTEがリニアアドレス変換で使用されるたびに設定される「アクセス済み」フラグ(PTEのビット5)があります。 。あなたは好きなときにこのビットをクリアするだけで、ハードウェアはページがタッチされたことを記録するように設定します。

これらの方法のいずれかを使用すると、そのページのキャッシュされた変換をTLBから消去する必要があります.X86ではINVLPG命令を使用できます。

3

mprotectPROT_NONEを使用できます(「ページにアクセスできません」)。指定されたページへのアクセスがあれば、障害が発生します。

+0

私は自分のカーネルにパッチを当てようとしていたので、私はこの技術がカーネル内のものに変換されていると確信していますが、ユーザスペースの方法は私が探していたものではありません。受け入れられました。 – Alex

関連する問題