其他
一般用户空间关联的物理页面是按需通过缺页异常的方式分配和调页,当系统物理内存不足时页面回收算法会回收一些最近很少使用的页面,但是有时候我们需要锁住一些物理页面防止其被回收(如时间有严格要求的应用),Linux中提供了mlock相关的系统调用供用户空间使用来锁住部分或全部的地址空间关联的物理页面。本文的分析基于arm64处理器架构,内核版本为Linux-5.10.27,我们会结合重点内核源代码来解析mlock是如何做到锁住进程地址空间关联的物理内存的,又是如何防止相关的物理页面被交换出去的。一、主动缺页mlock的主要代码处理流程如下,这里我们主要关注主动缺页部分:mlock处理路径中,会将VM_LOCKED标志加入到vma->vm_flags中(由于设置的地址区域有可能跨越多个vma,所以代码中会涉及到分裂和合并的操作,实质上都会设置相关的vma->vm_flags的VM_LOCKED标志),然后会调用__mm_populate来填充虚拟页对应的物理页,最终在faultin_page函数中试图查找vma中的每个虚拟页对应的物理页面(对应于follow_page_mask函数),如果没有找到会调用handle_mm_fault主动触发缺页处理。