.. что за вопрос странный? 1) процессор может находится в трех
режимах machine supervisor user. для каждого в зависимости от
задачи имплементор riscv настраивает доступность груп инструкций и
обработки исключений 2) что бы выйти из machine - mret , чтоб выйти
из supervisor - sret. выход всегда с понижением в user. заход вверх
- только через исключения (и как одна из разновидностей их -
reset). просто ret - выход по стеку не меняя режим. все предельно
лаконично и просто
. редко где так без костылей продумано.
в ch32v307 (ядро qkv4f) реализованы machine и user.
прыгание по режимам работает совместно с csr регистом mepc - тут хранится адрес возврата при переходе в user
примерно так:
reser -> machine mode
reset_handler()
{ код инициализации main stack и gloabal pointer код инициализации любого железа которое допускает настройку только в режиме machine crt код режима machine конструкторы требующие доступа режима machine ........ mepc <= _init() addr mret ------------------------> user mode ( pc <= mepc аппаратно )
} -> _init()
{
crt код не требующие режима machine конструкторы требующие доступа режима machine
}
main()
{
...
...
hw signal -> exception -> machine mode ( mepc <= current pc аппаратно ) exception/irq handler() { ............ mret -> user mode ( pc <= mepc аппаратно ) }
...
... }
_fini()
{
??????
} { .................