В чем разница между регистрами Mscratch и Mtvec?
Для Mscratch:. Как правило, он используется для хранения указателя на локальное контекстное пространство машинного режима и заменяется регистром пользователя при входе в обработчик ловушек М-режима. Для Mtvec: регистр, который содержит конфигурацию вектора ловушки, состоящую из векторного базового адреса (BASE) и векторного режима (MODE).
Я не мог понять разницу между двумя. Кто-нибудь может это очистить?
2 ответа
mtvec
регистр напрямую используется аппаратными средствами: это адрес первой команды, которая будет извлечена при обработке прерывания машинного режима. Предполагая, что ловушки включены, это может произойти в любое время, поэтому для программного обеспечения обычно небезопасно хранить произвольные значения в mtvec
, По факту, mtvec
обычно записывается небольшое количество раз во время инициализации программного обеспечения машинного режима и затем сохраняет это значение до сброса.
Напротив, значение mscratch
никогда не используется аппаратно напрямую: он просто служит xlen
-бит длинное временное временное пространство, которое может использоваться программным обеспечением машинного режима, защищено от других режимов привилегий и может быть доступно без разрушения содержимого любого регистра X (с помощью инструкции обмена CSR).
Канонический случай должен установить mtvec
в последовательности сборки, которая сначала меняет sp
в mscratch
, что приводит к чистому стеку обработки прерываний, который затем можно использовать с остальными регистрами перед входом в обработчик прерываний Си. Это позволяет программному обеспечению машинного режима обрабатывать ловушки, не разрушая содержимое регистров X, что необходимо для многих общих системных функций, таких как мультипрограммирование.
Насколько я знаю, MTVEC содержит вектор, куда программа будет переходить, когда есть прерывание. mscratch - это указатель, который может использоваться как альтернатива указателю стека, когда находится внутри функции прерывания.