如何更改页表条目以在 linux 中引发页面错误?

Posted

技术标签:

【中文标题】如何更改页表条目以在 linux 中引发页面错误?【英文标题】:How to change page table entry to induce page fault in linux? 【发布时间】: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

【问题讨论】:

【参考方案1】:

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

【讨论】:

哦。那么我从哪里可以获得指向物理页面的正常页表条目? 它们已经是正常的,但是当您为当前页面设置 NOT PRESENT 标志时,它们会损坏它们。我不确定您要完成什么,WSS 是什么? 事实上,将标志更改为 NOT PRESENT 不会产生任何影响,而只会更改标志。所以你的页面实际上仍然存在。 WSS 是工作集大小。它是进程在特定时间段(例如 10 秒)内使用的页数。为了计算这一点,我正在创建页面错误并检查页面错误处理程序是否在此期间进程正在访问它们。 无论如何,通过这种方式设置 NOT PRESENT 标志会破坏 PTE,不会导致页面错误。

以上是关于如何更改页表条目以在 linux 中引发页面错误?的主要内容,如果未能解决你的问题,请参考以下文章

多级页表——分层分页

多级页表如何节省内存空间?

更改脚本以在特定工作表上运行会引发TypeError

了解内存分配

编辑 httpd.conf 文件以在 linux 中自定义 404 错误

是啥让一个指向页表条目的指针数组比拥有一个页表条目数组更好?