缺页中断处理机制

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</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

以梦为马无处可栖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值