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

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

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

在 Linux 里,一旦建立了虚拟内存到匿名页的页表映射,那么进程就可以访问这块匿名内存。由于系统长时间的运行,系统可用物理内存在不断变少,为此系统会进行内存回收(Memory Reclaim), 其中对于匿名内存,在开启 SWAP 的前提下,系统会将长时间没有访问的匿名内存的交换到 SWAP Space 上,这里的交换指的是将匿名内存的数据交换到 SWAP Space 上,然后释放匿名页以便缓解系统可用物理内存不足的问题。当进程再次访问匿名内存时,MMU 检查到对应的物理内存不存在,那么触发缺页异常。在缺页异常处理函数里,其检查到虽然匿名内存对应的匿名页不存在,也就是页表的 _PAGE_PRESENT 清零,但页表的值不空,那么缺页异常中断可取确认匿名内存发生了 SWAP OUT,那么接下来缺页异常处理函数从页表中获得 SWAP Entry 的信息,然后 SWAP IN 匿名内存的内容到一个新的物理页上,并更新页表到新的物理页上,那么这个物理页就变成了匿名页,接下来进程可以正常访问匿名内存.

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

当一个匿名页被交换到 SWAP Space 之后,其对应的页表会记录匿名页在 SWAP Space 信息,缺页异常处理函数将 PTE Entry 非空,且 _PAGE_PRESENT 标志位清零,这类匿名内存归结为发生 SWAP OUT 操作. 此时页表的 [59: 63] 字段记录了 SWAP Type,这里不对 SWAP 机制进行过多介绍,开发者只要了解 SWAP-PTE Entry 的布局即可,缺页异常处理函数可以从 SWAP Type 字段获得 SWAP 机制提供的信息,以便判断匿名页能否正确 SWAP In. 接下来是 [9: 58] 字段记录了匿名页被交换到 SWAP 区域索引的反码, 缺页异常处理函数可以从该字段知道匿名页在 SWAP Space 的具体位置. 其余字段这里不做过多介绍.

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

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

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