Pergunta

Eu deveria primeiro compartilhar tudo o que sei - e isso é um caos completo. Existem várias perguntas diferentes sobre o assunto, então, por favor, não fique irritado :).

1) Para encontrar um ISR, a CPU recebe um número de interrupção. Nas máquinas x86 (286/386 e acima), há um IVT com ISRs nele; Cada entrada de 4 bytes de tamanho. Portanto, precisamos multiplicar o número de interrupção por 4 para encontrar o ISR. Portanto, o primeiro grupo de perguntas é - estou completamente confuso no mecanismo de CPU recebendo a interrupção. Para aumentar uma interrupção, o dispositivo em primeiro lugar deve investigar o IRQ - e depois? O número de interrupção viaja "no IRQ" para a CPU? Eu também li algo como o endereço ISR do dispositivo no barramento de dados; o que é isso então? Qual é o conceito de dispositivos que substituem o ISR. Alguém pode me dizer alguns dispositivos de exemplo onde as pesquisas da CPU para interrupções? E onde ele encontra ISR para eles?

2) Se dois dispositivos compartilham um IRQ (o que é muito possível), como a CPU difere entre eles? E se ambos os dispositivos aumentarem uma interrupção da mesma prioridade simultaneamente. Eu sabia que haverá mascaramento do mesmo tipo e interrupções de baixa prioridade - mas como essa comunicação acontece entre a CPU e o controlador de dispositivos? Estudei o papel de PIC e APIC para esse problema, mas não conseguia entender.

Obrigado pela leitura. Muito obrigado por responder.

Foi útil?

Solução

As CPUs não pesquisam interrupções, pelo menos não no sentido de software. Com relação ao software, as interrupções são eventos assíncronos.

O que acontece é que o hardware da CPU reconhece a solicitação de interrupção, que é uma entrada elétrica em uma linha de interrupção e, em resposta, deixa de lado a execução normal dos eventos para responder à interrupção. Na maioria das CPUs modernas, o que acontece a seguir é determinado por um aperto de mão de hardware particular para o tipo de CPU, mas a maioria deles recebe algum tipo de algum tipo de dispositivo de interrupção. Esse número pode ser de 8 bits ou 32 ou o que for, dependendo do design da CPU. A CPU usa esse número de interrupção para indexar na tabela de vetores de interrupção, para encontrar um endereço para iniciar a execução da rotina de serviço de interrupção. Depois que esse endereço é determinado, (e o contexto atual de execução é salvo com segurança na pilha), a CPU começa a executar o ISR.

Quando dois dispositivos compartilham uma linha de solicitação de interrupção, eles podem fazer com que os ISRs diferentes sejam executados retornando um número de interrupção diferente durante esse processo de handshaking. Se você tiver números vetoriais suficientes disponíveis, cada dispositivo de interrupção pode usar seu próprio vetor de interrupção.

Mas dois dispositivos podem até compartilhar uma linha de solicitação de interrupção e um vetor de interrupção, desde que o ISR compartilhado seja inteligente o suficiente para voltar a todas as fontes possíveis da interrupção fornecida e verifique os registros de status para ver qual dispositivo solicitou o serviço.

Um pouco mais de detalhe

Suponha que você tenha um sistema composto por uma CPU e controlador de interrupção e um dispositivo de interrupção. Antigamente, estes teriam sido dispositivos físicos separados, mas agora os três podem até residir no mesmo chip, mas todos os sinais ainda estão lá dentro do caso de cerâmica. Vou usar uma CPU do PowerPC (PPC) com um controlador de interrupção integrado, conectado a um dispositivo em um barramento PCI, como um exemplo que deve servir bem.

Digamos que o dispositivo seja uma porta serial que está transmitindo alguns dados. Um driver de porta serial típico carregará um monte de dados no FIFO do dispositivo, e a CPU pode fazer trabalhos regulares enquanto o dispositivo faz o que faz. Normalmente, esses dispositivos podem ser configurados para gerar uma solicitação de interrupção quando o dispositivo estiver com poucos dados para transmitir, para que o driver do dispositivo possa voltar e se alimentar mais.

A lógica de hardware no dispositivo espera que uma interrupção de barramento PCI reconheça, momento em que algumas coisas podem acontecer. Alguns dispositivos usam 'autovetoring', o que significa que eles dependem do controlador de interrupção para que a rotina de serviço correta seja selecionada. Outros terão um registro, que o driver do dispositivo terá pré-programação, que contém um vetor de interrupção que o dispositivo colocará no barramento de dados em resposta ao reconhecimento de interrupção, para que o controlador de interrupção atenda.

Um barramento PCI possui apenas quatro linhas de solicitação de interrupção; portanto, nosso dispositivo serial terá que afirmar um deles. (Não importa o que no momento, geralmente depende um pouco de slot ..) O próximo na fila é o controlador de interrupção (por exemplo, PIC/APIC), que decidirá se reconhecerá a interrupção com base em bits de máscara que foram definidos em seus próprios registros. Supondo que reconheça a interrupção, ela obtém o vetor do dispositivo de interrupção (através das linhas de barramento de dados) ou, se programado, use um valor 'enlatado' fornecido pelo próprio driver de dispositivo do Apic. Até agora, a CPU não tem conhecimento de todos esses acontecimentos, mas isso está prestes a mudar.

Agora é hora do controlador de interrupção chamar a atenção do núcleo da CPU. A CPU terá sua própria máscara de interrupção que pode fazer com que apenas ignore a solicitação da foto. Supondo que a CPU esteja pronta para levar interrupções, agora é hora de a ação real iniciar. A instrução atual geralmente precisa ser aposentada antes que o ISR possa começar; portanto, com processadores de pipeline, isso é um pouco complicado, mas basta dizer que, em algum momento do fluxo de instruções, o contexto do processador é salvo na pilha e o hardware -Tetorminado ISR assume o controle.

Alguns núcleos da CPU têm várias linhas de solicitação e podem iniciar o processo de estreitamento, que o ISR é executado através da lógica de hardware que salta o ponteiro de instrução da CPU para um dos poucos manipuladores de nível superior. O velho 68k, e possivelmente outros fizeram dessa maneira. O PowerPC (e acredito, o x86) tem uma única entrada de solicitação de interrupção. O próprio X86 se comporta um pouco como uma foto e pode obter um vetor a partir do (s) PIC (s) externo (s), mas o PowerPC só salta para um endereço fixo, 0x00000500.

No PPC, o código em 0x0500 provavelmente irá imediatamente pular para algum lugar da memória onde há espaço o suficiente para algum código de tomada de decisão grave, mas ainda é a rotina de serviço de interrupção. Essa rotina irá primeiro para a foto e obterá o vetor e também pedirá à foto para parar de afirmar a solicitação de interrupção no núcleo da CPU. Depois que o vetor for conhecido, o ISR de nível superior pode argumentar a um manipulador mais específico que atenderá a todos os dispositivos conhecidos por usar esse vetor. O manipulador específico do vetor anda pela lista de dispositivos atribuídos a esse vetor, verificando bits de status de interrupção nesses dispositivos, para ver quais precisam de serviço.

Quando um dispositivo, como a porta serial hipotética, é encontrada em serviço, o ISR para esse dispositivo toma ações apropriadas, por exemplo, carregando os próximos dados do FIFO de um buffer do sistema operacional no FIFO transmitido da porta. Alguns dispositivos retiram automaticamente sua solicitação de interrupção em resposta ao acesso, por exemplo, escrever um byte no FIFO transmitido pode fazer com que o dispositivo de porta serial desserve a linha de solicitação. Outros dispositivos exigirão que um bit de registro de controle especial seja alterado, definido, limpo, o que você tem, para retirar a solicitação. Existem zilhões de dispositivos de E/S diferentes e dois deles nunca parecem fazer da mesma maneira, por isso é difícil de generalizar, mas geralmente é o caminho.

Agora, obviamente, há mais a dizer - e as prioridades de interrupção? O que acontece em um processador de vários núcleos? E os controladores de interrupção aninhados? Mas eu queimei espaço suficiente no servidor. Espero que tudo isso ajude.

Outras dicas

Eu vim sobre essa pergunta como depois de 3 anos .. Espero poder ajudar;)

O Intel 8259a ou simplesmente o "Pic" tem 8 pinos, Irq0-IRQ7, cada pino se conecta a um único dispositivo.

Vamos supor que você pressionou um botão no teclado. A tensão do pino IRQ1, que está conectada ao KBD, é alta. Então, depois que a CPU é interrompida, reconheça a interrupção BLA BLA ... A foto faz simplesmente Adicione 8 ao número da linha IRQ, então IRQ1 significa 1+8, o que significa 9

Portanto, a CPU define seu CS e IP na 9ª entrada na tabela vetorial .. e porque o IVT é uma matriz de longos, apenas multiplica o número de células por 4;)

Cpu.cs = ivt [9] .cs cpu.ip = ivt [9] .ip

A ESR lida com o dispositivo através das portas de E/S;) Desculpe pelo meu inglês ruim .. sou um árabe :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top