Linux 内存管理中的缺页中断机制

为了解决内存碎片化问题,充分利用物理内存资源,Linux 提供了虚拟内存功能,并建立虚拟地址和物理地址直接的映射关系。进程无法直接访问物理地址,而是通过虚拟地址间接访问。一般虚拟地址都要比物理地址范围大,虚拟地址和物理地址并非总是一一对应关系,有时候虚拟地址尚未映射的物理地址,而只是一个空壳。当访问到尚未映射的虚拟地址时,就会触发缺页中断机制。

通过保存内存页表,可以实现从虚拟地址到物理地址的转换。虚拟内存以页为单位进行划分和管理,地址转换也是以页为单位。

页面大小取决于 CPU 架构,x86_64 页面大小为 4KB。

参照下图,如果进程访问 0~300 的虚拟地址,则 CPU 通过页表将其转换成对应的物理地址进行访问,无需经过内核处理。

如果访问 300~500 的虚拟地址,则 CPU 会发生缺页中断,中止正在执行的命令,并启动内核中的缺页中断处理机制。

一般每次访问新的虚拟内存,都是先触发缺页中断,然后分配物理地址,并更新对应的页表。

image-20230112154344062