谁在 qemu-riscv 中提供系统调用?



我开始学习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 Worldn"

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

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

QEMU 中有三类目标:

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

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

相关内容

  • 没有找到相关文章

最新更新