O que são as interrupções é as exceções de um sistema operacional?

1.20O acesso direto à memória é usado em dispositivos de I/O de alta velocidade paraimpedir o aumento da carga de execução da CPU.a)Como a CPU interage com o dispositivo para coordenar a transferência?Os sistemas operacionais têm um driver de dispositivo para cada controlador dedispositivos. Esse driver entende o controlador de dispositivos e fornece uma interfaceuniforme entre o dispositivo e o resto do sistema operacional.b)Como a CPU sabe quando as operações da memória foram concluídas?É gerada uma interrupção por bloco para informar ao driver que a operação foiconcluída.c)A CPU pode executar outros programas enquanto o controlador de DMA estátransferindo dados. Esse processo interfere na execução dos programas de usuário?Caso interfira, descreva que tipos de interferência são gerados.Não interfere. Enquanto o controlador do dispositivo está executando essas operações,a CPU está disponível para cumprir outras tarefas.1.21Alguns sistemas de computação não fornecem uma modalidade de operaçãoprivilegiada de hardware. É possível construir um sistema operacional seguro para essessistemas de computação? Dê argumentos para defender e para refutar essa possibilidadeOs dois modos de operação (modo usuário e supervisor) fornecem os meios para aproteção do Sistema Operacional contra usuários leigos, logo fornece proteção dessescontra eles mesmos. Sem as duas modalidades o Sistema Operacional não teria nenhumtipo de segurança.1.22Muitos sistemas SMP têm diferentes níveis de caches; um nível é local para cadanúcleo de processamento, e outro nível é compartilhado entre todos os núcleos deprocessamento. Por que os sistemas de cache são projetados dessa forma?Os sistemas de cache são projetados dessa forma para diminuir problemas de coerênciasde cache. Melhora a comunicação entre unidades, possibilita otimizar a carga de trabalho,movendo as tarefas entre processadores.1.23Considere um sistema SMP semelhante ao mostrado na Figura 1.6. Ilustre com umexemplo como os dados que residem na memória poderiam ter um valor diferente emcada um dos caches locais.Em uma estrutura de armazenamento hierárquica, os mesmos dados podem aparecer emdiferentes níveis do sistema de armazenamento. Por exemplo, suponha que um inteiro Aque tenha que ser incrementado de 1 seja localizado na memória. Essa operação é seguidapela cópia de A em uma cache para realizar a atualização, porém antes de escrever namemória o novo valor, esse inteiro foi utilizado como valor desatualizado por outra cachelocal. Com isso aconteceria um problema.

Interrupções e exceções sendo entendidas na prática.

Uma interrupção é um sinal enviado para o processador solicitando a atenção dele para a execução de outro código. Ele para o que está executando agora, executa este determinado código da interrupção e depois volta a executar o código que estava executando antes. Esse sinal é geralmente enviado por um hardware externo para a CPU, cujo o mesmo é chamado de IRQ — Interrupt Request — que significa "pedido de interrupção".

Enquanto a interrupção de software é executada de maneira muito semelhante a uma chamada de procedimento por farcall. Ela é basicamente uma interrupção que é executada pelo software rodando na CPU, daí o nome.

No caso de interrupções de softwares sendo disparadas em um processo executando sob um sistema operacional, o código executado da interrupção é definido pelo próprio sistema operacional e está fora da memória do processo. Portanto há uma troca de contexto onde a tarefa momentaneamente fica suspensa enquanto a interrupção não finaliza.

Interrupt Descriptor Table

O código que é executado quando uma interrupção é disparada se chama handler e o endereço do mesmo é definido na IDTInterrupt Descriptor Table. Essa tabela nada mais é que uma sequência de valores indicando o offset e segmento do código à ser executado. É uma array onde cada elemento contém essas duas informações. Poderíamos representar em C da seguinte forma:

Ou seja o número que identifica a interrupção nada mais é que o índice a ser lido no vetor.

Provavelmente você já ouviu falar em exception. A exception nada mais é que uma interrupção e tem o seu handler definido na IDT. Por exemplo quando você comete o erro clássico de tentar acessar uma região de memória inválida ou sem permissões adequadas em C, você compila o código e recebe a clássica mensagem segmentation fault.

Nesse caso a exceção que foi disparada pelo processador se chama General Protection e pode ser referida pelo mnemônico #GP, seu índice na tabela é 13.

Intel Developer's Manuals - volume 1, capítulo 6

Essa exceção é disparada quando há um problema na referência de memória ou qualquer proteção à memória que foi violada. Como por exemplo ao tentar escrever em um segmento de memória que não tem permissão para escrita.

Um sistema operacional configura uma exceção da mesma forma que configura uma interrupção, modificando a IDT para apontar para o código que ele quer que execute. Nesse caso o índice 13 precisaria ser modificado.

No Linux basicamente o que o sistema faz é criar um handler que trata a exceção e manda um sinal para o processo. Esse sinal o processo pode configurar como ele quer tratar, mas por padrão o processo escreve uma mensagem no terminal e finaliza.

A instrução int imm8 é usada para disparar interrupções de software/exceções. Bastando simplesmente passar o índice da interrupção como operando.

Vamos ver na prática a configuração de uma interrupção em 16-bit. Para isso vamos usar o MS-DOS para que fique mais simples.

A IDT está localizada no endereço 0 em real mode, por isso podemos configurar para acessar o segmento zero e assim o offset seria o índice de cada elemento da IDT. O que precisamos fazer é acessar o índice que queremos modificar na IDT, depois é só jogar o offset e segmento do procedimento que queremos que seja executado. Em 16-bit isso acontece de uma maneira muito mais simples do que em protected mode, por isso é ideal para entender na prática.

setint 0x66, cs, int_putchar

Para compilar e testar usando o Dosbox:

$ nasm int.asm -o int.com

A interrupção simplesmente escreve os caracteres na parte superior esquerda da tela.

Note que a interrupção retorna usando a instrução iret ao invés de ret. Em 16-bit a única diferença nessa instrução é que ela também desempilha o registrador de flags, que é empilhado pelo processador ao disparar a interrupção/exceção.

Perceba que é unicamente um código de exemplo. Essa não é uma maneira segura de se configurar uma interrupção tendo em vista que seu handler está na memória do .com que, após finalizar sua execução, poderá ser sobrescrita por outro programa executado posteriormente.

Mais um exemplo mas dessa vez configurando a exceção #BP de índice 3. Se você já usou um depurador, ou pelo menos tem uma noção à respeito, sabe que "breakpoint" é um ponto no código onde o depurador faz uma parada e te permite analisar o programa enquanto ele fica em pausa.

Os depuradores modificam a instrução original colocando a instrução que dispara a exceção de breakpoint. Depois tratam o sinal enviado para o processo, restauram a instrução original e continuam seu trabalho.

O breakpoint nada mais é que uma exceção que é disparada por uma instrução. Podemos usar int 0x03 (CD 03 em código de máquina) para fazer isso porém essa instrução tem 2 bytes de tamanho e não é muito apropriada para um depurador usar. Por isso existe a instrução int3 que dispara #BP explicitamente e tem somente 1 byte de tamanho (opcode0xCC).

Repare que a cada disparo de int3 executou o código do nosso procedimento break. Esse por sua vez imprimiu o caractere 'X' na tela do Dosbox usando a interrupção 0x10 que será explicada no próximo tópico.

Só para deixar mais claro o que falei sobre os sinais que são enviados para o processo quando uma exception é disparada, aqui um código em C de exemplo:

void segfault(int signum)

fputs("Tá pegando fogo bixo!\n",stderr);

// Esse código também funciona no Windows.

structsigaction action ={

sigaction(SIGSEGV, &action, NULL);

strcpy(desastre, "Eita!");

O que é uma interrupção no sistema operacional?

Quando ocorre uma interrupção, a CPU interrompe o processamento do programa em execução e executa um pedaço de código (tipicamente parte do sistema operacional) chamado de tratador de interrupção. Em muitos casos, após a execução do tratador, a CPU volta a executar o programa interrompido.

O que são interrupções e quais são seus tipos?

Se implementado como parte do controlador de memória, as interrupções são mapeadas para dentro do sistema de espaço de endereço de memória. Interrupções podem ser categorizadas em: maskable interrupt, non-maskable interrupt (NMI), inter-processor interrupt (IPI), software interrupt, e spurios interrupt.

O que são e para que servem as interrupções de sistema?

É um mecanismo usado para sinalizar à CPU a ocorrência de eventos importantes relacionados aos dispositivos periféricos e outros elementos do sistema. Na ocorrência da interrupção é requerido que a CPU pare momentaneamente o que está fazendo para atendê-la.

O que são interrupções em dispositivos microprocessados?

Interrupção é um evento que obriga o microprocessador a suspender suas atividades temporariamente, para atender exclusivamente uma rotina indicada pelo evento que o interrompeu. Interrupção pode ser considerada um desvio de um ponto do software para outro preestabelecido.