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

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

  • 内核虚拟地址缺页

    • Normal Kernel PageFault

    • Kprobe Kernel PageFault

    • Spurious Kernel PageFault

    • Kernel PageFault OOPS

  • 内核虚拟地址缺页场景

    • 访问空指针引发的 KERN-PF

    • 内核向只读内存写操作导致 KERN-PF

    • 内核在非代码段执行代码导致 KERN-PF

    • KPROBE 处理函数访问异常地址导致 KERN-PF

    • 更新页表 PAGE_RW 导致的虚假缺页异常

    • 更新页表 PAGE_NX 导致的虚假缺页异常

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


内核虚拟地址缺页

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

在 Linux 里,虚拟地址空间一分为二,其中一部分被内核占用形成内核虚拟地址空间,内核将内核地址空间划分成不同的区域,每个区域由不同的分配器进行管理,这些分配器不仅负责虚拟内存的分配,还需要负责页表的映射. 内核会根据不同的需求采用不同区域的虚拟内存,以此保证内核安全可靠的运行。但内核并不是完美的东西,有的时候内核也会发生故障,其中一个故障就是大家熟悉的缺页异常。内核发生缺页异常的几个情况如下:

  • 延迟分配: Linux 内核常常使用延迟分配技术来提高内存使用效率。这里的延迟分配并不是像用户空间的惰性分配,而是类似多核之间 TLB 与页表之间的修改同步就可能会延迟设置,这样降低刷 TLB 带来的开销.
  • 非法访问: 如果内核尝试访问一个未映射的虚拟地址,或者访问的地址超出了其权限(如写入一个只读区域),将会触发缺页
  • 硬件异常: 硬件问题也可能导致缺页异常,例如当内存芯片发生故障时(UE).

内核级别的缺页处理对操作系统的稳定性和性能至关重要。不正确的处理可能会导致系统崩溃或数据丢失。因此操作系统开发者在设计缺页处理机制时需要特别小心。在 Linux 中,这一部分由高度优化的代码来处理,以确保系统在各种情况下都能稳定运行, 当内核虚拟地址发生缺页时,内核的处理流程如下:

  • 捕获异常: CPU 生成缺页异常,缺页异常处理程序接管控制权,并从相应寄存器获得缺页的原因
  • 诊断原因: 内核检查引起缺页的地址,以确定发生缺页的地址属于内核虚拟地址,其次根据缺页原因找到相应的异常处理函数
  • TLB 更新: 如果是因为页表的权限比 TLB 页表权限升级,因为页表已经是最新,那么不会触发更多的故障,让系统继续运行
  • 处理非法访问: 如果缺页是因为非法访问造成的,内核可能会记录错误,终止相关内核线程,或者采取其他错误处理措施
  • 恢复执行: 并不是所有的缺页情况都能恢复,对于能恢复的尽可能恢复,对于不能恢复的直接报错和杀死内核线程

内核的稳定性和安全性是至关重要的,因此某些场景触发的内核缺页采取 “0 容忍”态度直接将其 Killed,而对于有些虚假的故障则直接忽视, 而对于内存硬件级别的错误直接导致系统宕机。那么接下里分不同的情况来了解内核虚拟地址缺页.

Normal Kernel PageFault

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

Normal Kernel PageFault 指定是由物理内存不存在或者访问权限异常引起的内核地址缺页. 内核对于这类缺页的处理是非常严苛的,因为内核不能介绍访问一个物理内存不存在的非法地址,另外处于内核安全稳定性考虑,内核是不运行非法权限访问的,因此只要触发这类缺页基本就是要收到严苛的惩罚,轻者终止内核线程,重者导致系统宕机。那么内核里容易发生这类缺页的场景整理如下:

  • 空指针的访问: NULL 被称为空指针,空指针经常用来初始化指针或者被释放的内存指针,如果内核线程直接访问空指针,缺页异常会认定为物理地址不存在,并发出严重警告之后将内核线程直接 Kill.
  • 非法地址访问: 内核线程不通过内核分配器获得虚拟内存的使用权,而是直接使用,那么这会造成不可以预测的问题,例如非法访问的虚拟内存已经映射了物理内存,那么会造成内容污染; 又如非法访问的虚拟内存没有映射物理内存,那么会触发缺页并发起严重经过之后将内核线程杀死; 又或者非法访问的虚拟内存是特殊的虚拟内存,会触发不可预测的异常.
  • 权限异常: 内核线程不具备访问虚拟内存足够的权限,那么会触发缺页异常,并对发生缺页的地址发起严重的警告并终止内核线程. 例如对只读的内核内存发起写操作,又如对不可执行的虚拟内存执行代码等.

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

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

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

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