1

以下に示す小さなCアプリケーションがあります。次の操作を実行します。

  1. 2ページのヒープメモリを割り当てます。

  2. PG_referencedヒープページ()の参照ビット()をクリアしますecho 1 > /proc/pid/clear_refs

  3. ヒープに割り当てられたページに再度書き込みを行います。

  4. 書き込み操作後、参照ビットがページに設定されていることを確認してください。(cat /proc/pid/smaps設定されていることがわかりました。

  5. 手順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);
    }
4

2 に答える 2

1

/proc/pid/smaps の "Referenced" は、現在参照またはアクセス済みとしてマークされているメモリの量を示します。これには、ページ フラグの PG_referenced と、MMU によってページ テーブル エントリに設定された ACCESSED_BIT が含まれます。/proc/pid/smaps のコード:

static void smaps_pte_entry(
    ......
        /* Accumulate the size in pages that have been accessed. */
        if (pte_young(ptent) || PageReferenced(page))
            mss->referenced += ptent_size; 

pte_young()X86 の PTE の ACCESSED_BIT をテストします。このビットは、コードがヒープに書き込むときに MMU によって設定されます。

于 2012-07-18T13:53:30.170 に答える
0

Dhyan さん、書き込み済みの (アクセスされていない、読み取りと書き込みの両方を含む) ページを見つける方法を知りたい場合はsoft dirty bit .

なので、 の代わりにを1書きます。4clear_prefs

Linux の公式ドキュメントを確認してください: https://www.kernel.org/doc/Documentation/vm/soft-dirty.txt

*あなたが尋ねていたのは、実は 2 年前のことです。

于 2014-11-12T10:16:22.260 に答える