1

我有一个如下所示的小型 C 应用程序。它执行以下操作:

  1. 分配两页堆内存。

  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 的“已引用”表示当前标记为已引用或已访问的内存量。它包括页标志的 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 回答