以下に示す小さなCアプリケーションがあります。次の操作を実行します。
2ページのヒープメモリを割り当てます。
PG_referenced
ヒープページ()の参照ビット()をクリアしますecho 1 > /proc/pid/clear_refs
。ヒープに割り当てられたページに再度書き込みを行います。
書き込み操作後、参照ビットがページに設定されていることを確認してください。(
cat /proc/pid/smaps
) 設定されていることがわかりました。手順2〜4を繰り返して、正しいことを確認します。
したがって、この演習から、ヒープページに書き込むたびにPG_referenced
ビットが設定され、それを使用/proc/pid/clear_ref
してクリアするたびにクリアされることがわかりました。
そこで、カーネルコードを調べて、どのカーネル関数がPG_referenced
ビットを設定しているかを調べました。mark_page_accessed()
の機能だと思いましたmm/swap.c
。しかし、検索した後、PG_referenced
書き込み前にクリアすると、他の関数が書き込みごとにページのビットを設定していることがわかりました。
だから、誰かをお願いします、どのカーネル関数がこれを行っているかを見つけるのを手伝ってください?
テストに使用したアプリケーションを書き留めています。
ptr_obj = malloc(2*4096);
while(1){
/* clear all page refernces */
sprintf(buffer,"echo 1 > /proc/%d/clear_refs ",pid);
system(buffer);
/* move smaps to a file */
sprintf(buffer,"cat /proc/%d/smaps > temp_before.%d",pid,count);
system(buffer);
/* do a write to malloc addr */
ptr_obj[1] = 12;;
ptr_obj[6000] = 12;;
/* move update smaps to file **/
sprintf(buffer,"cat /proc/%d/smaps > temp_after.%d",pid,count);
system(buffer);
count ++;
sleep(30);
}