【MIPS CPU 体系结构概述1】连载5:

5. MIPS 异常和中断处理

任何一个CPU都要提供一个完善的异常和中断处理机制。一个软件系统,如操作系统,就 是一个时序逻辑系统,通过时钟,外部事件来驱动整个预先定义好的逻辑行为。这也是为 什么当写一个操作系统时如何定义时间的计算是非常重要的原因。

读者都非常清楚UNIX提供了一整套系统调用(System Call)。系统调用其实就是一段异常处 理程序。

读者可能要问:为什么CPU要提供异常和中断处理呢?其目的是: ×处理非法操作。 例如,TLB Fault,Cache Error等等。
×提供一个通道使得程序可以使用被保护的高级资源,例如CP0寄存器。在用户态下的进 程不能访问CP0。CPU通过陷入核心态的异常处理方式使得一个进程可以安全的进行一 些CPU的高级设置。

×处理外部和内部中断,例如,时钟,看门狗(WatchDog)等等。 下面来讨论MIPS是如何处理异常和中断。

各种MIPS的变种都有些细微的差别。下面是基于MIPS R7000的结构。
×理解MIPS异常处理最重要的概念是:MIPS体系结构采用的是精确异常处理模式。这是什
么意思呢?下面来看从“See MIPS Run”一书中的摘录:“In a precise-exception CPU, on any
exception we get pointed at one instruction(the exception victim). All instructions preceding the
exception victim in execution sequence are complete; any work done on the victim and on any
subsequent instructions (BNN NOTE: pipeline effects) has no side effects that the software need worry about. The software that handles exceptions can ignore all the timing effects of the CPU's implementations”
上面的意思其实很简单:在发生这个异常之前的一切计算行为会完整的结束并体现效果。 在发生这个异常之后的一切计算行为(包含当前这条指令)将不会产生任何效果。

对绝大多数情况而言,如果读者要写一个系统调用(System Call),只需要记住:
MIPS已经把syscall这条指令的地址压在了EPC寄存器里。换句话说,在MIPS里,你需要在 异常返回之前显示的给EPC寄存器赋值EPC<-----EPC+4。只有这样,你才能从系统调用中 正确返回。

下面讨论一下MIPS的异常/中断向量表(Exception/Interrupt Vector)
MIPS 的异常/中断向量表 (假定将MIPS运行在32为模式下) Reset, NMI: 0x8000 0000
TLB Refill: 0x8000 0000
Cache Error 0xA000 00100
其他的异常都指向:0x8000 0180

那么MIPS如何来区分和处理一个异常呢?其时序逻辑可以简单的归纳如下:

1. 将EPC赋值为要重新执行(被中断的)指令的地址。

2. CPU变为核心态,并且禁止中断。(通过SR[EXL]的位。)

3. 对Cause寄存器赋值,从而程序可以判断是一个具体的什么异常中断。如果是一个TLB Miss方面的异常,BadVaddre寄存器也会被同时赋值,从而提高更多的异常信息。

4. CPU开始从异常处理向量的入口存取指令,从而CPU逻辑进入异常处理。

5. 从异常返回。

从MIPS III指令集开始,从中断返回用的是指令eret。 该指令的功能其实就
是iangSR[EXL]位清零(开中断),并把CPU的控制转向将EPC寄存器指向的地址。

在理解MIPS中断处理结构时,需要对SR状态寄存器的IE和EXL位充分了解。

SR[IE]: 用来开启和关闭中断,其中也包括时钟中断。当然,如果SR[EXL]位被置位
时,IE位不起作用。EXL和ERL在CPU异常中断处理时会被硬件自动置为,从而关闭所有 中断,从而系统可以安全的进行中断异常的处理(前期)工作。

--电子创新网--
粤ICP备12070055号