缺页中断和缺页异常

缺页异常

 

会出现缺页异常的情况:

  1. 线性地址不在虚拟地址空间中
  2. 线性地址在虚拟地址空间中,但没有访问权限
  3. 接上一条,没有与物理地址建立映射关系

fork等系统调用时并没有映射物理页,写数据->缺页异常->写时拷贝

  1. 映射关系建立了,但在交换分区中
  2. 页面访问权限不足

 

task_struct: linux描述进程的结构体

1.5个互斥状态,两个终止状态,同时定义了新的睡眠状态可以响应致命信号

  1. pidtgid
  2. 每个进程在内核上都存有进程堆栈,相邻的有一个县城描述符 8k

使用thread_union来存放 thread_info stack

  1. 进程标记 (如还未被执行,被信号杀死,开始关闭等)
  2. 表示进程的亲属关系 通过链表建立兄弟父子关系
  3. 优先级 以及 相应的调度策略
  4. mm  进程地址空间
  5. 信号处理

 

简述异常处理过程

  1. 判断是否在原子操作时出现异常   return0
  2. 判断是否是内核线程(mm_struct ==NULL)如果是进入内核异常处理,通过遍历异常链表试图修正,如果无法通过调试则打印后退出。
  3. 查找后面最近的虚拟地址空间(VMA),如果没有则地址错误,发送信号杀掉进程。
  4. 如果有,判断后面找到的VMA是否为栈(栈可以增长),如果是进入异常错误处理,不是发送信号后杀掉进程。
  5. 判断是否是权限错误
  6. 进行异常处理

先确定线性地址对应的目录项是否存在,如果不存在为引发缺页的进程分配一个物理页框

被访问的页框在主存中,(写时拷贝)将存在的只读页复制到新页框中。fork()后给子进程分配零页,只可以读。进行写操作时

被访问的页框不在主存中,分配页框,分为线性映射,非线性映射,swap映射。malloc后第一次访问该页。

释放信号量,返回0,异常处理完毕。

 

 

缺页中断

 

在请求分页的过程中,如果访问的页面不再内存中,会产生一次缺页中断,在外存中找到所缺的一页将其调入内存。

 

步骤:

  1. 保护cpu现场
  2. 分析中断原因
  3. 转入缺页中断处理函数
  4. 恢复cpu现场,继续执行

LRU算法 最近最久未使用

 

中断时一条指令处理完成后响应中断,异步。(通常不可预知)

异常是一条指令执行时就可以相应,同步。(通常可以预知)

原文地址:https://www.cnblogs.com/zhangtiezi/p/8404589.html