Linux缺页异常处理--用户空间
作者:网络转载 发布时间:[ 2012/8/16 11:09:30 ] 推荐标签:
/* Kernel addresses are always protection faults: */
tsk->thread.cr2 = address;
tsk->thread.error_code = error_code | (address >= TASK_SIZE);
tsk->thread.trap_no = 14;
force_sig_info_fault(SIGSEGV, si_code, address, tsk);
return;
}
...
...
}
在确定了这次异常是因为物理页没分配而导致后,通过good_area路径来处理,可想而知,该路径在确定了访问权限足够后,将完成页表和物理页的分配,这个任务有handle_mm_fault()函数来完成
int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma,
unsigned long address, unsigned int flags)
{
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
pte_t *pte;
__set_current_state(TASK_RUNNING);
count_vm_event(PGFAULT);
if (unlikely(is_vm_hugetlb_page(vma)))
return hugetlb_fault(mm, vma, address, flags);
pgd = pgd_offset(mm, address);
pud = pud_alloc(mm, pgd, address);//分配pud目录
if (!pud)
return VM_FAULT_OOM;
pmd = pmd_alloc(mm, pud, address);//分配pmd目录
if (!pmd)
return VM_FAULT_OOM;
pte = pte_alloc_map(mm, pmd, address);//分配pte表
if (!pte)
return VM_FAULT_OOM;
/*handle_pte_fault()的任务是为pte绑定新的页框,它会根据pte页表项的情况来做不同的处理*/
return handle_pte_fault(mm, vma, address, pte, pmd, flags);
}
handle_pte_fault()函数的处理比较复杂,因为它要根据pte页表项对应的物理页的不同状态来做各种不同的处理,具体的分析以后再给出。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11