zoukankan      html  css  js  c++  java
  • OS+计组之异常和中断一站式理解

    OS+计组之异常和中断一站式理解

    定义

    (来源于《计算机组成与设计——硬件/软件接口》第五版)

    1. 遵循MIPS的习惯,异常指的是控制流中任何意外的改变,不论其原因来自内部还是外部。也就是说,异常应该包含内外部两种。

      其实许多体系结构作者不区分异常和中断,统统都叫中断,比如x86。考研王道书上把异常称作内中断,可能是因为体系结构不同吧,不要太纠结了。

    2. 外部异常/异步异常:就是我们通常所谓的“中断”,是来自处理器外部的异常,比如I/O中断/外设请求,时钟中断,DMA中断。故中断又叫外中断。

      • 异步中断通常是可屏蔽中断,包括所有的Interupt ReQuest(IRQ中断)
      • 异步中断也有不可屏蔽的,如:电源掉电,物理存储器奇偶校验。
    3. 内部异常/同步异常:又叫内中断,包含陷阱(trap)、故障(fault)、终止(abort)。一般源自CPU执行指令内部的事件,比如系统调用(syscall),非法操作码,地址越界,算术溢出,虚存缺页。

      • 内部异常是不可屏蔽的,这些问题都要及时处理。

        CPU内部有一个中断允许触发器,当该触发器置 “1” 时允许中断,置“0”时屏蔽中断。

    补充:内核态和用户态

    内核态,或者说CPU的特权模式,是CPU的一种工作状态,它影响CPU对不同指令的执行结果。操作系统通过跟CPU配合,设置特权模式和用户模式,来防止应用程序进行越权的操作

    防止应用程序越权访问内存时使用了虚拟地址空间映射的技术,这是操作系统软件配合硬件的MMU共同实现的。在用户模式下,应用程序访问的内存地址是虚拟内存地址,会映射到操作系统指定的物理地址上。这个虚拟内存地址空间就是你说的用户空间。

    应用程序无法自由进入内核态,只能通过操作系统提供的接口调用进入,或者在硬件中断到来时被动进入。

    应用程序通过操作系统功能来使用硬件。

    作者:灵剑
    链接:https://www.zhihu.com/question/306127044/answer/555327651
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    image-20200925162519248

    CPU对于(外)中断的处理

    中断向量法

    I/O设备触发中断,中断向量表在内存中,是操作系统提前设置好的,指向了操作系统自己的代码;同时,这个中断也会立即强迫CPU进入内核态,中断返回之后才会会到用户态,下图中全程CPU都处于内核态。

    1. 中断隐指令(硬件自动完成):关中断-保存断点(当前PC内容)-中断服务程序寻址(硬件自动产生中断向量地址(中断类型号)传送到CPU,再从该地址内容得知中断服务程序入口,入口放入PC)

      中断向量是中断服务程序的入口地址,中断向量地址是存放入口地址的地址。套娃警告。

    2. 保存现场:PSW状态寄存器,中断屏蔽寄存器,CPU某些特殊寄存器。

    3. 开中断

    4. 执行中断服务程序(先保存通用寄存器,执行完之后弹出栈,恢复通用寄存器,像x86程序设计中函数的首尾操作)

    5. 关中断

    6. 恢复现场

    7. 开中断

    8. 返回

    IMG_0438

    内部异常(内中断)

    陷阱

    • 陷阱(Trap,又叫访管指令,顾名思义用于访问管态——我还是习惯说陷入内核态)
      • 程序内部有意设置的,最常见的用途就是操作系统的系统调用
      • 系统调用是操作系统为了保护内核,给用户提供了一套接口。与OS资源有关的操作,你自己不能瞎搞,要通过syscall向OS提出服务请求,由OS代为完成。
      • 实际上系统调用时也要通过硬件的中断机制进入内核(Q:所以说syscall总会引发中断?)陷阱和中断通常共享相同的中断向量。

    故障

    • CPU在运算过程中检测到除以0的溢出异常时,异常向量地址被强制放到PC中,流水线后面的指令被清空。

    终止

    • 这类是不可恢复的错误,硬件错误,也不会返回到这条指令继续执行。

    OS之I/O设备中断方式

    (待续)

    中断方式

    DMA方式

  • 相关阅读:
    自定义jdbc框架
    sql 批处理、获取自增长、事务、大文本处理
    数据库设计
    数据约束
    mysql操作之二
    mysql基本操作
    38. 外观数列
    合并两个有序链表
    有效的括号
    实现strStr
  • 原文地址:https://www.cnblogs.com/vanellopeblog/p/interupt.html
Copyright © 2011-2022 走看看