【问题标题】:Who provides syscalls in qemu-riscv?谁在 qemu-riscv 中提供系统调用?
【发布时间】:2018-10-09 14:50:48
【问题描述】:

我开始学习 riscv。我得到了 qemu-riscv、riscv-gcc 并编译了下一个 hello world asm 程序:

.section .text
.globl _start
_start:

    li a0, 0                    # stdout
1:  auipc a1, %pcrel_hi(msg)    # load msg(hi)
    addi a1, a1, %pcrel_lo(1b)  # load msg(lo)
    li a2, 12                   # length
    li a3, 0
    li a7, 64                   # _NR_sys_write
    ecall                       # system call

    li a0, 0
    li a1, 0
    li a2, 0
    li a3, 0
    li a7, 93                   # _NR_sys_exit
    ecall                       # system call

loop:
    j loop

.section .rodata
msg:
    .string "Hello World\n"

这里正在使用系统调用(_NR_sys_write,_NR_sys_exit),这让我感到困惑 - 我想我运行“裸机”程序,但为什么隐式使用系统调用?为什么这个系统调用由 qemu 代理,如果我在没有实现系统调用的 fpga riscv 上运行此代码会发生什么?

ps:我真的很难找到任何 risc-v 编程教程或处理器裸机配置。移植操作系统(FreeRTOS、Linux 和 FreeBSD)有一些注释不佳的代码,但没有任何解释。你能帮我提供这些信息吗?

【问题讨论】:

  • 你能给出你使用的工具链的确切名称吗?
  • @Guillaume riscv64-unknown-elf-gcc
  • 啊,我明白了。我使用了 qemu riscv64-linux-user 而不是 riscv64-softmmu (qemu-system-riscv64)。这就是 qemu 代理系统调用到 linux 的原因。谢谢提示。
  • 我猜的。不客气。

标签: qemu riscv


【解决方案1】:

QEMU 中有三类目标:

  • 用户模式仿真,其中 QEMU 提供 AEE(应用程序执行环境)。在这种模式下,QEMU 本身充当监督者——换句话说,当 QEMU 看到ecall 时,它将解码系统调用号/参数,执行系统调用,然后返回到模拟指令。因此,QEMU 的用户模式仿真与特定主管的 ABI 相关联,我在 RISC-V 领域看到的唯一实例是 Linux。
  • Soft MMU,其中 QEMU 提供 MEE(机器执行环境)。在这种模式下,整个软件堆栈就像在一个完整的 RISC-V 系统上运行一样运行,QEMU 提供了模拟设备——换句话说,当 QEMU 看到ecall 时,它将开始在陷阱向量处模拟代码。在这里,QEMU 不需要了解有关主管的任何信息,因为确切的主管代码正在运行。
  • 硬件虚拟化,其中 QEMU 提供 HEE(管理程序执行环境),同时依靠硬件仿真来提供更好的性能。我们还没有在 RISC-V 上进行这项工作(截至 2018 年 10 月),但是随着早期的实施工作正在制定规范。

如果您在用户空间中看到 ecall 指令神奇地工作,那么您可能正在用户模式仿真中运行。

【讨论】:

  • 感谢您的解释。我的 ps 上的小附录:我找到了在 qemu 中运行并存在硬件配置的裸机示例github.com/michaeljclark/riscv-probe
  • 如果您运行的是系统模式 QEMU,那么您应该能够在“siive_e”板上运行任何 HiFive1 示例。
猜你喜欢
  • 2015-09-18
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多