内核缺页原理简介

页管理与缺页

  1. 零页是操作系统镜像中一块不可写的静态内存区域,其虚拟地址是页对齐的。所有进程都使用这个页,因为进程在没有写数据时,读出的数据是不定的,指向同一个页,节约了物理内存

概念

缺页是操作系统为进程的虚拟内存动态的提供物理内存的一种方式。

  1. 当CPU访问虚拟地址时,通过页表映射物理内存的过程中,如果发现页表匹配当前的操作,但没有实际的物理内存,就可以动态的为进程调配一页物理内存;
  2. 当内核在运作过程中,如果物理内存紧张,则动态的选择一些分配给进程的物理内存,将其写入磁盘或文件,然后修改关联的页表,以促使这些换出的页能以第一种方式再次被换入。

缺页组成

缺页由缺页中断进行处理,当进程操作异常的虚拟地址时,触发缺页中断,开始处理这次缺页,CPU将引起缺页的虚拟地址存入寄存器cr2,然后保存上下文并调用do_page_fault()进行C代码级别缺页处理流程。

缺页分类

  1. 匿名缺页
  2. 文件映射缺
  3. 写时缺页
  4. 交换缺页
  5. 内核非连续内存映射缺页
  6. 指令预提取缺页

缺页流程介绍

主流程

  1. 入口函数
    __do_page_fault(struct pt_regs *regs, unsigned long error_code, unsigned long address)

    1. 上下文信息,包含缺页中断发生时CPU的寄存器状态
    2. 错误码,用以标识缺页的类别
    3. 缺页的虚拟地址
  2. 缺页类别标识

入口函数的错误码是下表的宏的或运算的组合,表示缺页的类别信息:

code comments
PF_PROT 1. 未设置,缺页
2. 设置,页保护异常
PF_WRITE 1. 未设置,读页异常
2. 设置,写页异常
PF_USER 1. 未设置,内核空间页异常
2. 设置,用户空间页异常
PF_RSVD 设置,使用了页表项保留的标志位
PF_INSTR 设置,指令预提取页异常
PF_PK
  1. 流程
                           |We fault-in kernel-space
                           |   virtual memory ?
                           v                                         use of reserved bit detecte ?
              +------------+------------+    NO                   +-------------------------+  YES   +--------------+
              | fault_in_kernel_space() |----------->>>>>>------->| error_code & PF_RSVD    |------->| pgtable_bad()|
              +------------+------------+                         +------------+------------+        +--------------+
                           | YES                                               | NO
                           |                                                   |
              +------<-----+----->------+                                      |
              |                         |                                      v
              |                         |                              +-------+-------+
              v                         v                              | find_vma()    | find a vma entry associated
   +----------+------+           +------+-----------+                  +-------+-------+     with this virtual memory
   | vmalloc_fault() |           | spurious_fault() |                          |
   +-----------------+           +------------------+                          v
      We fault on                   We fault by                        +-------+-------+
       vmalloc area                    a stale TLB entry               | expand_stack()| this virtual memory
                                                                       +-------+-------+    is a user's stack space ?
                                                                               |
                                                                               v
                                                                     +---------+---------+
                                                                     | fixed page table  | maybe need to allocate page
                                                                     +---------+---------+    for non-existent page table
                                                                               |
                                                                               v
                                               +----------------------+--------+-------------+----------------------+
                                               |                      |                      |                      |
                                               |                      |                      |                      |
                                               v                      v                      v                      v
                                       +-------+-------+     +--------+--------+   +---------+----------+   +-------+--------+
                                       | do_wp_page()  |     | do_fault()      |   |do_anonymous_page() |   | do_swap_page() |
                                       +---------------+     +--------+--------+   +--------------------+   +----------------+
                                                                      |
        
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值