Assembly MIPS SYSCALL指令是如何工作的?
我们很清楚有三种类型的中断:Assembly MIPS SYSCALL指令是如何工作的?,assembly,mips,cpu-architecture,Assembly,Mips,Cpu Architecture,我们很清楚有三种类型的中断: 内部中断 外部中断 软件中断 因此,系统调用是一个软件中断。二进制形式的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
- 如果分支延迟插槽中有SYSCALL指令:
- Cause.CE=未定义
- Cause.excode=0x8(系统)
- Status.EXL=1
- 如果Status.BEV==0:
- PC=0xBFC0380
- 如果Status.BEV==1:
- PC=EBase+0x180
有关更多信息,您可以阅读手册。我本打算回答这个问题,但后来我意识到写这个问题花了太长时间。因此,这里有两个关于在Linux中实现您自己的系统调用的指南:。其基本思想是内核在内存中保留一个表,该表在编译时填充(并在运行时从磁盘复制)。中断0x80作为linux系统调用。另一方面,Windows主要通过Windows api公开系统,系统调用要少得多。MIPS指令参考告诉您它有什么功能?我假设MIPS有一些中断处理程序表或类似于其他架构(如x86)的功能,并且该系统调用会触发其中一个处理程序。这些都应记录在MIPS体系结构手册中。对于手册之外的内容,您是否有具体问题,或者您只是希望有人为您查找并引用相关章节?这似乎不是一个很好的问题。如果你在解释手册上的内容时遇到困难,这可能是一个不错的问题。只要找到手册,并在你的问题中包含一个链接。