ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
18 июля
1530829 Топик полностью
klen (16.07.2025 15:29, просмотров: 80) ответил SciFi на Вот кто это придумал? "Мрет или срет"? О_о
.. что за вопрос странный? 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()
{
??????
} { .................