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.