Arquitectura de Computadores II 9 de Janeiro de 2009 Apresentação PCI - Interrupções 32223 – Paulo Pires 16807 – José Serrano Arquitectura de Computadores II Sumário • Interrupção noção geral • Tipos de interrupções, noção geral • Ciclo de interrupção por hardware • O barramento PCI, noção geral • Gestor de interrupções • Prioridades nas interrupções • MSI - 252 • Tabela de vectores • Exemplo de um ciclo de interrupção Interrupção noção geral • Uma interrupção é equivalente a uma chamada a um procedimento. A chamada é equivalente a um CALL gerado pela execução de uma instrução. • As interrupções são casos especiais das chamadas a procedimentos. • Em ambos os casos o procedimento que é executado designa-se “rotina de serviço à interrupção” ou “interrupt handler”. • O retorno do procedimento ou rotina de serviço à interrupção é feito com a instrução IRET. Tipos de interrupções, noção geral As interrupções podem estar associadas a 3 tipos de eventos: 1. Interrupções internas 1. interrupção 0 à interrupção 4 NMI Excepções 2. Interrupções externas 1. Interrupções externas ou de hardware: desencadeadas por periféricos ou coprocessadores ligadas ao sinal NMI ou INTR: NMI, reservado para “catástrofes” (falha de energia, erro de memória) INTR, CPU procura o vector 3. Interrupções de software 1. São meras instruções assembly ao CPU - INT n 2. Geram um apontador para uma posição da tabela de vectores de interrupção tal como uma interrupção de hardware. Exemplo: IRQ0 - salta para a posição 08h da tabela de vectores de interrupção INT 8 - “emula” o IRQ0, saltando para a mesma posição da tabela Ciclo de interrupção por hardware O pino INTR é utilizado para desencadear, através de um sinal externo, um dos 256 tipos de interrupção (geralmente entre 20H - 0FFH). Se a entrada NMI estiver activa, ocorre uma interrupção do tipo 2. O sinal INTA é, também, um pino de interrupção, no entanto, é utilizado como saída para responder ao pedido efectuado em INTR de modo a ser colocado, pelo periférico, o número do tipo de vector de interrupção no barramento de dados D7 - D0. O barramento PCI, noção geral • Criado pela INTEL em 1992 • Independente do processador • Versão 2.0 : 33 MHz, 32 bits por ciclo (tx transf. 132MB/s) • Versão 2.1 : 66 MHz, 64 bits por ciclo (tx transf. 528MB/s) • Funciona a 5 V ou 3,3 V • Slot de 120 pinos, para placas de 32 bits, ou 184 pinos (120+64) para placas de 64 bits • Recurso ao BUS MASTERING • Compatibilidade com o recurso PnP • Utilizados por diversos tipos de periféricos (placas de rede, som, video, modem e adaptadores USB O barramento PCI, noção geral – cont. Gestor de interrupções • Se colocarmos o NMI a detectar as interrupções originadas por falhas de energia, apenas sobra o pino INTR para receber todas as outras interrupções (teclado, impressora, rato, etc.). • De modo a evitar este problema recorre-se à utilização de um controlador de prioridades de interrupções (PIC) o 8259A. Quando o 8259A recebe um sinal de interrupção num dos seus pinos de IR#, envia para o pino INTR do processador um sinal de interrupção. Caso a flag IF seja igual a 1, o processador responde à interrupção: 1 - efectua um ciclo de reconhecimento de interrupção no pino INTA e prepara o bus de dados para receber informação; Gestor de interrupções – cont. 2 - efectua um segundo ciclo para informar o 8259A que pode enviar a informação sobre o tipo de interrupção. Este valor é colocado nas 8 linhas menos significativas do barramento de dados; 3 - efectua o procedimento normal de resposta a uma interrupção. A vantagem da utilização do PIC é a possibilidade de converter várias linhas de pedido de interrupção para uma só, sem lógica adicional. Gestor de interrupções – cont. MSI • Os fabricantes podem usar um pino do dispositivo para sinalizar uma interrupção, ou em alternativa implementar o MSI e usá-lo para sinalizar uma interrupção, o que tornaria desnecessária a utilização do pino. • Mas a especificação recomenda que qualquer dispositivo que implemente o MSI também sinalize no pino as interrupções, isto porque existem sistemas que não suportam o MSI. • Implementação : • No “startup” o software de configuração faz uma verificação do bus PCI e faz uma detecção dos dispositivos • Quando é detectado um dispositivo PCI, o software de configuração verifica se possui alguma das compatibilidades descritas numa lista • Verifica se nessa compatibilidades está presente a compatibilidade com MSI (ID – 05h) MSI – cont. • o software atribui um endereço de memória ao dispositivo para registo dos pedidos de interrupção • Verifica a múltiplas mensagens de interrupção possíveis do dispositivo para determinar quantos eventos ficaram adjacentes a esse registo • o software disponibiliza ao dispositivo um numero de mensagens igual ou menor às solicitadas pelo dispositivo mas no mínimo uma. • escreve a mensagem base no registo de mensagens do dispositivo • finalmente coloca o bit MSI “enable” no registo de controlo de mensagens do dispositivo, ficando este assim habilitado a gerar interrupções utilizando o MSI. MSI – cont. Resumindo Quando um dispositivo PCI suporta MSI e está activo, ele gera um pedido de interrupção ao processador escrevendo uma mensagem pré-definida num endereço de memória pré-definido O Processador possui uma rotina de varrimento desses endereços atribuídos para registo das mensagens de interrupção e quando elas surgem, ele identifica qual o dispositivo que solicitou a interrupção Prioridades nas interrupções • O que acontece se ocorrerem duas interrupções simultaneamente? Nesse caso será atendida a interrupção de mais alta prioridade. Supondo que o pino INTR se encontra activo e que recebe um sinal de interrupção durante uma operação de divisão que resulta numa divisão por zero. Como a interrupção gerada internamente (interrupção tipo 0) tem maior prioridade que a interrupção gerada pelo pino INTR, será a interrupção interna atendida. Prioridades nas interrupções, (cont …) O que acontece se ocorrerem dois pedidos simultâneos de interrupção nas linhas IR#. Se o PIC estiver a operar no modo de prioridades fixas, a prioridade mais elevada dos pedidos de interrupção é ordenada de IR0 para IR7. Tabela de vectores • As interrupções possíveis numa CPU são normalmente pré-definidas numa TABELA DE VECTORES DE INTERRUPÇÃO. • Um VECTOR DE INTERRUPÇÃO é um inteiro de 4 bytes. A tabela de vectores de interrupção está armazenada nos primeiros 1K de memória (endereços de 0 a 3FFh). • Existem 256 vectores diferentes de interrupção. • Cada vector contem o endereço do procedimento de serviço à interrupção (valores para IP e CS). Primeiros 2 bytes têm o IP e os 2 últimos bytes o CS. Tabela de vectores (Cont …) • Os primeiros 32 VECTORES DE INTERRUPÇÃO são RESERVADOS e utilizados presentemente pelo fabricante Intel e pelo sistemas operativos. • Os restantes vectores de 32-255 estão disponíveis para o utilizador. • Alguns vectores reservados são para condições de excepção que ocorrem na execução das instruções: divisão por zero, overflow, ... Exemplo de um ciclo de interrupção PIC 8259A Exemplo de um ciclo de interrupção Quando o 8259A recebe um sinal de interrupção num dos seus pinos de IR#, envia para o pino INTR do processador um sinal de interrupção. Caso a flag IF seja igual a 1, o processador responde à interrupção: 1. efectua um ciclo de reconhecimento de interrupção no pino INTA e prepara o bus de dados para receber informação; 2. efectua um segundo ciclo para informar o 8259A que pode enviar o informação sobre o tipo de interrupção. Este valor é colocado nas 8 linhas menos significativas do barramento de dados; 3. efectua o procedimento normal de resposta a uma interrupção. Exemplo de um ciclo de interrupção Processador x86. Interrupção externa termina o processamento da instrução atual salva na pilha o registo com as flags iguala a zero as flags IF e TF salva na pilha os reg. CS e IP (endereço de retorno) obtém os novos valores de CS e IP a partir da tabela de vetores de interrupção: CS:IP←mem(0000:vetor*4) desvia para rotina de tratamento de interrupção retorno através da instrução IRET