【问题标题】:MIPS architecture syscall instructionMIPS架构系统调用指令
【发布时间】:2011-05-09 15:09:36
【问题描述】:

系统调用指令在MIPS中的作用是什么?

【问题讨论】:

    标签: mips mips32 mips64


    【解决方案1】:

    系统调用用于向内核请求服务。对于 MIPS,服务编号/代码必须在 $v0 中传递,参数在其他几个指定的寄存器中传递。例如,要打印,我们可能会这样做:

    li $v0, 1
    add $a0, $t0, $zero
    syscall
    

    在这种情况下,1 是打印整数的服务代码。第二条指令有效地执行从 $t0 到 $a0 的复制,这是保存参数的指定寄存器(在这种情况下,是要打印的整数)。给出了服务和相应参数的列表: http://courses.missouristate.edu/KenVollmar/Mars/Help/SyscallHelp.html

    【讨论】:

    • 如果在当前程序已经处于内核模式时使用 syscall 指令会发生什么?除了用户模式和内核模式之外,MIPS 还有其他模式吗?
    【解决方案2】:

    当您跳出像 MARS 或 SPIM 这样的系统调用有些人为的模拟器环境时,这一点会变得更加明显。在真正的 MIPS 机器上,您将使用它来转移控制内核来调用特定功能。

    例如,这是一个用于 linux 机器的 MIPS 32 位程序集的基本 hello world 程序(我 95% 确定这是在 mipsel 安装上,这对这个问题并不重要)

    # CS341L Fall 2008
    # Lab Exercise #1
    # Matthew J. Barrick <barrick@cs.unm.edu>
    
    #include <asm/regdef.h> 
    #include <sys/syscall.h>
    
    .data
        hello:  .asciz  "Hello World\n"
        length: .word   12
    .text
        .globl  main
        .ent    main
    main:
        li  a0, 1
        la  a1, hello
        lw  a2, length
        li  v0, SYS_write
        syscall
        move    v0, zero
        jr  ra
        .end    main
    

    这与 C 代码非常接近(如果您在遵循 MIPS 程序集时遇到问题)。

    #include <stdio.h>
    
    int main(int argc, char** argv) {
        char* hello = "Hello World\n";
        write(STDOUT_FILENO,hello, 12);
        return 0;
    }
    

    首先请注意,包含头文件是为了给寄存器提供符号名称(asm/regdef.h)和一个头文件,它将为系统调用提取符号名称(sys/syscall.h),所以我们不必参考按编号发送到系统调用。这里进行系统调用的约定与调用函数几乎相同,加载带有参数的#寄存器,然后我们将我们想要的系统调用加载到 $v0 并调用系统调用。 SYS_write 对应于 linux/unix 的基本 write(2) 函数(1 为标准输出)。

    ssize_t write(int fd, const void *buf, size_t count);
    

    所以我们告诉内核写入文件句柄 1 (stdout),字符串 hello,使用长度字节。在 linux 上,您可以看到所有可用的不同系统调用的 syscalls(2),但它们几乎对应于内核提供的核心功能,以及 (g)libc 为 C/C++ 程序包装或构建的核心功能。

    Linux(和大多数 unix-like 回到 4BSD 路线)有一个函数 syscall(2),它实际上是同一件事。

    一旦你开始做更复杂的事情,你会发现自己将调用系统调用包装成方便的函数,或者更好的是只调用相应的 libc 版本(令人惊讶地容易做到,但需要另外讨论)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      相关资源
      最近更新 更多