Interrompendo uma interrupção

Interrompendo uma interrupção

Eu sei como funciona o tratamento de interrupções (mudança de modo, salvamento de registros, mudança de pilha...). No entanto, estou curioso, e se ocorrer uma interrupção enquanto ainda estivermos no modo kernel, e não no modo usuário?

Responder1

Exatamente o mesmo. No entanto, se estivermos processando uma interrupção, possivelmente nada, ou nada até terminarmos.

O que fazemos em todos os casos:

  • modo de salvamento incondicional e modo de configuração para modo supervisor (feito por hardware. Acionado por interrupção)
  • salvar incondicionalmente o estado e a pilha de switches
  • execute o código de interrupção
  • alternar incondicionalmente a pilha, restaurar o estado e o modo de restauração

A frase "definir modo para modo supervisor" pode ser lida como qualquer uma destas:

  • certifique-se de que o modo seja o modo supervisor.
  • escreva um no bit S do registrador de status

Interrompendo uma interrupção

Existem possivelmente vários (mas finitos) níveis de prioridade de interrupção. Haverá uma pilha para cada nível. Uma interrupção só pode ser interrompida por uma interrupção de prioridade mais alta. Interrupções de prioridade mais baixa podem ser bloqueadas por prioridade mais alta. Isso resolve a maioria dos problemas, mas as pilhas não podem ser corrompidas.

No entanto, interrupções de prioridade mais baixa podem ser bloqueadas (incluindo processos de usuário. Estas são as prioridades de interrupção mais baixas). Portanto, é importante garantir que as interrupções sejam rápidas (sem muito código), especialmente para interrupções de prioridade mais alta: conclua o trabalho e saia, faça com que uma interrupção de prioridade mais baixa (como um processo de usuário) faça a parte que leva tempo.

Pilhas

Um kernel pode usar a mesma pilha que o processo, quando um processo chama o kernel (chamada de sincronização: usando um syscall no código de um programa).

Um kernel também terá uma pilha para cada nível de prioridade de interrupção. Consulte a seção sobre como interromper uma interrupção.

informação relacionada