Digamos que eu alterne do modo de usuário para o modo de sistema executando ecall
, o que desabilita interrupções ao definir SIE
bit sstatus
como 0
.
O que acontecerá com uma interrupção que ocorre enquanto as interrupções estão desabilitadas?
Digamos que eu alterne do modo de usuário para o modo de sistema executando ecall
, o que desabilita interrupções ao definir SIE
bit sstatus
como 0
.
O que acontecerá com uma interrupção que ocorre enquanto as interrupções estão desabilitadas?
Existe um conceito de interrupção pendente , que se reflete no valor do
SIP
registrador (ouMIP
no modo máquina). Essa interrupção permanece pendente até que a habilitação global de interrupção (SIE
) seja restaurada. Nesse ponto, se a fonte de interrupção ainda estiver ativa (ou seu bit pendente permanecer ativo), o processador executará a captura de interrupção.Se ocorrerem várias interrupções enquanto as interrupções estiverem desabilitadas, seus respectivos bits pendentes serão definidos. O hardware RISC-V geralmente atribui prioridades às interrupções, portanto, quando você reativa as interrupções, a interrupção pendente de maior prioridade é acionada primeiro.
Então, resumindo, as interrupções são enfileiradas e devem ser tratadas em ordem de prioridade, depois que o
ecall
manipulador sair (comsret
oumret
).O comportamento real de entrega pode depender da fonte exata da interrupção (por exemplo, sensível ao nível versus acionada por borda), mas, geralmente, as interrupções são bloqueadas como pendentes em vez de ignoradas.
Também há uma opção de ter interrupções aninhadas , o que significa manipular interrupções enquanto o manipulador ainda executa, mas essa é uma história bem diferente e mais complicada.