Alguém pode me explicar como a CPU encontra a fonte de uma interrupção na teoria do sistema operacional?

5

Atualmente estou fazendo um módulo na teoria de Sistemas Operacionais e tenho alguns conceitos que não consigo entender - seria este o lugar certo para fazer perguntas?

Minha principal questão é sobre interrupções. Quando a CPU detecta que houve uma interrupção, eu entendo que ela deve descobrir onde essa interrupção se originou. Meu entendimento é o seguinte, alguém poderia me dizer se isso está correto e explicar algumas lacunas no meu conhecimento?

Para a CPU detectar onde a interrupção foi originada, ela poderia consultar todos os objetos para identificar a origem, mas essas perguntas baseadas em E / S levariam muito tempo. Em vez disso, ele usa o ciclo de interrupção e espera um identificador de interrupção no barramento de dados. Se for um barramento de dados de 8 bits, haverá 256 níveis de interrupção (isto é, 2 ^ 8). (Por que isso acontece?)

Assim, uma Rotina de Serviço de Interrupção (ISR) é escrita para cada nível de interrupção possível e armazenada em uma tabela em um local fixo (vetor de interrupção) que é padronizado pelo processador. Nas minhas notas está escrito: "A localização deve ser conhecida antes de obter o endereço" (O que isso significa?)

O identificador de nível de interrupção recebido como parte do ciclo de interrupção é usado como um índice no vetor de interrupção (Alguém pode dividir isso um pouco, por favor?) . Meu entendimento é que um valor, o identificador de nível de interrupção, é passado para a CPU e usado para apontar para o vetor de interrupção.

Além disso, o que significa quando uma interrupção é considerada "atendida"?

Muito obrigado, e desculpe pelos parágrafos longos, estou um pouco confuso com muitos aspectos disso!

    
por user54094 04.12.2010 / 01:34

2 respostas

4

what does it mean when an interrupt is said to be "serviced"?

Quando a coisa que solicita a interrupção é resolvida, ela é chamada de "servida". Isso pode ser tão simples quanto ler o próximo caractere do teclado ou enviar o próximo pacote de dados para fora da placa ethernet. Algumas interrupções são mais importantes que outras, portanto, existe a capacidade de priorizá-las.

Um artigo útil pode ser encontrado aqui .

The interrupt level identifier received as part of the interrupt cycle is used as an index into the interrupt vector

Como você mencionou, quando uma interrupção acontece, a CPU basicamente perguntou "quem fez isso?" e o dispositivo de interrupção coloca seu identificador de interrupção no barramento de dados. A CPU pega esse número e procura na tabela do ISR para transferir a execução para o manipulador.

An interrupt is a request of the processor to suspend its current program and transfer control to a new program called the Interrupt Service Routine (ISR). Special hardware mechanisms that are designed for maximum speed force the transfer. The ISR determines the cause of the interrupt, takes the appropriate action, and then returns control to the original process that was suspended.

    
por 04.12.2010 / 01:51
2

Instead, it uses the interrupt cycle, and expects an interrupt identifier on the data bus. If it is an 8 bit data bus, there is 256 interrupt levels (i.e 2^8). (Why is this?)

A alternativa para fazer isso é ter um pino na CPU para cada tipo ou nível de IRQ que você deseja suportar. O 68000 fez isso, eles tinham 3 pinos de interrupção permitindo que você expressasse o IRQ nível 0 (NMI) até 7. Os processadores Intel só têm 1 pino IRQ e esperam que um endereço no barramento (fornecido por um dispositivo intermediário chamado PIC) forneça tipo (acho que na Intel este "endereço", na verdade um índice, vai diretamente para um registrador. Alguns PICs podem realmente dizer à CPU qual endereço ir diretamente).

Eu acredito que eles têm um pino NMI separado (e há outras interrupções com seus próprios pinos, como SMI, IPI, e um reset é um tipo de interrupção).

So an Interrupt Service Routine (ISR) is written for every possible interrupt level and stored in a table at a fixed location (interrupt vector) which is standardized by the processor.

Você não precisa escrever 256 ISRs, você pode criar um "stub" que simplesmente "retorna da interrupção", efetivamente ignorando-o.

In my notes is says "Location must be known before getting the address" (What does this mean?)

É um pouco ambíguo - não sei se isso significa que você precisa saber o endereço base da tabela de vetores ou simplesmente dizer que não pode saber o endereço do ISR se não souber o número de IRQ envolvido .

The interrupt level identifier received as part of the interrupt cycle is used as an index into the interrupt vector (Can someone break this down a little please?).

O PIC recebe um IRQ de um dispositivo. Este dispositivo está configurado para acionar o IRQ # 3. A CPU, ao receber o IRQ do PIC, vê 3 no barramento e pula para o endereço em sua tabela vetorial de IRQ local, índice 3.

Meu entendimento é que um valor, o identificador de nível de interrupção, é passado para a CPU e usado para apontar o vetor de interrupção.

Certo.

Also, what does it mean when an interrupt is said to be "serviced"?

Normalmente, você não quer que a CPU seja interrompida enquanto está entregando uma interrupção. As combinações de CPUs e CPU + PIC fazem várias coisas para desabilitar as interrupções após o recebimento de um IRQ. Então você tem que "anunciar" quando você terminar de lidar com isso. Na Intel, você precisa reativar o bit de habilitação de interrupção do sistema e informar ao PIC que você está fazendo a manutenção do IRQ. O PIC "retém" mais IRQs até que a CPU diga que está pronto.

Eu deixei de fora alguns detalhes do acima para simplificar e também porque já faz muito tempo desde que estudei qualquer um dos itens acima, mas espero que seja útil.

    
por 27.02.2014 / 13:38