MIPS SYSCALL 指令如何工作?

How does the MIPS SYSCALL instruction work?

我们很好理解中断分为三种类型:

  1. 内部中断
  2. 外部中断
  3. 软件中断

所以系统调用是一个软件中断。二进制形式的 MIPS SYSCALL 指令是 00000000000000000000000000001100

当cpu 获取这条指令并执行时会发生什么。在某些寄存器中这条指令之前传递的参数在这里无关紧要,关键问题是这条指令本身做了什么,他的工作是什么,它在内部如何工作 cpu.

仅运行这条指令对机器的架构状态有什么影响?

这意味着哪个寄存器值受此系统调用(指令)影响,它打开哪个标志,它完成工作的步骤数,如果它跳转到另一个内存位置(如中断向量 table) 它如何找到那些内存位置的地址 .

这可能取决于您所谈论的 MIPS 处理器,但是对于最新版本的 MIPS32 架构,SYSCALL 指令会导致系统调用异常,该异常通过执行位于异常向量偏移量 0x180 处的代码来处理根据。

在 CPU 实现 MIPS32 ISA 第 6 版时具体发生的情况如下:

  • 如果Status.EXL == 0 那么:
    • 如果SYSCALL指令在分支延迟槽中:
      • EPC = PC - 4
      • Cause.BD = 1
      • BadInstr = 内存[PC]
      • BadInstrP = 内存[PC - 4]
    • 如果SYSCALL指令不在分支延迟槽中:
      • EPC = PC
      • Cause.BD = 0
      • BadInstr = 内存[PC]
    • 如果 SRSCtl.HSS > 0 并且 Status.BEV == 0 那么:
      • SRSCtl.PSS = SRSCTL.CSS
      • SRSCtl.CSS = SRSCTL.ESS
  • Cause.CE = 未定义
  • Cause.ExcCode = 0x8(系统)
  • Status.EXL = 1
  • 如果Status.BEV == 0:
    • PC = 0xBFC0380
  • 如果Status.BEV == 1:
    • PC = EBase + 0x180

名称 Status、EPC、BadInstr、BadInstrP、SRSCtl、Cause 和 EBase 都是协处理器 0 (CP0) 寄存器,因此您不会在大多数 MIPS 文档中找到它们。句点 (.) 后的后缀表示这些寄存器的子字段。

有关更多信息,您可以阅读 程序员的 MIPS 体系结构 卷。 III:MIPS32/microMIPS32特权资源架构手册。