似乎2016r4新银卡wood内核核被锁定了

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、中断
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中返回一个错误号。
资料来源:&《&See
Mips Run Linux&读书笔记》
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

参考资料

 

随机推荐