缺页异常
会出现缺页异常的情况:
- 线性地址不在虚拟地址空间中
- 线性地址在虚拟地址空间中,但没有访问权限
- 接上一条,没有与物理地址建立映射关系
fork等系统调用时并没有映射物理页,写数据->缺页异常->写时拷贝
- 映射关系建立了,但在交换分区中
- 页面访问权限不足
task_struct: linux描述进程的结构体
1.5个互斥状态,两个终止状态,同时定义了新的睡眠状态可以响应致命信号
- pid和tgid
- 每个进程在内核上都存有进程堆栈,相邻的有一个县城描述符 8k
使用thread_union来存放 thread_info 和 stack
- 进程标记 (如还未被执行,被信号杀死,开始关闭等)
- 表示进程的亲属关系 通过链表建立兄弟父子关系
- 优先级 以及 相应的调度策略
- mm 进程地址空间
- 信号处理
简述异常处理过程
- 判断是否在原子操作时出现异常 是 return0
- 判断是否是内核线程(mm_struct ==NULL)如果是进入内核异常处理,通过遍历异常链表试图修正,如果无法通过调试则打印后退出。
- 查找后面最近的虚拟地址空间(VMA),如果没有则地址错误,发送信号杀掉进程。
- 如果有,判断后面找到的VMA是否为栈(栈可以增长),如果是进入异常错误处理,不是发送信号后杀掉进程。
- 判断是否是权限错误
- 进行异常处理
先确定线性地址对应的目录项是否存在,如果不存在为引发缺页的进程分配一个物理页框
被访问的页框在主存中,(写时拷贝)将存在的只读页复制到新页框中。fork()后给子进程分配零页,只可以读。进行写操作时
被访问的页框不在主存中,分配页框,分为线性映射,非线性映射,swap映射。malloc后第一次访问该页。
释放信号量,返回0,异常处理完毕。
缺页中断
在请求分页的过程中,如果访问的页面不再内存中,会产生一次缺页中断,在外存中找到所缺的一页将其调入内存。
步骤:
- 保护cpu现场
- 分析中断原因
- 转入缺页中断处理函数
- 恢复cpu现场,继续执行
LRU算法 最近最久未使用
中断时一条指令处理完成后响应中断,异步。(通常不可预知)
异常是一条指令执行时就可以相应,同步。(通常可以预知)