Как симулятор процессора определяет конец программы?

#assembly #simulator #riscv #bare-metal #riscv32

Вопрос:

Я довольно новичок в RISC-V, и мне нужна ваша помощь.

Я пишу простой симулятор RISC-V ISA для архитектуры RV32I для среды с голым металлом. Я знаю, что мы можем получить точку входа(начало программы) в файле elf, но информации о конце программы нет.

Я видел ассемблерный код функции exit (), который приведен ниже.

 00010548 lt;_exitgt;:  10548: 05d00893 li a7,93  1054c: 00000073 ecall  10550: 00054463 bltz a0,10558 lt;_exit 0x10gt;  10554: 0000006f j 10554 lt;_exit 0xcgt;  10558: ff010113 addi sp,sp,-16  1055c: 00812423 sw s0,8(sp)  10560: 00050413 mv s0,a0  10564: 00112623 sw ra,12(sp)  10568: 40800433 neg s0,s0  1056c: 00c000ef jal ra,10578 lt;__errnogt;  10570: 00852023 sw s0,0(a0)  10574: 0000006f j 10574 lt;_exit 0x2cgt;  

Когда программа достигнет функции exit (), процессор застрянет в бесконечном цикле(перейдет к самому себе), в этом случае, что должен делать процессор? Как следует поступить с такой инструкцией по прыжку и как понять, что это конец программы?

Заранее спасибо

Комментарии:

1. Если у вас есть однозадачная (я предполагаю) среда с голым металлом, что должно означать «завершение программы»? Ничего не делать вечно? Переход к себе делает это прекрасно. Или вернуть контроль кому ??? (где?).

2. Если вы имитируете процессор, переход к самостоятельной инструкции должен быть легко обнаружен. Затем вы можете делать все, что вам заблагорассудится.

3. Некоторые тренажеры предоставляют инструкцию по остановке. Но я в основном видел это для игрушек, таких как LC3. MARS обнаруживает, что ваша программа завершает выполнение инструкций, введенных в IDE, если вы не выполнили системный вызов выхода. (Я забыл, что делает SPIM; это может просто привести к сбою вашей программы, если выполнение выходит за пределы определенных областей памяти. В MIPS битовый шаблон с нулевым значением является допустимым nop, хотя я думаю, что RISC-V отличается.)

4. @dratenik Да, это правда. это значит ничего не делать вечно. итак, как же следует управлять этим бесконечным циклом?

5. Встроенное устройство (например, в электродвигатель, солнечный инвертор, стиральную машину) обычно выполняет свою работу вечно, пока подается питание. Концепция «завершения программы» просто не имеет смысла. Есть несколько исключений, таких как критические ошибки или обновление встроенного ПО, которые обычно вызывают перезагрузку (или бесконечный цикл).