Assembly MIPS SYSCALL指令是如何工作的?

Assembly MIPS SYSCALL指令是如何工作的?,assembly,mips,cpu-architecture,Assembly,Mips,Cpu Architecture,我们很清楚有三种类型的中断: 内部中断 外部中断 软件中断 因此,系统调用是一个软件中断。二进制形式的MIPS SYSCALL指令为 0000000000000000000000 1100 当cpu获取该指令并执行该指令时会发生什么情况。在某些寄存器中,在该指令之前传递的参数在这里并不重要,关键问题是该指令本身做什么,它的工作是什么,它在cpu中如何工作 仅运行此指令对机器的体系结构状态有何影响? 这意味着,如果跳转到另一个内存位置(如中断向量表),受此系统调用(指令)影响的寄存器值、它打开的标

我们很清楚有三种类型的中断:

  • 内部中断
  • 外部中断
  • 软件中断
  • 因此,系统调用是一个软件中断。二进制形式的MIPS SYSCALL指令为 0000000000000000000000 1100

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

    仅运行此指令对机器的体系结构状态有何影响?


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

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

    具体来说,在实现MIPS32 ISA版本6的CPU上发生的情况如下:

    • 如果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.excode=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文档中找不到它们。句点(.)后面的后缀表示这些寄存器的子字段


    有关更多信息,您可以阅读手册。

    我本打算回答这个问题,但后来我意识到写这个问题花了太长时间。因此,这里有两个关于在Linux中实现您自己的系统调用的指南:。其基本思想是内核在内存中保留一个表,该表在编译时填充(并在运行时从磁盘复制)。中断0x80作为linux系统调用。另一方面,Windows主要通过Windows api公开系统,系统调用要少得多。MIPS指令参考告诉您它有什么功能?我假设MIPS有一些中断处理程序表或类似于其他架构(如x86)的功能,并且该系统调用会触发其中一个处理程序。这些都应记录在MIPS体系结构手册中。对于手册之外的内容,您是否有具体问题,或者您只是希望有人为您查找并引用相关章节?这似乎不是一个很好的问题。如果你在解释手册上的内容时遇到困难,这可能是一个不错的问题。只要找到手册,并在你的问题中包含一个链接。