mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
ЛР10-11. Исправление микроархитектуры
Ранее, для того чтобы не маскировать сигналы, отвечающие за изменение архитектурного состояния процессора, инструкция исполнялась до конца, а уже после происходил перехват инструкции с записью в mepc следующего значения PC. Однако по спецификации, в mepc должен попадать адрес перехватываемой инструкции (важно для проверки обработки исключений). Таким образом, логика перехвата была изменена: маскируются все управляющие сигналы, а в mepc записывается адрес текущей инструкции.
This commit is contained in:
@@ -101,7 +101,7 @@ _Таблица 2. Список регистров, подлежащих реа
|
||||
|
||||
Регистр `mtvec` является базовым адресом обработчика прерывания. Это значит, что предусмотрена возможность реализации как обзорной (прямой), так и векторной системы прерывания. В первом случае при возникновении прерывания в **program counter** загружается значение `mtvec`. Во втором случае, в **program counter** загружается сумма регистра базового адреса `mtvec` и регистра причины прерывания `mcause`, который обновляется каждый раз, когда происходит прерывание, значение в нем несет информацию о том, что именно произошло в системе.
|
||||
|
||||
Так как обработчик прерывания будет использовать те же регистры, что и прерванная программа, то перед использованием регистрового файла, данные из него необходимо сохранить, разместив их на стеке. Стек для прерывания находится не там же, где программный стек, а адрес начала этого стека хранится в регистре `mscratch` и по сути является указателем на верхушку стека. Регистр `mepc` сохраняет адрес инструкции, следующей за той, вовремя которой произошло прерывание или исключение. Однако чтобы не нарушался ход программы, необходимо, чтобы инструкция, во время которой произошло прерывание исполнилась до конца. Это приведет к появлению задержки между моментом прерывания и началом его обработки в случае, если исполнялась инструкция работы с внешней памятью.
|
||||
Так как обработчик прерывания будет использовать те же регистры, что и прерванная программа, то перед использованием регистрового файла, данные из него необходимо сохранить, разместив их на стеке. Стек для прерывания находится не там же, где программный стек, а адрес начала этого стека хранится в регистре `mscratch` и по сути является указателем на верхушку стека. Регистр `mepc` сохраняет адрес инструкции во время которой произошел перехват. Это очень важно понимать, при реализации обработчика исключения — если в нем не перезаписать этот регистр, по возврату из обработчика процессор снова окажется на инструкции, которая вызвала исключение.
|
||||
|
||||
Когда процессор включается, программа первым делом должна инициализировать все требуемые CS-регистры, в частности:
|
||||
|
||||
|
Reference in New Issue
Block a user