В чем разница между регистрами Mscratch и Mtvec?

Для Mscratch:. Как правило, он используется для хранения указателя на локальное контекстное пространство машинного режима и заменяется регистром пользователя при входе в обработчик ловушек М-режима. Для Mtvec: регистр, который содержит конфигурацию вектора ловушки, состоящую из векторного базового адреса (BASE) и векторного режима (MODE).

Я не мог понять разницу между двумя. Кто-нибудь может это очистить?

2 ответа

mtvec регистр напрямую используется аппаратными средствами: это адрес первой команды, которая будет извлечена при обработке прерывания машинного режима. Предполагая, что ловушки включены, это может произойти в любое время, поэтому для программного обеспечения обычно небезопасно хранить произвольные значения в mtvec, По факту, mtvec обычно записывается небольшое количество раз во время инициализации программного обеспечения машинного режима и затем сохраняет это значение до сброса.

Напротив, значение mscratch никогда не используется аппаратно напрямую: он просто служит xlen-бит длинное временное временное пространство, которое может использоваться программным обеспечением машинного режима, защищено от других режимов привилегий и может быть доступно без разрушения содержимого любого регистра X (с помощью инструкции обмена CSR).

Канонический случай должен установить mtvec в последовательности сборки, которая сначала меняет sp в mscratch, что приводит к чистому стеку обработки прерываний, который затем можно использовать с остальными регистрами перед входом в обработчик прерываний Си. Это позволяет программному обеспечению машинного режима обрабатывать ловушки, не разрушая содержимое регистров X, что необходимо для многих общих системных функций, таких как мультипрограммирование.

Насколько я знаю, MTVEC содержит вектор, куда программа будет переходить, когда есть прерывание. mscratch - это указатель, который может использоваться как альтернатива указателю стека, когда находится внутри функции прерывания.

Другие вопросы по тегам