linux内核中mmap系统调用之后,物理内存在什么时候通过缺页中断被映射到进程地址空间的全过程,下面我们将详细讲述下:
缺页中断的产生原因
根本原因:CPU访问的虚拟内存地址背后没有物理内存页与之建立映射关系;
具体可以表现为以下三种情况:
1、虚拟地址在进程页表体系中的各级页目录项(PGD, PUD, PMD)或页表项(PTE)是空的(P位为0)。这是最常见的情况,例如mmap刚分配完虚拟内存区域(vma)后首次访问;
2、PTE存在,但其映射的物理内存页被内核交换(swap out)到了磁盘上;
3、物理内存页在内存中,但访问权限不足(例如,尝试写入一个只读页),引发保护错误(Protection Fault)。
代码流程
缺页中断处理入口函数:do_page_fault
此函数是缺页中断的总入口,他首先区分缺页发生在内核空间还是用户空间,区分依据是通过判断地址是否超过TASK_SIZE_MAX来实现。
static noinline void __do_page_fault(struct pt_regs *regs, unsigned long hw_error_code, unsigned long address)
{
if (unlikely(fault_in_kernel_space(address)))
do_kern_addr_fault(regs, hw_error_code, address); // 内核态缺页
else
do_user_addr_fault(regs, hw_error_code, address); // 用户态缺页
}
先看下内核态处理函数do_kern_addr_fault</

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



