• 缺页中断和缺页异常


    缺页异常

     

    会出现缺页异常的情况:

    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算法 最近最久未使用

     

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

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

  • 相关阅读:
    async
    subing用法
    vue中子组件调用父组件的方法
    Python—创建目录
    Python—访问限制
    Python—实例方法,实例数据(类属性,实例属性)
    Python—对象,类
    tail命令
    head命令
    pwd命令
  • 原文地址:https://www.cnblogs.com/zhangtiezi/p/8404589.html
Copyright © 2020-2023  润新知