开发者学堂课程【高校精品课-大连理工大学-计算机组织与结构:E906的异常和中断】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/3/detail/16051
E906的异常和中断
内容介绍
一、玄铁 E906
二、异常向量号
三、锁定
四、非对齐访问异常
五、精确异常和非精确异常
六、中断请求
七、中断咬尾
八、非屏蔽中断
一、玄铁 E906
广义的异常包括指令异常和外部中断,不管是异常还是中断,它的一个特征都是会打断处理器当前指令的执行,转而去跳转到一个服务程序,然后进行某种事件的处理那处理完了以后还会返回到原来的指令流中继续进行,从这个概念上讲可以把异常和中断二者放在一起讨论,把他统一的称作广义的异常。
异常处理(包括指令异常和外部中断)是处理器的一项重要
技术,在异常事件产生时,用来使处理器转入对异常事件的处理,从正常的程序执行转入特定的异常处理程序。
-外部事件:外部设备中断请求
-内部事件:非法指令、非对齐访问错误
-ECALL 和 EBREAK 指令在正常执行时也会产生异常
异常处理利用异常向量表跳转到异常服务程序入口
异常可以在流水线的各个阶段被识别,但在指令边界被处理
异常处理,利用异常向量表跳转到异常服务程序入口,对于每一个异常来说,它的异常号是确定的,因此它的下半表也是确定的,当发生了异常之后,可以根据他这个异常号跳转到向量表上,同向量表的对应表项找到异常处理程序的入口地址,然后就可以跳转过去进行异常处理。
异常可以在流水线的各个阶段被识别,在指定的边界被处理,在执行指令的过程中,不管是取指、译码、执行或者是访存或者写回每一个阶段都可以发现,当前发生了异常,但是整条指令执行完毕以后才会去处理这个异常。
二、异常向量号
左边这部分所有的中断标记都是1,这个表示它的中断类型。右边这个表所有的中断标记都是0,右边这个表实际代表的就是异常类型。
这个表的第二列向量号,第一行0到2,012,这三个向量号,是未实现或者说是保留为将来使用的。三号是机器模式软件中断,4到6是为未现或者是保留的,七号是机器模式的计时器中断,它支持从0到255一共256个中断。前面的16个是 Clint 来负责处理的,后面的240个一般就是外部中断,它是由 Clic 负责处理。右侧就是异常,它有很多种异常,包括取指令访问错误异常、非法指令异常、调试断点异常等。其中也有一些地方是未实现0号还有9号,这都是为实现的留作将来保留。还有一个比较特殊的就是24号把它写作 NII,它是不可屏蔽中断,它的优先级最高,不受处理器里面的中断允许位的控制,只要他发出了中断请求就一定会被响应,它就用来负责通知处理器一些最紧迫,最重要的事件。这个是异常优先级,有这个优先级的排序最高的限量号是38,最低的是5每一个都有确定的异常的类型。
三、锁定
锁定就是当 CPU 响应异常的时候它会先判断一下自身当前是在主程序中执行还是在另外一个异常的服务处理程序里面进行,如果是正在处理异常的时候又发生了一个异常的时候 CPU 就会被锁定,CPU 一旦被锁定就会停止取指执行,然后保持 PC 值为触发 CPU 锁定的指令的 PC,然后通知 SoC 死神已经被锁定,实际上一旦锁定 CPU 什么都干不了
整个的 SoC 其实就是处理器芯片,它包括 E906处理器内核和其他一些片内资源,所以一旦发生锁定 E906就会通知SoC就通知整个处理器,被锁定接什么都做不了。
四、非对齐访问异常
在 RISC - V 标准定义中,当取指或者内存数据读写操作地址不对齐时会上报相应的非对齐访问异常。
E906取指令地址在 CPU 复位后由硬件维护,不会产生非对齐访问异常。
内存数据操作的地址由软件定义,因此当访存的数据位宽和地址不对齐时,按照 RISC - V 标准需产生加载指令或者存储指令非对齐访问异常。
对于一个32位的一个整形数来说,它有四个字节组成,如果这个数据的地址的末两位不是零就不是零零,那么这时候呢就是非对齐。如果是一个半字16位,不是偶数地址,这个就叫做没有对齐,当发生非对齐的时候,它就会产生异常E906取指令地址在 CPU 复位后是由硬件维护的,它不会产生非对齐的访问。
内存数据操作的地址是由软件来定义的,因此它可能会产生非对其的访问异常。
五、精确异常和非精确异常
当处理器发生异常时会把发生异常时的 PC 值保存起来,如果该值指向的是真正引起异常的指令,那么就称之为精确异常,反之就是非精确异常
load /store 指令会产生非精确异常
这个指令要访存,它的执行时间比较长,而且是在流水线当中执行,当 load store 指令发生异常的时候,当前PC 的值可能已经指向后续的好几条指令了,这个时候就发生了非精确异常。
六、中断请求
中断是外部事件请求,处理器在响应中断时需要做如下判断:
中断使能位是否开启
以及中断优先级是否足够
处理器需要保存的现场有哪些
处理器跳转执行的中断服务程序入口在哪里
再从中断服务程序返回时处理器现场如何恢复
处理器当前是否允许中断,总的来说,如果允许中断,中断才有可能被响应。
第二个中断优先级是否足够,当中断发生的时候需要做一个判断,当前中断的优先级是否高于系统的阈值优先级。如果比他高,这个中断才允许被响应。
处理器需要保存的现场有哪些,因为在中断服务程序中会用到很多寄存器,这些寄存器原来保存的那些值就会被冲掉,所以要做一个保护现场的操作把这些寄存器的值先保存起来,将来中断服务程序执行完毕以后再恢复这些寄存器的值。这样在主程序运行,看来好像整个计算机运行的环境都没有改变,他的执行逻辑不会因为发生中断而被改成错误的逻辑。
七、中断咬尾
在中断服务程序结束时,处理器现场弹栈之前,检查是否有等待处理的较低优先级中断,如有,则跳过当前中断服务程序中的处理器现场弹栈操作,在响应完毕新的中断服务程序之后再进行现场弹栈操作,以大幅节省时间。
首先是第一个中断服务程序的压栈,然后执行中断服务程序本身,然后出站,然后在第二个中断服务程序的压栈,然后执行第二个终端服务程序,然后再出栈,这是一个正常的顺序。
但是其中 POP 和 Push 操作寄存器其实是同一组寄存器,要恢复在主程序中的运行环境,紧接着把主程序的运行环境保存在堆栈里,所以一出一进对应的是同一组寄存器,这样就可以把这个操作直接省掉,就变成了第一个中断服务程序的入栈然后执行,紧接着直接执行第二个终端服务程序,然后再出栈,这样的话就省掉了中间的 pop 和 Push操作,这样可以节省时间加快中断服务程序的执行。
八、非屏蔽中断
称作 NMI,它是一个外部事件 E906将其中断向量号定义为24,优先级在所有中断和异常当中最高。
NMI 不受全局使能拉的影响
就是因为整个系统当中最重要的那个事件定义为 NMI,就不可屏蔽中断因为他特别重要,只要他提出请求就应该立即去响应,所以也不受全局中断使能位的影响,它具有最高的优先级。