在linux中,如何更改页表条目以导致页错误?

在linux中,如何更改页表条目以导致页错误?,linux,linux-kernel,kernel,kernel-module,Linux,Linux Kernel,Kernel,Kernel Module,我试图使用自定义内核和内核模块来估计进程的WSS(工作集大小) 我首先找到流程的task_结构,并从mm_结构遍历所有vm区域。我能够通过遍历页面表访问所有PTE,检查页面是否存在,并估计RSS(常驻集大小) 我现在要做的是更改VM区域的PTE,这样它将导致页面错误,并且我的自定义内核将在我所需的地址范围内记录页面错误。根据页面错误,我可以估计WSS。但是当我试图更改\u PAGE\u PRESENT或\u PAGE\u protone时,我得到了交换dup:Bad swap file entr

我试图使用自定义内核和内核模块来估计进程的WSS(工作集大小)

我首先找到流程的task_结构,并从
mm_结构
遍历所有vm区域。我能够通过遍历页面表访问所有PTE,检查页面是否存在,并估计RSS(常驻集大小)

我现在要做的是更改VM区域的PTE,这样它将导致页面错误,并且我的自定义内核将在我所需的地址范围内记录页面错误。根据页面错误,我可以估计WSS。但是当我试图更改
\u PAGE\u PRESENT
\u PAGE\u protone
时,我得到了
交换dup:Bad swap file entry
错误和进程崩溃。当标志更改时,为什么实际的页面错误机制不起作用?我做错了什么

这是我的代码片段

    for (addr = vmstart->vm_start; addr < vmstart->vm_end; addr += PAGE_SIZE) {

            //Get PTE by walking page table
            pte_t *pte = walk_page_table(task->mm,addr),tmp_pte;

             //Only count present addresses:
            if(pte && (pte_val(*pte) & _PAGE_PRESENT)) {

                    tmp_pte = *pte;
                    set_pte(pte , pte_clear_flags(tmp_pte, _PAGE_PRESENT) ); 

                    printk(KERN_INFO "Flag changed at %lx , Name %s\n", addr,name);
                }
            }
            //unmap accessed page
            if(pte) pte_unmap(pte);
 }

交换页PTE和内存页PTE具有完全不同的结构。交换条目显示页面在第二个存储器中的位置,而普通PTE描述物理页面地址+标志。
因此,实际上,页面错误机制正在工作,但是页面错误处理程序应该在哪里搜索交换的(无页面显示标志)页面?

Ohh。然后从哪里可以获得指向物理页面的正常页面表条目?它们已经是正常的,但当您为当前页面设置NOT PRESENT标志时,就会损坏它们。我不确定你想实现什么,什么是WSS?事实上,将一个标志更改为“不存在”没有任何意义,只会更改标志。因此,您的页面实际上仍然存在。WSS是工作集大小。它是进程在特定时间段(例如10秒)内使用的页数。为了计算这一点,我创建了页面错误,并在页面错误处理程序中检查进程是否在此期间访问它们。无论如何,通过以这种方式设置NOT PRESENT标志,您将损坏PTE,而不是导致页面错误。
 swap_dup: Bad swap file entry
 BUG: Bad page map in process