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
Linux kernel 分析之二十二:内存管理-page fault处理流程
最新推荐文章于 2024-05-09 11:15:50 发布