Interromper
Sistemas operacionais |
---|
Características comuns |
Em computadores digitais , uma interrupção (às vezes chamada de trap ) [1] é uma solicitação para o processador interromper o código em execução no momento (quando permitido), para que o evento possa ser processado em tempo hábil. Se a solicitação for aceita, o processador suspenderá suas atividades atuais, salvará seu estado e executará uma função chamada manipulador de interrupção (ou rotina de serviço de interrupção , ISR) para lidar com o evento. Essa interrupção geralmente é temporária, permitindo que o software retome [a]atividades normais após o término do manipulador de interrupção, embora a interrupção possa indicar um erro fatal. [2]
As interrupções são comumente usadas por dispositivos de hardware para indicar mudanças de estado eletrônico ou físico que requerem atenção sensível ao tempo. As interrupções também são comumente usadas para implementar a multitarefa do computador , especialmente na computação em tempo real . Sistemas que usam interrupções dessa maneira são chamados de acionados por interrupção. [3]
Tipos
Sinais de interrupção podem ser emitidos em resposta a eventos de hardware ou software . Elas são classificadas como interrupções de hardware ou interrupções de software , respectivamente. Para qualquer processador em particular, o número de tipos de interrupção é limitado pela arquitetura.
Interrupções de hardware
Uma interrupção de hardware é uma condição relacionada ao estado do hardware que pode ser sinalizada por um dispositivo de hardware externo, por exemplo, uma linha de solicitação de interrupção (IRQ) em um PC, ou detectada por dispositivos embutidos na lógica do processador (por exemplo, o temporizador da CPU no IBM System/370), para comunicar que o dispositivo precisa de atenção do sistema operacional (SO) [4] ou, se não houver SO, do programa "bare-metal" em execução na CPU. Esses dispositivos externos podem fazer parte do computador (por exemplo, controlador de disco ) ou podem ser periféricos externos . Por exemplo, pressionar uma tecla do teclado ou mover um mouse conectado a um PS/2A porta aciona interrupções de hardware que fazem com que o processador leia o pressionamento de tecla ou a posição do mouse.
As interrupções de hardware podem chegar de forma assíncrona em relação ao clock do processador e a qualquer momento durante a execução da instrução. Conseqüentemente, todos os sinais de interrupção de hardware de entrada são condicionados ao sincronizá-los com o clock do processador e atuam somente nos limites de execução da instrução.
Em muitos sistemas, cada dispositivo está associado a um sinal IRQ específico. Isso possibilita determinar rapidamente qual dispositivo de hardware está solicitando serviço e agilizar a manutenção desse dispositivo.
Em alguns sistemas mais antigos, como o CDC 3600 de 1964 , [5] todas as interrupções iam para o mesmo local, e o sistema operacional usava uma instrução especializada para determinar a interrupção desmascarada pendente de maior prioridade. Em sistemas contemporâneos, geralmente há uma rotina de interrupção distinta para cada tipo de interrupção (ou para cada fonte de interrupção), geralmente implementada como uma ou mais tabelas de vetores de interrupção .
Mascaramento
Mascarar uma interrupção é desativá -la, enquanto desmascarar uma interrupção é habilitá-la. [6]
Processadores normalmente têm um registro de máscara de interrupção interno , [b] que permite habilitação seletiva [2] (e desabilitação) de interrupções de hardware. Cada sinal de interrupção está associado a um bit no registrador de máscara. Em alguns sistemas, a interrupção é habilitada quando o bit é definido e desabilitado quando o bit está limpo. Em outros, o inverso é verdadeiro e um bit definido desabilita a interrupção. Quando a interrupção é desabilitada, o sinal de interrupção associado pode ser ignorado pelo processador ou pode permanecer pendente. Os sinais que são afetados pela máscara são chamados de interrupções mascaráveis .
Alguns sinais de interrupção não são afetados pela máscara de interrupção e, portanto, não podem ser desabilitados; elas são chamadas de interrupções não mascaráveis (NMIs). Eles indicam eventos de alta prioridade que não podem ser ignorados em nenhuma circunstância, como o sinal de tempo limite de um temporizador de watchdog .
Interrupções espúrias
Uma interrupção espúria é uma interrupção de hardware para a qual nenhuma fonte pode ser encontrada. O termo "interrupção fantasma" ou "interrupção fantasma" também pode ser usado para descrever esse fenômeno. Interrupções espúrias tendem a ser um problema com um circuito de interrupção com fio ou conectado a uma entrada de processador sensível ao nível. Essas interrupções podem ser difíceis de identificar quando um sistema se comporta mal.
Em um circuito OR com fio, a carga/descarga de capacitância parasita através do resistor de polarização da linha de interrupção causará um pequeno atraso antes que o processador reconheça que a fonte de interrupção foi apagada. Se o dispositivo de interrupção for limpo muito tarde na rotina de serviço de interrupção (ISR), não haverá tempo suficiente para o circuito de interrupção retornar ao estado quiescente antes que a instância atual do ISR termine. O resultado é que o processador pensará que outra interrupção está pendente, uma vez que a tensão em sua entrada de solicitação de interrupção não será alta ou baixa o suficiente para estabelecer uma lógica interna 1 ou lógica 0 inequívoca. espúrio" apelido.
Uma interrupção espúria também pode ser o resultado de anomalias elétricas devido ao projeto de circuito defeituoso, altos níveis de ruído , diafonia , problemas de temporização ou, mais raramente, errata do dispositivo . [7]
Uma interrupção espúria pode resultar em deadlock do sistema ou outra operação indefinida se o ISR não levar em conta a possibilidade de tal interrupção ocorrer. Como interrupções espúrias são principalmente um problema com circuitos de interrupção OR com fio, a boa prática de programação em tais sistemas é que o ISR verifique todas as fontes de interrupção quanto à atividade e não tome nenhuma ação (além de possivelmente registrar o evento) se nenhuma das fontes estiver interrompendo .
Interrupções de software
Uma interrupção de software é solicitada pelo próprio processador ao executar instruções específicas ou quando certas condições são atendidas. Cada sinal de interrupção de software está associado a um manipulador de interrupção específico.
Uma interrupção de software pode ser intencionalmente causada pela execução de uma instrução especial que, por design, invoca uma interrupção quando executada. Essas instruções funcionam de maneira semelhante às chamadas de subrotinas e são usadas para diversos fins, como solicitar serviços do sistema operacional e interagir com drivers de dispositivo (por exemplo, para ler ou gravar mídia de armazenamento). As interrupções de software também podem ser acionadas por erros de execução do programa ou pelo sistema de memória virtual .
Normalmente, o kernel do sistema operacional captura e trata essas interrupções. Algumas interrupções são tratadas de forma transparente para o programa - por exemplo, a resolução normal de uma falha de página é tornar a página necessária acessível na memória física. Mas em outros casos, como uma falha de segmentação, o sistema operacional executa um retorno de chamada de processo. Em sistemas operacionais do tipo Unix , isso envolve o envio de um sinal como SIGSEGV , SIGBUS , SIGILL ou SIGFPE , que pode chamar um manipulador de sinal ou executar uma ação padrão (encerrando o programa). No Windows, o retorno de chamada é feito usandoManipulação de exceção estruturada com um código de exceção como STATUS_ACCESS_VIOLATION ou STATUS_INTEGER_DIVIDE_BY_ZERO. [8]
Em um processo do kernel , geralmente acontece que alguns tipos de interrupções de software não devem acontecer. Se eles ocorrerem mesmo assim, poderá ocorrer uma falha no sistema operacional .
Terminologia
Os termos interrupt , trap , exception , fault e abort são usados para distinguir tipos de interrupções, embora "não haja um consenso claro quanto ao significado exato desses termos". [9] O termo trap pode referir-se a qualquer interrupção, a qualquer interrupção de software, a qualquer interrupção de software síncrona ou apenas a interrupções causadas por instruções com trap em seus nomes. Em alguns usos, o termo trap refere-se especificamente a um ponto de interrupção destinado a iniciar uma troca de contexto para um programa monitor ou depurador .[1] Também pode se referir a uma interrupção síncrona causada por uma condição excepcional (por exemplo, divisão por zero , acesso inválido à memória , opcode ilegal ), [9] embora o termo exceção seja mais comum para isso.
O x86 divide as interrupções em interrupções (de hardware) e exceções de software e identifica três tipos de exceções: falhas, traps e aborts. [10] [11] As interrupções (Hardware) são interrupções acionadas de forma assíncrona por um dispositivo de E/S e permitem que o programa seja reiniciado sem perda de continuidade. [10] Uma falha também pode ser reinicializada, mas está vinculada à execução síncrona de uma instrução - o endereço de retorno aponta para a instrução com falha. Um trap é semelhante a uma falha, exceto que o endereço de retorno aponta para a instrução a ser executada após a instrução de trap; [12] um uso proeminente é implementar chamadas de sistema . [11]Um aborto é usado para erros graves, como erros de hardware e valores ilegais nas tabelas do sistema, e muitas vezes [c] não permite a reinicialização do programa. [12]
ARM usa o termo exceção para se referir a todos os tipos de interrupções, [13] e divide as exceções em interrupções (de hardware) , aborts , reset e instruções geradoras de exceção. Os abortos correspondem a exceções x86 e podem ser abortos de pré-busca (buscas de instruções com falha) ou abortos de dados (acessos a dados com falha) e podem ser síncronos ou assíncronos. Os abortos assíncronos podem ser precisos ou imprecisos. Os abortos da MMU (falhas de página) são síncronos. [14]
Métodos de disparo
Cada entrada de sinal de interrupção é projetada para ser acionada por um nível de sinal lógico ou por uma borda de sinal específica (transição de nível). As entradas sensíveis ao nível solicitam continuamente o serviço do processador, desde que um nível lógico específico (alto ou baixo) seja aplicado à entrada. As entradas sensíveis às bordas reagem às bordas do sinal: uma borda particular (de subida ou descida) fará com que uma solicitação de serviço seja travada; o processador redefine a trava quando o manipulador de interrupção é executado.
Acionado por nível
Uma interrupção disparada por nível é solicitada mantendo o sinal de interrupção em seu nível lógico ativo particular (alto ou baixo) . Um dispositivo invoca uma interrupção acionada por nível direcionando o sinal e mantendo-o no nível ativo. Ele nega o sinal quando o processador ordena que ele faça isso, normalmente após a manutenção do dispositivo.
O processador amostra o sinal de entrada de interrupção durante cada ciclo de instrução. O processador reconhecerá a solicitação de interrupção se o sinal for afirmado quando ocorrer a amostragem.
As entradas acionadas por nível permitem que vários dispositivos compartilhem um sinal de interrupção comum por meio de conexões OR com fio. O processador pesquisa para determinar quais dispositivos estão solicitando serviço. Depois de fazer a manutenção de um dispositivo, o processador pode pesquisar novamente e, se necessário, fazer a manutenção de outros dispositivos antes de sair do ISR.
Acionado por borda
Uma interrupção disparada por borda é uma interrupção sinalizada por uma transição de nível na linha de interrupção, seja uma borda descendente (alta para baixa) ou uma borda ascendente (baixa para alta). Um dispositivo que deseja sinalizar uma interrupção aciona um pulso na linha e então libera a linha para seu estado inativo. Se o pulso for muito curto para ser detectado pelo polled I/Oentão pode ser necessário um hardware especial para detectá-lo. A parte importante do disparo de borda é que se (digamos) a interrupção foi disparada por uma transição de borda alta para baixa, se o nível permanecesse baixo, não dispararia outra interrupção. Ele deve retornar ao nível alto antes de cair novamente para acionar uma nova interrupção. Isso contrasta com um trigger de nível onde o nível baixo continuaria a criar interrupções (se estiverem habilitadas) até que o sinal retorne ao seu nível alto.
Computadores com interrupções acionadas por borda podem incluir um registro de interrupção que retém o status de interrupções pendentes. Sistemas com registradores de interrupção geralmente também possuem registradores de máscara de interrupção.
Resposta do processador
O processador amostra os sinais de disparo de interrupção ou registro de interrupção durante cada ciclo de instrução e processará a interrupção habilitada de maior prioridade encontrada. Independentemente do método de disparo, o processador iniciará o processamento de interrupção no próximo limite de instrução após um disparo detectado, garantindo assim:
- O status do processador [d] é salvo de maneira conhecida. Normalmente, o status é armazenado em um local conhecido, mas em alguns sistemas é armazenado em uma pilha.
- Todas as instruções anteriores àquela apontada pelo PC foram totalmente executadas.
- Nenhuma instrução além daquela apontada pelo PC foi executada, ou tais instruções são desfeitas antes de tratar a interrupção.
- O estado de execução da instrução apontada pelo PC é conhecido.
Implementação do sistema
As interrupções podem ser implementadas em hardware como um componente distinto com linhas de controle , ou podem ser integradas ao subsistema de memória .
Se implementado em hardware como um componente distinto, um circuito controlador de interrupção, como o Programmable Interrupt Controller (PIC) do IBM PC, pode ser conectado entre o dispositivo de interrupção e o pino de interrupção do processador para multiplexar várias fontes de interrupção em uma ou duas linhas de CPU normalmente acessível. Se implementado como parte do controlador de memória , as interrupções são mapeadas no espaço de endereço de memória do sistema .
Vários dispositivos podem compartilhar uma linha de interrupção acionada por borda se forem projetados para isso. A linha de interrupção deve ter um resistor pull-down ou pull-up para que, quando não acionado ativamente, se estabeleça em seu estado inativo, que é o estado padrão dela. Os dispositivos sinalizam uma interrupção conduzindo brevemente a linha para seu estado não padrão e deixam a linha flutuar (não a aciona ativamente) quando não sinaliza uma interrupção. Esse tipo de conexão também é chamado de coletor aberto . A linha então transporta todos os pulsos gerados por todos os dispositivos. (Isto é análogo ao cordão de puxarem alguns ônibus e bondes que qualquer passageiro pode puxar para sinalizar ao motorista que está solicitando uma parada.) No entanto, pulsos de interrupção de diferentes dispositivos podem se fundir se ocorrerem perto do horário. Para evitar a perda de interrupções, a CPU deve disparar na borda de fuga do pulso (por exemplo, na borda de subida se a linha for puxada para cima e baixada). Após detectar uma interrupção, a CPU deve verificar todos os dispositivos quanto aos requisitos de serviço.
As interrupções acionadas por borda não sofrem os problemas que as interrupções acionadas por nível têm com o compartilhamento. O serviço de um dispositivo de baixa prioridade pode ser adiado arbitrariamente, enquanto as interrupções de dispositivos de alta prioridade continuam a ser recebidas e atendidas. Se houver um dispositivo que a CPU não saiba atender, o que pode gerar interrupções espúrias, ele não interferirá na sinalização de interrupção de outros dispositivos. No entanto, é fácil perder uma interrupção acionada por borda - por exemplo, quando as interrupções são mascaradas por um período - e, a menos que haja algum tipo de trava de hardware que registre o evento, é impossível recuperar. Esse problema causou muitos "travamentos" no hardware do computador inicial porque o processador não sabia que era esperado que fizesse alguma coisa. Hardwares mais modernos geralmente têm um ou mais registradores de status de interrupção que travam solicitações de interrupção; um código de manipulação de interrupção orientado por borda bem escrito pode verificar esses registros para garantir que nenhum evento seja perdido.
O antigo barramento Industry Standard Architecture (ISA) usa interrupções acionadas por borda, sem exigir que os dispositivos possam compartilhar linhas IRQ, mas todas as placas-mãe ISA convencionais incluem resistores pull-up em suas linhas IRQ, portanto, dispositivos ISA bem comportados compartilhando linhas IRQ deve apenas funcionar bem. A porta paralela também usa interrupções acionadas por borda. Muitos dispositivos mais antigos assumem que têm uso exclusivo de linhas IRQ, tornando eletricamente inseguro compartilhá-las.
Existem 3 maneiras pelas quais vários dispositivos "compartilhando a mesma linha" podem ser criados. A primeira é por condução exclusiva (comutação) ou conexão exclusiva (para pinos). A seguir é por barramento (todos conectados à mesma linha escutando): os cartões em um barramento devem saber quando devem falar e não falar (ou seja, o barramento ISA). A fala pode ser acionada de duas maneiras: por trava de acumulação ou por portas lógicas. As portas lógicas esperam um fluxo de dados contínuo que é monitorado para os principais sinais. Os acumuladores são acionados apenas quando o lado remoto excita o portão além de um limite, portanto, nenhuma velocidade negociada é necessária. Cada um tem suas vantagens de velocidade versus distância. Um trigger, geralmente, é o método no qual a excitação é detectada: borda ascendente, borda descendente, limiar ( osciloscópio pode disparar uma ampla variedade de formas e condições).
O acionamento de interrupções de software deve ser incorporado ao software (tanto no sistema operacional quanto no aplicativo). Um aplicativo 'C' tem uma tabela de gatilhos (uma tabela de funções) em seu cabeçalho, que tanto o aplicativo quanto o sistema operacional conhecem e usam adequadamente, não relacionadas ao hardware. No entanto, não confunda isso com interrupções de hardware que sinalizam a CPU (a CPU executa o software a partir de uma tabela de funções, semelhante às interrupções de software).
Dificuldade em compartilhar linhas de interrupção
Vários dispositivos que compartilham uma linha de interrupção (de qualquer estilo de disparo) agem como fontes de interrupção espúrias em relação uns aos outros. Com muitos dispositivos em uma linha, a carga de trabalho nas interrupções de atendimento cresce proporcionalmente ao quadrado do número de dispositivos. Portanto, é preferível distribuir os dispositivos uniformemente pelas linhas de interrupção disponíveis. A falta de linhas de interrupção é um problema em projetos de sistema mais antigos, onde as linhas de interrupção são condutores físicos distintos. As interrupções sinalizadas por mensagem, onde a linha de interrupção é virtual, são favorecidas em novas arquiteturas de sistema (como PCI Express ) e aliviam consideravelmente esse problema.
Alguns dispositivos com uma interface de programação mal projetada não fornecem nenhuma maneira de determinar se eles solicitaram o serviço. Eles podem travar ou se comportar mal se forem atendidos quando não quiserem. Esses dispositivos não podem tolerar interrupções espúrias e, portanto, também não podem tolerar o compartilhamento de uma linha de interrupção. Os cartões ISA , devido ao design e construção geralmente baratos, são notórios por esse problema. Esses dispositivos estão se tornando muito mais raros, à medida que a lógica do hardware se torna mais barata e as novas arquiteturas de sistema exigem interrupções compartilháveis.
Híbrido
Alguns sistemas usam um híbrido de sinalização acionada por nível e acionada por borda. O hardware não apenas procura uma borda, mas também verifica se o sinal de interrupção permanece ativo por um determinado período de tempo.
Um uso comum de uma interrupção híbrida é para a entrada NMI (interrupção não mascarável). Como os NMIs geralmente sinalizam eventos importantes – ou mesmo catastróficos – do sistema, uma boa implementação desse sinal tenta garantir que a interrupção seja válida verificando se ela permanece ativa por um período de tempo. Essa abordagem em duas etapas ajuda a eliminar interrupções falsas que afetam o sistema.
Mensagem sinalizada
Uma interrupção sinalizada por mensagem não usa uma linha de interrupção física. Em vez disso, um dispositivo sinaliza sua solicitação de serviço enviando uma mensagem curta por algum meio de comunicação, normalmente um barramento de computador . A mensagem pode ser de um tipo reservado para interrupções ou pode ser de algum tipo pré-existente, como uma gravação de memória.
As interrupções sinalizadas por mensagem se comportam de maneira muito semelhante às interrupções acionadas por borda, pois a interrupção é um sinal momentâneo em vez de uma condição contínua. O software de tratamento de interrupções trata os dois da mesma maneira. Normalmente, várias interrupções sinalizadas por mensagem pendentes com a mesma mensagem (a mesma linha de interrupção virtual) têm permissão para mesclar, assim como interrupções acionadas por borda espaçadas podem se mesclar.
Os vetores de interrupção sinalizados por mensagem podem ser compartilhados, na medida em que o meio de comunicação subjacente possa ser compartilhado. Nenhum esforço adicional é necessário.
Como a identidade da interrupção é indicada por um padrão de bits de dados, não exigindo um condutor físico separado, muitas outras interrupções distintas podem ser tratadas com eficiência. Isso reduz a necessidade de compartilhamento. As mensagens de interrupção também podem ser passadas por um barramento serial, não exigindo nenhuma linha adicional.
PCI Express , um barramento de computador serial, usa exclusivamente interrupções sinalizadas por mensagem .
Campainha
Em uma analogia de botão de pressão aplicada a sistemas de computador , o termo campainha ou interrupção de campainha é frequentemente usado para descrever um mecanismo pelo qual um sistema de software pode sinalizar ou notificar um hardware de computador.dispositivo que há algum trabalho a ser feito. Normalmente, o sistema de software colocará dados em alguns locais de memória conhecidos e mutuamente acordados e "tocará a campainha" escrevendo em um local de memória diferente. Esse local de memória diferente é frequentemente chamado de região da campainha, e pode até haver várias campainhas servindo a propósitos diferentes nessa região. É esse ato de escrever na região da memória da campainha que "toca a campainha" e notifica o dispositivo de hardware de que os dados estão prontos e aguardando. O dispositivo de hardware agora saberia que os dados são válidos e podem ser acionados. Normalmente, gravaria os dados em uma unidade de disco rígido , ou os enviaria por uma rede , ou os criptografaria , etc.
O termo interrupção da campainha é geralmente um equívoco . É semelhante a uma interrupção, pois faz com que algum trabalho seja feito pelo dispositivo; no entanto, a região da campainha às vezes é implementada como uma região de pesquisa , às vezes a região da campainha grava em registradores de dispositivos físicos e, às vezes, a região de campainha é conectada diretamente a registradores de dispositivos físicos. Ao escrever através ou diretamente nos registradores do dispositivo físico, isso pode causar uma interrupção real na unidade de processador central do dispositivo ( CPU ), se houver.
As interrupções da campainha podem ser comparadas às interrupções sinalizadas por mensagem , pois têm algumas semelhanças.
IPI multiprocessador
Em sistemas multiprocessadores , um processador pode enviar uma solicitação de interrupção para outro processador por meio de interrupções entre processadores [e] (IPI).
Performance
As interrupções fornecem baixa sobrecarga e boa latência em baixa carga, mas degradam significativamente em alta taxa de interrupção, a menos que se tome cuidado para evitar várias patologias. O fenômeno em que o desempenho geral do sistema é severamente prejudicado por quantidades excessivas de tempo de processamento gasto no tratamento de interrupções é chamado de tempestade de interrupções .
Existem várias formas de livelocks , quando o sistema gasta todo o seu tempo processando interrupções com exclusão de outras tarefas necessárias. Sob condições extremas, um grande número de interrupções (como tráfego de rede muito alto) pode parar completamente o sistema. Para evitar tais problemas, um sistema operacional deve agendar o tratamento de interrupção de rede com o mesmo cuidado com que agenda a execução do processo. [15]
Com processadores multinúcleo, melhorias de desempenho adicionais no tratamento de interrupções podem ser alcançadas por meio de dimensionamento do lado do recebimento (RSS) quando NICs de várias filas são usados. Tais NICs fornecem várias filas de recebimento associadas a interrupções separadas; roteando cada uma dessas interrupções para diferentes núcleos, o processamento das solicitações de interrupção acionadas pelo tráfego de rede recebido por uma única NIC pode ser distribuído entre vários núcleos. A distribuição das interrupções entre os núcleos pode ser realizada automaticamente pelo sistema operacional, ou o roteamento das interrupções (geralmente chamado de afinidade de IRQ ) pode ser configurado manualmente. [16] [17]
Uma implementação puramente baseada em software da distribuição de tráfego de recebimento, conhecida como direção de pacote de recebimento (RPS), distribui o tráfego recebido entre os núcleos posteriormente no caminho de dados, como parte da funcionalidade do manipulador de interrupção . As vantagens do RPS sobre o RSS não incluem requisitos de hardware específico, filtros de distribuição de tráfego mais avançados e taxa reduzida de interrupções produzidas por uma NIC. Como desvantagem, o RPS aumenta a taxa de interrupções entre processadores (IPIs). O direcionamento de fluxo de recebimento (RFS) leva a abordagem baseada em software ainda mais, contabilizando a localidade do aplicativo; outras melhorias de desempenho são alcançadas processando solicitações de interrupção pelos mesmos núcleos nos quais determinados pacotes de rede serão consumidos pelo aplicativo de destino. [16] [18] [19]
Usos típicos
As interrupções são comumente usadas para atender temporizadores de hardware, transferir dados de e para armazenamento (por exemplo, E/S de disco) e interfaces de comunicação (por exemplo, UART , Ethernet ), manipular eventos de teclado e mouse e responder a quaisquer outros eventos sensíveis ao tempo conforme exigido pelo sistema de aplicação. As interrupções não mascaráveis são normalmente usadas para responder a solicitações de alta prioridade, como timeouts de watchdog, sinais de desligamento e traps .
Os temporizadores de hardware são frequentemente usados para gerar interrupções periódicas. Em alguns aplicativos, essas interrupções são contadas pelo manipulador de interrupção para acompanhar o tempo absoluto ou decorrido, ou usadas pelo agendador de tarefas do SO para gerenciar a execução de processos em execução ou ambos. As interrupções periódicas também são comumente usadas para invocar a amostragem de dispositivos de entrada, como conversores analógico-digitais , interfaces de codificador incremental e entradas GPIO , e para programar dispositivos de saída, como conversores analógico-digitais , controladores de motor e saídas GPIO.
Uma interrupção de disco sinaliza a conclusão de uma transferência de dados de ou para o periférico de disco; isso pode causar a execução de um processo que está aguardando para ler ou gravar. Uma interrupção de desligamento prevê perda iminente de energia, permitindo que o computador execute um desligamento ordenado enquanto ainda há energia suficiente para fazê-lo. As interrupções do teclado normalmente fazem com que as teclas sejam armazenadas em buffer para implementar o typeahead .
Às vezes, as interrupções são usadas para emular instruções que não são implementadas em alguns computadores de uma família de produtos. [20] Por exemplo , instruções de ponto flutuante podem ser implementadas em hardware em alguns sistemas e emuladas em sistemas de baixo custo. No último caso, a execução de uma instrução de ponto flutuante não implementada causará uma interrupção de exceção de "instrução ilegal". O manipulador de interrupção implementará a função de ponto flutuante no software e, em seguida, retornará ao programa interrompido como se a instrução implementada por hardware tivesse sido executada. [21] Isso fornece portabilidade do software aplicativo em toda a linha.
As interrupções são semelhantes aos sinais , com a diferença de que os sinais são usados para comunicação entre processos (IPC), mediados pelo kernel (possivelmente por meio de chamadas de sistema) e tratados por processos, enquanto as interrupções são mediadas pelo processador e tratadas pelo kernel . O kernel pode passar uma interrupção como um sinal para o processo que a causou (exemplos típicos são SIGSEGV , SIGBUS , SIGILL e SIGFPE ).
História
As interrupções de hardware foram introduzidas como uma otimização, eliminando o tempo de espera improdutivo em loops de polling , aguardando eventos externos. O primeiro sistema a usar essa abordagem foi o DYSEAC , concluído em 1954, embora os sistemas anteriores fornecessem funções de interceptação de erros . [22]
O computador UNIVAC 1103A é geralmente creditado com o uso mais antigo de interrupções em 1953. [23] [24] Anteriormente, no UNIVAC I (1951) "O estouro aritmético desencadeou a execução de uma rotina de correção de duas instruções no endereço 0 , ou, por opção do programador, fez com que o computador parasse." O IBM 650 (1954) incorporou a primeira ocorrência de mascaramento de interrupção. O National Bureau of Standards DYSEAC (1954) foi o primeiro a usar interrupções para E/S. O IBM 704 foi o primeiro a usar interrupções para depuração , com um "transfer trap", que poderia invocar uma rotina especial quando uma instrução de desvio fosse encontrada. O MITO sistema Lincoln Laboratory TX-2 (1957) foi o primeiro a fornecer vários níveis de interrupções de prioridade. [24]
Veja também
- Controlador de interrupção programável avançado (APIC)
- Chamada de interrupção do BIOS
- Programação orientada a eventos
- Manipulação de exceção
- INT (instrução x86)
- Interromper coalescência
- Gerenciador de interrupção
- Interromper a latência
- Interrupções em processadores 65xx
- Lista de interrupção de Ralf Brown
- Interrupções na arquitetura IBM System/360
- Sistema acionado por tempo
- Operação periférica autônoma
Notas
- ^ O sistema operacional pode retomar o processo interrompido ou alternar para um processo diferente.
- ^ O registrador de máscara pode ser um único registrador ou múltiplos registradores, por exemplo, bits no PSW e outros bits nos registradores de controle .
- ^ Alguns sistemas operacionais podem se recuperar de erros graves, por exemplo, paginação em uma página de um arquivo de paginação após um erro ECC incorrigível em uma página inalterada.
- ^ Pode ser apenas o Program Counter (PC) , um PSW ou vários registradores.
- ↑ Conhecido como taps no ombro em alguns sistemas operacionais da IBM.
Referências
- ^ a b "The Jargon File, versão 4.4.7" . 27-10-2003 . Recuperado em 20 de janeiro de 2022 .
- ^ a b Jonathan Corbet; Alessandro Rubini; Greg Kroah-Hartman (2005). " Drivers de Dispositivo Linux , Terceira Edição, Capítulo 10. Manipulação de Interrupções" (PDF) . Mídia O'Reilly . pág. 269 . Recuperado em 25 de dezembro de 2014 .
Depois, é apenas uma questão de limpar, executar interrupções de software e voltar ao trabalho normal.
O "trabalho regular" pode muito bem ter mudado como resultado de uma interrupção (o manipulador poderia
um processo, por exemplo), então a última coisa que acontece no retorno de uma interrupção é um possível reescalonamento do processador.
wake_up
- ^ Rosenthal, Scott (maio de 1995). "Noções básicas de interrupções" . Arquivado a partir do original em 26/04/2016 . Recuperado em 2010-11-11 .
- ^ "Interrupções de hardware" . Recuperado 2014-02-09 .
- ^ "Instruções de interrupção". Control Data 3600 Computer System Reference Manual (PDF) . Control Data Corporation. Julho de 1964. pp. 4–6. 60021300.
- ^ Bai, Ying (2017). Engenharia de Microcontroladores com MSP432: Fundamentos e Aplicações . Imprensa CRC. pág. 21. ISBN 978-1-4987-7298-3. LCCN 2016020120 .
No sistema Cortex-M4, as interrupções e exceções possuem as seguintes propriedades: ... Geralmente, um único bit em um registrador de máscara é usado para mascarar (desabilitar) ou desmascarar (habilitar) certas interrupções/exceções que ocorrem
- ^ Li, Qing; Yao, Caroline (2003). Conceitos em Tempo Real para Sistemas Embarcados . Imprensa CRC. pág. 163. ISBN 1482280825.
- ^ "Exceções de hardware" . docs.microsoft . com . 3 de agosto de 2021.
- ^ a b Hyde, Randall (1996). "Capítulo Dezessete: Interrupções, Armadilhas e Exceções (Parte 1)" . A arte da programação em linguagem assembly . Recuperado em 22 de dezembro de 2021 .
O conceito de interrupção é algo que se expandiu em escopo ao longo dos anos.
A família 80x86 só aumentou a confusão em torno das interrupções ao introduzir a instrução int (interrupção de software).
De fato, diferentes fabricantes usaram termos como exceções falhas aborta armadilhas e interrupções para descrever os fenômenos discutidos neste capítulo.
Infelizmente, não há um consenso claro quanto ao significado exato desses termos.
Diferentes autores adotam diferentes termos para seu próprio uso.
- ^ a b "Manual do desenvolvedor de software das arquiteturas Intel® 64 e IA-32 Volume 1: Arquitetura básica" . págs. 6–12 Vol. 1 . Recuperado em 22 de dezembro de 2021 .
- ^ a b Bryant, Randal E.; O'Hallaron, David R. (2016). "8.1.2 Classes de exceções". Sistemas de computador: a perspectiva de um programador (Terceira, Global ed.). Harlow. ISBN 1-292-10176-8.
- ^ a b "Manual do desenvolvedor de software das arquiteturas Intel® 64 e IA-32 volume 3A: Guia de programação do sistema, parte 1" . pág. 6-5 Vol. 3A . Recuperado em 22 de dezembro de 2021 .
- ^ "Tratamento de Exceções" . developer.arm.com . Guia do programador da série ARM Cortex-A para ARMv7-A . Recuperado em 21 de janeiro de 2022 .
- ^ "Tipos de exceção" . developer.arm.com . Guia do programador da série ARM Cortex-A para ARMv7-A . Recuperado em 22 de dezembro de 2021 .
- ^ Mogul, Jeffrey C.; Ramakrishnan, KK (1997). "Eliminando receber livelock em um kernel controlado por interrupção" . Transações ACM em Sistemas Informáticos . 15 (3): 217–252. doi : 10.1145/263326.263335 . S2CID 215749380 . Recuperado em 2010-11-11 .
- ^ a b Tom Herbert; Willem de Bruijn (9 de maio de 2014). "Documentação/rede/escalonamento.txt" . Documentação do kernel Linux . kernel.org . Recuperado em 16 de novembro de 2014 .
- ^ "Folha de dados da família de controladores Ethernet Gigabit Intel 82574" (PDF) . Intel . Junho de 2014. p. 1 . Recuperado em 16 de novembro de 2014 .
- ↑ Jonathan Corbet (17 de novembro de 2009). "Receber direcionamento de pacotes" . LWN.net . Recuperado em 16 de novembro de 2014 .
- ^ Jake Edge (7 de abril de 2010). "Receber direção de fluxo" . LWN.net . Recuperado em 16 de novembro de 2014 .
- ^ Assimoo, Shalesh; et ai. "Patente US 5632028 A" . Patentes do Google . Recuperado em 13 de agosto de 2017 .
- ^ Altera Corporation (2009). Referência do processador Nios II (PDF) . pág. 4 . Recuperado em 13 de agosto de 2017 .
- ^ Codd, Edgar F. "Multiprogramação". Avanços em Computadores . 3 : 82.
- ^ Bell, C. Gordon; Newell, Allen (1971). Estruturas informáticas: leituras e exemplos . McGraw-Hill. pág. 46. ISBN 9780070043572. Recuperado em 18 de fevereiro de 2019 .
- ^ a b Smotherman, Mark. "Interrupções" . Recuperado em 22 de dezembro de 2021 .
Links externos
- Interrupções facilitadas
- Interrupções para Microchip PIC Microcontroller
- Tabela de interrupção do IBM PC
- University of Alberta CMPUT 296 Concrete Computing Notes on Interrupts , arquivado do original em 13 de março de 2012