【发布时间】: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 的原因。谢谢提示。
-
我猜的。不客气。