MIPS SYSCALL 指令如何工作?
How does the MIPS SYSCALL instruction work?
我们很好理解中断分为三种类型:
- 内部中断
- 外部中断
- 软件中断
所以系统调用是一个软件中断。二进制形式的 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特权资源架构手册。
我们很好理解中断分为三种类型:
- 内部中断
- 外部中断
- 软件中断
所以系统调用是一个软件中断。二进制形式的 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
- 如果SYSCALL指令在分支延迟槽中:
- 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特权资源架构手册。