【问题标题】:How does the MIPS SYSCALL instruction work?MIPS SYSCALL 指令是如何工作的?
【发布时间】:2016-09-12 02:31:37
【问题描述】:

我们很清楚中断分为三种类型:

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

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

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

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

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

【问题讨论】:

  • 我正要回答这个问题,但后来我意识到写它花了太长时间。因此,这里有两个关于在 Linux 中实现自己的系统调用的指南:tldp.org/HOWTO/Implement-Sys-Call-Linux-2.6-i386/x19.htmlmacboypro.wordpress.com/2009/05/15/…。基本思想是内核在内存中保留一个表,在编译时填充(并在运行时从磁盘复制)。中断 0x80 被视为 linux 系统调用。另一方面,Windows 主要通过 windows api 公开系统,并且系统调用要少得多。
  • MIPS 指令参考告诉你它做了什么?
  • 我假设 MIPS 有一些中断处理程序表或其他东西,类似于其他架构(如 x86)所做的,并且 SYSCALL 触发其中一个处理程序。这都应该记录在 MIPS 架构手册中。您是否对手册以外的内容有具体问题,或者您只是希望有人为您查找并引用相关部分?这似乎不是一个很好的问题。如果您在解释手册内容时遇到困难,那可能是一个很好的问题。只需找到手册并在您的问题中包含指向它的链接即可。

标签: assembly mips cpu-architecture


【解决方案1】:

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

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

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

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

有关更多信息,您可以阅读MIPS Architecture For Programmers Vol. III: MIPS32/microMIPS32 Privileged Resource Architecture 手册。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    相关资源
    最近更新 更多