缺页异常(WHO I AM?)

总结一下Page Fault:
缺页异常(WHO I AM?)
缺页异常(WHO I AM?)

虚拟内存分布

以32位的Linux系统为例,每个进程独立拥有4GB的虚拟地址空间,如图:
缺页异常(WHO I AM?)

虚拟空间和物理空空间如何完成映射?
每个进程都有一个页表,每个页面对应一个页表项,随进程而动态变化。自己画的话样子大概是这么个样子:
缺页异常(WHO I AM?)
页式存储的缺点是因为页表的存在访问会变慢(需要段号和offest映射)以及单页表对来纳许内存空间要求很高,所以中间通常会加一层缓存(快表TLB)或者多级页表的方式访问。
缺页异常(WHO I AM?)

不可能每个进程都占用4GB空间的,实际上只有程序运行时用到了才去内存中寻找虚拟地址对应的页帧,找不到才可能进行分配,这就是内存的惰性(延时)分配机制。
当进程需要访问某一页时, 操作系统通过查看页表核对此项是否在物理内存中,若不在物理内存中,就触发了缺页异常( Page Fault)。此时,由于CPU没有数据就无法进行计算,CPU罢工了用户进程也就出现了缺页中断,进程会从用户态切换到内核态,操作系统将进程放入阻塞队列中,并将缺页中断交给内核的 Page Fault Handler 处理,待处理过后在将进程放进就绪队列。

缺页的原因

  • 访问数据被swap换出
  • 使用malloc新申请内存
    malloc机制是延时分配内存,当使用malloc申请内存时并未真实分配物理内存,等到真正开始使用malloc申请的物理内存时发现没有才会启动申请,期间就会出现Page Fault。
  • 非法操作访问越界
    这种情况产生的影响也是最大的,也是Coredump的重要来源,比如空指针解引用或者权限问题等都会出现缺页错误。

缺页异常的处理

Page Fault Handler对不同情况缺页的处理:
以下内容引用自:https://www.zhihu.com/org/dong-li-jie-dian-55

  • Hard Page Fault 也被称为Major Page Fault,翻译为硬缺页错误/主要缺页错误,这时物理内存中没有对应的页帧,需要CPU打开磁盘设备读取Swap分区的对应内容写到物理内存中,再让MMU建立虚拟内存和物理内存的映射。
  • Soft Page Fault 也被称为Minor Page Fault,翻译为软缺页错误/次要缺页错误,这时物理内存中是存在对应页帧的,只不过可能是其他进程调入的,发出缺页异常的进程不知道而已,此时MMU只需要建立映射即可,无需从磁盘读取写入内存,一般出现在多进程共享内存区域。
  • Invalid Page Fault 翻译为无效缺页错误,比如进程访问的内存地址越界访问,又比如对空指针解引用内核就会报segment fault错误中断进程直接挂掉。