(M)  s i s t e m a   o p e r a c i o n a l   m a g n u x   l i n u x ~/ · documentação · suporte · sobre

  Página seguinte Página anterior Índice

577. Interrupções e o Linux

Há dois tipos de operadores de interrupção no Linux: os rápidos e os lentos. Você decide que tipo você instala pelos indicadores que você passa para irqaction(). Os rápidos, como o operador de interrupção serial, executa com _todas_ as interrupções incapacitadas. Os operadores de interrupção normais, como o do programa de controle da placa ethernet, executa com outras interrupções capacitadas.

Há uma estrutura de interrupção de dois níveis. A parte rápida opera o dispositivo de registro, remove os pacotes, e talvez configure um indicador. Depois que isto é feito, e as interrupções são recapacitadas, a parte lenta é executada se o indicador estiver configurado.

O indicador entre as duas partes é configurada por:

mark_bh(INET_BH);

Geralmente este indicador é configurado diretamente pelo dispositivo do programa de controle durante uma interrupção de transmissão completa.

Você pode imaginar porque todos os operadores de interrupções não podem executar num modo normal com outras interrupções capacitadas. Ross Biro usa este cenário para ilustrar o problema:

  • Você consegue uma interrupção serial, e começa o processamento dela. A interrupção serial está agora mascarada.
  • Você tem uma interrupção de rede, e você começa a transferência num pacote 1500 bytes de tamanho máximo de sua placa.
  • Um outro caracter entra, mas desta vez a interrupção é mascarada!

A estrutura de interrupção rápida resolve este problema permitindo que os operadores de interrupção de tempo limitado execute sem o risco de deixar sua linhas de interrupção mascaradas por um outro pedido de interrupção.

Há uma distinção adicional entre operadores de interrupção rápidos e lentos que os argumentos passaram para o operador. Um operador lento é definido como:


                static void
                handle_interrupt(int reg_ptr)
                {
                    int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
                    struct device *dev = irq2dev_map[irq];
                ...

Enquanto um operador rápido consegue o número de interrupção diretamente:


                static void
                handle_fast_interrupt(int irq)
                {
                ...

Um aspecto final do desempenho da rede é a latência. A única placa que realmente endereça isto é a 3c509, que permite uma interrupção profética a ser postada. Ela provê um cronômetro de resposta de interrupção para que o programa de controle possa fazer a sintonia fina assim que uma interrupção seja gerada.


Página seguinte Página anterior Índice