Linux kernel 当我在Linux内核中手动修改页面表条目(pte)标志位时,为什么有时会恢复对标志的修改?

Linux kernel 当我在Linux内核中手动修改页面表条目(pte)标志位时,为什么有时会恢复对标志的修改?,linux-kernel,operating-system,kernel,page-tables,page-fault,Linux Kernel,Operating System,Kernel,Page Tables,Page Fault,问题: 在上下文中,我的代码意味着执行一个进程并故意导致额外的页面错误。我首先手动修改其页表条目的pte_标志,方法是关闭它们的当前位,然后打开我自己的特殊位,位于_page_SOFTW2页标志位(arch/x86/include/asm/pgtable_types.h),以标记我与pte发生了冲突 如果以后再次访问该页面,则会导致页面错误。一旦发生这种情况,我立即重置位,以便页面被标记为存在。有时,即使在下一次函数调用中,我的重置似乎也不会持续 你知道为什么我的修改不会持续多久吗 代码示例:

问题:

在上下文中,我的代码意味着执行一个进程并故意导致额外的页面错误。我首先手动修改其页表条目的pte_标志,方法是关闭它们的当前位,然后打开我自己的特殊位,位于_page_SOFTW2页标志位(arch/x86/include/asm/pgtable_types.h),以标记我与pte发生了冲突

如果以后再次访问该页面,则会导致页面错误。一旦发生这种情况,我立即重置位,以便页面被标记为存在。有时,即使在下一次函数调用中,我的重置似乎也不会持续

你知道为什么我的修改不会持续多久吗

代码示例:

下面是在使用mm/pagewalk.c中的walk_page_range()后如何重置位:

set_pte(pte, pte_set_flags(*pte, _PAGE_PRESENT));       
set_pte(pte, pte_clear_flags(*pte,_PAGE_MY_BIT));
下面是一个printk语句示例,演示了这个问题

// In do_page_fault I detect that my _PAGE_MY_BIT is set in the flags and flip it (424 -> 25)
[   44.473337] 1636 mpv/lua script  do_page_fault: Before: address 5555556acd30 pte 3f274c424 flags 424 
[   44.474116] 1636 mpv/lua script  do_page_fault: After: address 5555556acd30 pte 3f274c025 flags 25

// Just a few lines later, do_page_fault calls do_user_addr_fault and I print the same pte_flag
[   44.474950] 1636 mpv/lua script do_user_addr_fault: address 5555556acd30 pte 3f274c424 flags 424 
是否在arch/x86/mm/fault.c中出现错误:

prefetchw(&current->mm->mmap_sem);
trace_page_fault_entries(regs, hw_error_code, address);

if (unlikely(kmmio_fault(regs, address)))
    return;

reset_the_pte(current, address, __func__);   // My function to flip the bits

/* Was the fault on kernel-controlled part of the address space? */
if (unlikely(fault_in_kernel_space(address)))
    do_kern_addr_fault(regs, hw_error_code, address);
else
    do_user_addr_fault(pte, regs, hw_error_code, address);
可能的答案:

1) 根据,可以使用pte_modify而不是pte_set_标志来修改pte。这是一种更好的方法,还是它们都具有相同的功能,而pte_modify的限制性更强

2) 在我的重置功能和do_user_addr_fault之间是否有上下文切换到另一个进程,这可能会以某种方式影响我的pte


3) 如果此pte/页与另一个进程共享内存,这会影响我的重置吗?

还没有机会测试它,但我可能还必须修改struct page->flags(include/linux/page\u flags.h中关于page->flags的更多信息)中的页面标志除了pte标志本身之外。我还没有机会测试它,但是除了pte标志本身之外,我可能还必须修改struct page->flags(include/linux/page_flags.h中关于page->flags的更多信息)中的页面标志。