do_cow_fault

本文探讨了文件映射的VMA属性与SO中的rw数据段和bss段的关系,包括私有文件映射如脏牛漏洞案例,以及不修改源文件的应用场景。核心流程涉及do_cow_fault、alloc_page_vma和finish_fault,实测通过写只读代码段、rwbss和直接写文件来揭示它们的内在联系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对应场景

1) so 映射的 rw的数据段,bss段
2)私有文件映射,如脏牛漏洞例子
3) 一些不希望修改源文件的场景,可能某些调试和trace场景需要,如/proc/pid/mem

流程

do_cow_fault

  1. alloc_page_vma 分配cow_page
  2. __do_fault 从原文件将页面读出来,内容存放在文件的page cache上面,即address_space的页面上面
  3. 将page cache页面拷贝到 cow_page上面
  4. finish_fault 建立cow_page和虚拟物理页面的页表映射,后续读写发生在cow_page 上面
    在这里插入图片描述

疑问

直接写文件映射的vma属性和 so的rw段的映射属性关系?
实测实验:

  1. 写只读代码段
  2. 写rw bss
  3. 直接写文件

参考学习资料

https://www.anquanke.com/post/id/257350

asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code, unsigned long address) { unsigned long vec; struct task_struct *tsk; struct mm_struct *mm; struct vm_area_struct * vma; vm_fault_t fault; unsigned int flags = FAULT_FLAG_DEFAULT; tsk = current; mm = tsk->mm; vec = lookup_exception_vector(); if (unlikely(fault_in_kernel_space(address))) { if (vmalloc_fault(address) >= 0) return; if (kprobe_page_fault(regs, vec)) return; bad_area_nosemaphore(regs, error_code, address); return; } if (unlikely(kprobe_page_fault(regs, vec))) return; if ((regs->sr & SR_IMASK) != SR_IMASK) local_irq_enable(); perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); if (unlikely(faulthandler_disabled() || !mm)) { bad_area_nosemaphore(regs, error_code, address); return; } retry: vma = lock_mm_and_find_vma(mm, address, regs); if (unlikely(!vma)) { bad_area_nosemaphore(regs, error_code, address); return; } if (unlikely(access_error(error_code, vma))) { bad_area_access_error(regs, error_code, address); return; } set_thread_fault_code(error_code); if (user_mode(regs)) flags |= FAULT_FLAG_USER; if (error_code & FAULT_CODE_WRITE) flags |= FAULT_FLAG_WRITE; fault = handle_mm_fault(vma, address, flags, regs); if (unlikely(fault & (VM_FAULT_RETRY | VM_FAULT_ERROR))) if (mm_fault_error(regs, error_code, address, fault)) return; if (fault & VM_FAULT_COMPLETED) return; if (fault & VM_FAULT_RETRY) { flags |= FAULT_FLAG_TRIED; goto retry; } mmap_read_unlock(mm); }解释上面代码, 并说明哪些是处理用户空间缺页的方法
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值