Linux kernel 分析之二十二:内存管理-page fault处理流程

page fault是Linux内存管理中比较关键的部分。理解了page fault的处理流程,有助于对Linux内核的内存管理机制的全面理解。因为要考虑到各种异常情况,并且为了使内核健壮高效,所以page fault的处理流程是比较复杂的。我把这个繁琐的处理流程放在最后。在page fault处理函数中使用了很多lazy algorithm。它的核心思想是,由于磁盘IO非常耗时,所以把这些操作尽可能的延迟,从而省略不必要的操作。
以下是几种会导致page fault的情景:1.用户态按需调页:
为了提高效率,Linux实现了按需调页。应用程序在装载时,并不立即把所有内容读到内存里,而仅仅是设置一下mm_struct,直到产生page fault时,才真正地分配物理内存。如果没有分配对应的页表,首先分配页表。这种情况下的缺页可能是匿名页(调用do_no_page),可能是映射到文件中的页(调用do_file_page),也可能是交换分区的页(调用do_swap_page)。此外,还可以判断是不是COW(写时复制)。2.主内核页目录的同步:
内核页表信息保存在主内核页全局目录中,虚存段信息放在vm_struct中。进程页表的内核部分要保持与主内核页全局目录的同步。当内核调用vmalloc等函数,对内核态虚拟地址进行非线性映射时,修改主内核页全局目录,但是不修改进程页表的内核部分。这会引起page fault。page fault 处理函数会执行vmalloc_fault里的代码,对进程的页表进行同步。
3.对exception table中的异常操作的处理
内核函数通过系统调用等方式访问用户态的buffer,可能会在内核态导致page fault。这一类page fault是可以被fixup的,所有这些代码的地址都放在exception tabl

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值