re-entrência de interrupções no Linux

4

Eu estava lendo "drivers de dispositivo do Linux, 3ª edição" e não Entender uma parte descrevendo os manipuladores de interrupção. Eu gostaria de esclarecer:

  • os manipuladores de interrupção no Linux não são compreensíveis?
  • os manipuladores de interrupção no Linux não reentrantes?

Eu acredito que eu entendi muito bem o modelo de Top / Bottom, e de acordo com isso as interrupções são desativadas por tanto tempo quanto o TopHalf está sendo executado, assim o manipulador não pode ser reinserido, estou certo?

Mas e as interrupções de alta prioridade? Eles são suportados pelo Linux vanilla ou somente extensões específicas em tempo real? O que acontece se uma interrupção de baixa prioridade é interrompido por uma prioridade alta?

    
por Gilles 09.02.2011 / 03:00

2 respostas

4

O kernel do Linux é reentrante (como todos os UNIX), o que significa simplesmente que vários processos podem ser executados pela CPU. Ele não precisa esperar até que uma leitura de acesso ao disco seja manipulada pelo controlador de HDD lento e mortal, a CPU pode processar algumas outras coisas até que o acesso ao disco seja concluído (o que por sua vez desencadeará uma interrupção em caso afirmativo).

Geralmente, uma interrupção pode ser interrompida por uma outra interrupção (preempção), chamada 'Execução aninhada'. Dependendo da arquitetura, ainda existem algumas funções críticas que precisam ser executadas sem interrupção (não preemptivas) ao desativar completamente as interrupções. No x86, essas são algumas funções relevantes ( time.c , hpet.c ) e alguns xen stuff.

Existem apenas dois níveis de prioridade em relação às interrupções: 'habilitar todas as interrupções' ou 'desativar todas as interrupções', então acho que sua "interrupção de alta prioridade" é a segunda. Este é o único comportamento que o kernel do Linux sabe sobre prioridades de interrupção e não tem nada a ver com extensões em tempo real.

Se uma interrupção interruptível (sua "interrupção de baixa prioridade") for interrompida por uma outra interrupção ("alta" ou "baixa"), o kernel salva o código de execução antigo da interrupção interrompida e começa a processar a nova interrupção. Esse "aninhamento" pode acontecer várias vezes e, portanto, pode criar vários níveis de interrupções interrompidas. Depois, o kernel recarrega o código salvo da interrupção antiga e tenta terminar o antigo.

    
por 09.02.2011 / 21:06
1

Nonpreemptive significa que esses manipuladores não podem ser interrompidos por outra interrupção.

Para manipuladores não preemptíveis, a reentrada não é um problema, pois você não pode interrompê-los em primeiro lugar.

Quanto ao que o kernel faz, apenas verifique a resposta do wag, não posso comentar como ele faz sobre esse assunto.

    
por 09.02.2011 / 04:20