gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:53:50 31 4
gpt4 key购买 nike

我开始学习 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)的注释不佳的代码,但没有任何解释。您也可以帮我了解这些信息吗?

最佳答案

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 指令神奇地工作,那么您可能正在用户模式仿真中运行。

关于qemu - 谁在 qemu-riscv 中提供系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52723900/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com