Кто предоставляет системные вызовы в qemu-riscv? - PullRequest
0 голосов
/ 09 октября 2018

Я начал изучать рис.Я получил qemu-riscv, riscv-gcc и скомпилировал следующую программу asm hello world:

.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"

Здесь используются syscalls (_NR_sys_write, _NR_sys_exit), и это сбивает меня с толку - я думаю, что я запускаю программу «голый металл»,но почему системные вызовы используются неявно?Почему эти системные вызовы проксируются qemu, и что произойдет, если я запущу этот код на fpga riscv, где нет ни одного нереализованного системного вызова?

ps: действительно трудно найти какое-либо руководство по программированию на risc-v или конфигурацию процессора с минимальным набором ресурсовдля меня.Есть некоторые плохо прокомментированные коды портированных ОС (FreeRTOS, Linux и FreeBSD), но нет никаких объяснений.Не могли бы вы также помочь мне с этой информацией?

1 Ответ

0 голосов
/ 15 октября 2018

В QEMU есть три семейства целей:

  • Эмуляция пользовательского режима, где QEMU предоставляет AEE (среду выполнения приложений).В этом режиме сам QEMU действует как супервизор - другими словами, когда QEMU видит ecall, он декодирует число / аргументы системного вызова, выполняет системный вызов и затем возвращается к инструкциям эмуляции.Таким образом, эмуляция пользовательского режима QEMU связана с ABI конкретного супервизора, и единственным примером, который я видел на RISC-V, является Linux.
  • Мягкий MMU, где QEMU предоставляет MEE (Machine Execution Environment).В этом режиме весь программный стек запускается так, как если бы он работал в полной системе RISC-V с QEMU, предоставляющей эмулируемые устройства - иными словами, когда QEMU видит ecall, он начинает эмулировать код в векторе ловушек.Здесь QEMU не нужно ничего знать о супервизоре, так как выполняется точный код супервизора.
  • Аппаратная виртуализация, где QEMU предоставляет HEE (среду выполнения гипервизора), полагаясь на аппаратную эмуляцию для обеспечения лучшей производительности.Мы еще не работали над RISC-V (по состоянию на октябрь 2018 года), но есть спецификации, находящиеся в процессе разработки и ранней реализации.

Если вы видите ecall инструкции только в пользовательском пространствеволшебно работает, тогда вы, вероятно, работаете в эмуляции пользовательского режима.

...