zoukankan      html  css  js  c++  java
  • ()中断和异常的再总结

    中断和异常的再总结

    原文链接:https://blog.csdn.net/u011240016/article/details/53117093
    @(OS)

    内部异常(内中断)

    故障(fault)
    自陷(trap)
    终止(abort)
    是源自CPU执行指令内部的事件。如:非法操作码,地址越界,算术溢出,虚存系统的缺页,陷入指令等引起的事件。内部异常不可被屏蔽,一旦出现立马处理。

    外中断:来自CPU执行指令以外的事件。如:I/O中断,时钟中断等。

      在操作系统层次上,我们多听到“异常”(Exception)而少见“中断”(Interrupt),且往往笼统地称其为异常,但处理器微体系结构规范通常会区分中断和异常。

      一般而言,中断是异步的,异常是同步的,所谓同步和异步的概念,又与我们网络通信或函数调用中的同步异步有所不同。中断是来自处理器外部的I/O设备的信号的结果,它不是由指令流中某条指令执行引起的,从这个意义上讲,它是异步的,是来自指令流之外的。

      异常又分为三类:陷阱(Trap)、故障(Fault)和终止(Abort),它们都是执行当前指令流中的某条指令的结果,是来自指令流内部的,从这个意义上讲它们都是同步的。

      (1)陷阱是有意而为之的异常,是明知有套还往里钻——人家要的就是这个结果,其最常见的用途就是操作系统的系统调用

      (2)故障是由错误条件引起的,可能被故障处理例程修复。如果可以修复,则啥事儿没有,继续干活;如果不能修复则会转化为终止,并进入下一步。常见的故障如缺页。

      (3)终止是不可恢复的致命的错误造成结果。终止处理程序不再将控制返回给引发终止的应用程序,而是交给了系统——其结果往往是系统终止应用程序。

      另外还有一个比较模糊的问题,就是中断或异常返回点的问题

      良性的如中断和陷阱,只是在正常的工作流之外执行额外的操作,然后继续干没干完的活。因此处理程序完了后返回到原指令流的下一条指令,继续执行。恶性的如故障和终止,对于可修复故障,由于是在上一条指令执行过程中发生(是由正在执行的指令引发的)的,在修复故障之后,会重新执行该指令;至于不可修复故障或终止,则不会再返回。

      再说一下Intel处理器的中断及异常号和unix/ Linux 编程中常见的“段故障”(Segmentation Fault)。

      在Pentium体系结构中,系统可以有高达256种不同的异常类型。0-31号对应体系结构定义的异常,对任何系统都一样。范围32-255的号码对应的是操作系统定义的中断和陷阱。13号异常是一般保护性故障(General Protect Fault),许多原因都会引起该故障。通常是因为一个程序应用了一个未定义的虚拟存储器区域,或者因为程序试图写一个只读的文本段。unix/ Linux 不会尝试恢复这类故障,典型地,Unix shell将这种故障报告为“段故障”(Segmentation Fault)。在IA32系统上,系统调用是通过一条称为INT n的陷阱指令来提供的,其中n可能是异常表中256个异常号的任何一个。但历史上,系统调用是通过128(0x80)号提供的。

      根据这个概念,特别强调的是缺页中断实际上是内中断,也就是异常,来自指令流的。
      存储异常也是来自指令流的,因此也是异常,不是中断。

      出题点常常喜欢用缺页中断,存储异常这些概念来设置陷阱。

    举个例子:

    (2015.24)假定下列指令已装入指令寄存器。则执行时不可能导致CPU从用户态变成内核态(系统态)的是:C

    A. DIV R0, R1 ; (R0)/(R1)->R0
    B. INT n ; 产生软中断
    C. NOT R0 ; 寄存器R0的内容取非
    D. MOV R0, addr ; 把地址addr处的内存数据放入寄存器R0中

    这里A可以发生除0异常,进行abort例程。B特别注意,很容易看成C语言代码,心想int n怎么还有异常呢?老实说我被这个困扰了很久。实际上这是故意挖的坑,INT指的是interrupt!虽然后面中文注明了是软中断,但是先入为主的印象会超过当前的理性认知。C只是对内容取非,不可能出现异常。D,addr地址可能越界,因此也有可能出现异常。

    (2016.22) 异常是指令执行过程中在处理器内部发生的特殊事件,中断是来自处理器外部的请求事件。下列关于中断或异常情况的叙述中,错误的是:A
    A. “访存时缺页”属于中断
    B. “整数除以0”属于异常
    C. “DMA传送结束”属于中断
    D. “存储保护错”属于异常

    分析:这种概念的识记题如果没有真的理解,就很麻烦。这里,需要特别强调的是CPU指令流相关一定是内中断,也即所谓的异常。而非CPU指令流导致的才是外中断,比如时钟中断,DMA中断等才是真正的外中断。访存时缺页,我们听过太多的缺页中断,缺页异常,后来根本分不清谁是谁了,只需要抓住:缺页是CPU访存指令时才有的。是CPU相关。于是A项错误。
    整数除0,当然是CPU干的。存储保护错,也是内存访问相关,属于异常,也叫内中断。
    ————————————————
    版权声明:本文为CSDN博主「DrCrypto」的原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u011240016/article/details/53117093

  • 相关阅读:
    Java注解学习
    微信小程序开发的一些基础知识点
    feign请求传送实体类参数的一些摸索
    springcloud bus中踩过的坑
    API网关初接触
    ELKF学习(Elasticsearch+logstash+kibana+filebeat)
    getWriter() has already been called for this response异常的一些问题
    kafka的学习
    如何优化一个丑陋的switch语句!
    项目启动之后进行一些初始化的方法
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/13270591.html
Copyright © 2011-2022 走看看