我有一个如下所示的小型 C 应用程序。它执行以下操作:
分配两页堆内存。
清除
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);
}