【发布时间】:2015-03-24 21:13:57
【问题描述】:
我正在尝试使用自定义内核和内核模块来估计进程的 WSS(工作集大小)。
我首先定位到进程的task_struct,从mm_struct遍历所有的vm区域。我能够通过遍历页表访问所有 PTE,并检查页面是否存在并估计 RSS(驻留集大小)。
我现在要做的是更改 VM 区域的 PTE,以便它会导致页面错误,并且我的自定义内核将在我所需的地址范围内记录页面错误。从页面错误,我可以估计 WSS。但是当我尝试更改_PAGE_PRESENT 或_PAGE_PROTNONE 时,我收到swap_dup: Bad swap file entry 错误并且进程崩溃。为什么更改标志时实际的页面错误机制不起作用?我究竟做错了什么?
这是我的代码 sn-p
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);
}
walk_page_table 返回给定虚拟地址的 pte。请给点建议。
我得到的错误是
swap_dup: Bad swap file entry
BUG: Bad page map in process
【问题讨论】:
标签: linux linux-kernel kernel kernel-module