MIPS中断/异常处理机制/系统调用

 1、 精确异常的概念在运行流程中没有任何多余效应的异常。即当异常发生时,在受害指令之前的指令被完全执行,而受害指令及后面的指令还没开始执行(注:说受害指令及后面的指令还没做任何事情是不对的,实际上受害指令是处于其指令周期的第三阶段刚完成,即ALU阶段刚完成)。精确异常有有助于保证软件设计上不受硬件实现的影响。

     2、CP0中的EPC寄存器用于指向异常发生时指令跳转前的执行位置,一般是受害指令地址。当异常时,是返回这个地址继续执行。但如果受害指令在分支延迟槽中,则会硬件自动处理使EPC往回指一条指令,即分支指令。在重新执行分支指令时,分支延迟槽中的指令会被再执行一次。

     3、精确异常的实现对流水线的流畅性是有一定的影响的,如果异常太多,系统执行效率就会受到影响。

     4、异常又分常规异常和中断两类常规异常一般为软件的异常,而中断一般为硬件异常,中断可以是芯片内部,也可以是芯片外部触发产生。

        异常发生时,跳转前最后被执行的指令是其MEM阶段刚好被执行完的那条指令。受害指令是其ALU阶段刚好执行完的那条指令。

        异常发生时,会跳到异常向量入口中去执行。MIPS的异常向量有点特殊,它一般只个2个或几个中断向量入口,一个入口给一般的异常使用,一个入口给TLB miss异常使用(这样的话,可以省下计算异常类型的时间。在这种机制帮助下,系统只用13个时钟周期就可以把TLB重填好)。

        CP0寄存器中有个模式位,SR(BEV),只要设置了,就会把异常入口点转移到非缓冲内存地址空间中(kseg1)。

      5、MIPS系统把重启看作一个不可回归的异常来处理。
         冷启动:CPU硬件完全被重新配置,软件重新加载;
         热启动:软件完全重新初始化;

      6、MIPS对异常的处理的哲学是给异常分配一些类型,然后由软件给它们定义一些优先级,然后由同一个入口进入异常分配程序,在分配程序中根据类型及优先级确定该执行哪个对应的函数。这种机制对两个或几个异常同时出现的情况也是适合的。

      7、下面是当异常发生时MIPS CPU所做的事情
              1。设置EPC指向回归的位置;
              2。设置SR(EXL)强迫CPU进入kernel态,并禁止所有中断响应。
              3。设置Cause寄存器,以使软件可以得到异常的类型信息;还有其它一些寄存器在某些异常时

                 会被设置;
              4。CPU开始从异常入口取指令,然后以后的所有事情都交由软件处理了。

          k0和k1寄存器用于保存异常处理函数的地址。
          异常处理函数执行完成后,会回到异常分配函数那去,在异常分配函数里,有一个eret指令,用于回归原来被中断的程序继续执行;eret指令会原子性地把中断响应打开(置SR(EXL)),并把状态级由kernel转到user级,并返回原地址继续执行。

      8、中断
         MIPS CPU有8个独立的中断位(在Cause寄存器中),其中,6个为外部中断,2个为内部中断(可由软件访问)。一般来说,片上的时钟计数/定时器,会连接到一个硬件位上去。

              SR(IE)位控制全局中断响应,为0的话,就禁止所有中断;
              SR(EXL)和SR(ERL)位(任何一个)如果置1的话,会禁止中断;
              SR(IM)有8位,对应8个中断源,要产生中断,还得把这8位中相应的位置1才行;

         中断处理程序也是用通用异常入口。但有些新的CPU有变化。

      9、在软件中实现中断优先级的方案
              1。给各种中断定优先级;
              2。CPU在运行时总是处于某个优先级(即定义一个全局变量);
              3。中断发生时,只有等于高于CPU优先级的中断优先级才能执行;(如果CPU优先级处于最低,

                 那么所有的中断都可以执行);
              4。同时有多个中断发生时,优先执行优先级最高的那个中断程序;

      10、系统调用 syscall
         
系统调用也通过异常入口进入系统内核,选择8号异常代码处理函数进行处理,进入系统调用分配函数后,还要根据传进来的参数再一次分配到具体的功能函数上去。系统调用传递参数是在寄存器中进行的。

          系统调用号存放在v0中,参数存放在a0-a3。如果参数过多,会有另一套机制来处理。系统调用的返回值通常放在v0中。如果系统调用出错,则会在a3中返回一个错误号。

 

资料来源http://xenyinzen.wikidot.com/loongson-about:see-mips-run-linux-notes 《<See Mips Run Linux>读书笔记》

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值