【问题标题】:RISC-V ecall syscall calling convention on pk/LinuxPK/Linux 上的 RISC-V ecall syscall 调用约定
【发布时间】:2020-05-05 02:43:21
【问题描述】:

在 RISC-V 伪内核 (pk) 或 Linux 下运行的程序中,系统调用的调用约定是什么?

查看 riscv-gnu-toolchain 生成的代码,规则似乎是:

  • 系统调用号传入a7
  • 系统调用参数在a0 中传递给a5
  • 未使用的参数设置为0
  • 返回值在a0中返回

是这个吗?

真的有必要将未使用的参数清零吗?

注册a6呢?这可以用于另一个 sycall 参数吗?

调用exit() 系统调用的示例:

li    a0, 1               # argument that is used by the syscall
li    a1, 0               # unused arguments
li    a2, 0
li    a3, 0
li    a4, 0
li    a5, 0
li    a7, 93              # exit syscall number

【问题讨论】:

    标签: system-calls calling-convention riscv


    【解决方案1】:

    是的,基本上就是这样。

    不,没有必要将未使用的参数归零。使用 riscv-gnu-toolchain(使用 newlib C 库)时将未使用的参数归零只是 newlib sycall 调用代码的产物。为简单起见,代码有一个带有 6 个系统调用参数的 scall (old name for ecall) wrapper。因此,exit() 实现只是calls that wrapper with some additional zeroes

    截至 2020 年,maximum number of syscall arguments in Linux is 6。伪内核也是如此。因此,a6 始终未被使用。

    Linux 和 pk 都在 a7 中提供系统调用号。 pk 使用的系统调用号遵循 Linux 标准。

    syscall(2) Linux 手册页还总结了不同架构的调用约定,包括 RISC-V。 specifies a1 可能用于返回第二个返回值,但这与 glibc 和 newlib 中的代码不匹配。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多