图片无法显示,请右键点击新窗口打开图片

BiscuitOS 内存管理之分页大专题订阅入口

图片无法显示,请右键点击新窗口打开图片

在 Linux 中,KSM(Kernel SamePage Merging),翻译为 内核同页合并,是一个用于优化内存使用的机制。KSM 允许 Linux 内核自动检测并合并相同内容的内存页,以减少虚拟机(VM) 或进程之间的重复内存占用. 对于匿名内存,KSM 机制同样可以将两个相同内容的匿名页合并成一个匿名页,然后将匿名页标记为写保护,那么接下来可以对 KSM 匿名页进行读操作. 一旦某个进程开始对 KSM 匿名页进行写操作,MMU 检查到权限异常并触发缺页异常。在缺页异常处理函数里,存在以下两种缺页场景:

  • KSM 匿名页有多个 VMA 映射缺页场景: 当 CPU 访问匿名内存时,MMU 检查到访问权限异常并触发缺页异常,在缺页异常处理函数里,可以识别写保护的匿名页被多个 VMA(或多个进程) 映射,那么将 KSM 匿名页内容拷贝到一个新的物理页上,并将进程对应的页表映射到新的物理页上,且标记页表为可读可写,那么进程后续访问匿名内存不会缺页.
  • KSM 匿名页只有一个 VMA 映射缺页场景: 当 CPU 访问匿名内存时,MMU 检查到访问权限异常并触发缺页异常,在缺页异常处理函数里,可以识别写保护的匿名页只有一个 VMA(或者一个进程) 映射,当缺页异常处理函数不会关注这个条件,而是关注其属于 KSM 页,那么将 KSM 页内容拷贝到新的物理页上,并将进程对应的页表映射到新的物理页上,且标记页表为可读可写,那么进程后续访问匿名内存不会缺页.

图片无法显示,请右键点击新窗口打开图片

BiscuitOS 内存管理之分页大专题订阅入口

图片无法显示,请右键点击新窗口打开图片