Endereços de IRQ, DMA e I/O

Vamos entender os endereços de IRQ, DMA e I/O

Os endereços de IRQ são interrupções de hardware, canais que os dispositivos podem utilizar para chamar a atenção do processador.

Na maioria das situações, o sistema operacional simplesmente chaveia entre os aplicativos ativos, permitindo que ele utilize o processador durante um determinado espaço de tempo e passe a bola para o seguinte. Como o processador trabalha a uma frequência de clock muito alta, o chaveamento é feito de forma muito rápida, dando a impressão de que todos realmente estão sendo executados ao mesmo tempo

No caso dos processadores dual-core, temos na realidade dois processadores, de forma que dois threads podem ser processados simultaneamente, mas o princípio continua o mesmo, já que em um PC típico temos um número sempre muito maior de aplicativos ativos.

Muitas operações, entretanto, não podem esperar. O exemplo mais típico são os caracteres digitados no teclado e os movimentos do mouse, que precisam ser interpretados rapidamente pelo sistema, mesmo enquanto o PC está executando tarefas pesadas, mas existem muitas outras operações que precisam de atenção semelhante, incluindo as transferências de dados recebidos através da placa de rede, operações de leitura e escrita nos HDs e assim por diante.

A placa de rede, por exemplo não pode ficar simplesmente esperando que cheque a sua vez dentro do sistema multitarefa, pois isso retardaria a transmissão dos pacotes, aumentando o ping e reduzindo a taxa de transmissão da rede.

É neste ponto que entram os endereços de IRQ. Ao ser avisado através de qualquer um destes canais, o processador imediatamente pára qualquer coisa que esteja fazendo e dá atenção ao dispositivo, voltando ao trabalho logo depois. Cada endereço é uma espécie de campainha, que pode ser tocada a qualquer momento. Se não fossem pelos endereços de IRQ, o processador não seria capaz de ler as teclas digitadas no teclado, nem os clicks do mouse, a sua conexão pararia toda vez que abrisse qualquer programa e assim por diante.

Em PCs antigos, os endereços de IRQ não podiam ser compartilhados entre os dispositivos, o que freqüentemente causava problemas, já que existem apenas 16 endereços de IRQ disponíveis. Sempre que os endereços de IRQ se esgotavam (pela instalação de muitos periféricos) ou dois dispositivos eram configurados para utilizar o mesmo endereço, tínhamos os famosos conflitos, que faziam com ambos os dispositivos deixassem de funcionar corretamente.

Atualmente, os conflitos relacionados aos endereços de IRQ são muito raros, pois as placas atuais suportam diversos sistemas de compartilhamento e atribuição automática de endereços. No caso das placas PCI, por exemplo, o controlador PCI passa a centralizar as requisições enviadas por todas as placas instaladas, de forma que todas possam utilizar um único endereço. Isto é possível por que as placas passam a enviar as requisições para o controlador e apenas ele entra em contrato direto com o processador.

De qualquer forma, é importante entender como o sistema funciona, de forma que você possa solucionar conflitos que eventualmente apareçam, além de aprender a se virar ao dar manutenção em PCs antigos.

Para variar, tudo começa com o PC original, aquele lançado em 1981. Ele tinha apenas 8 endereços de IRQ, numerados de 0 a 7. Isso acontecia por que ele ainda era baseado no processador 8088, que apesar de ser internamente um processador de 16 bits, utilizava um barramento de apenas 8 bits para comunicar-se com os periféricos. Com isto, tinha apenas 8 IRQs.

Os 8 endereços disponíveis ficavam geralmente configurados da seguinte forma:

IRQ 0 – Sinal de clock da placa mãe

IRQ 1 – Teclado

IRQ 2 – Livre

IRQ 3 – COM 2

IRQ 4 – COM 1

IRQ 5 – Disco Rígido

IRQ 6 – Drive de disquetes

IRQ 7 – Porta paralela

O número do endereço de IRQ indica também a sua prioridade, começando do 0 que é o que tem a prioridade mais alta. Não é à toa que o IRQ 0 é ocupado pelo sinal de clock da placa mãe, pois é ele quem sincroniza o trabalho de todos os componentes, inclusive do processador.

Logo depois vem o teclado, que ocupa o IRQ 1. Veja que o teclado é o dispositivo com um nível de prioridade mais alto, para evitar que as teclas digitadas se percam. Isso pode parecer desnecessário, já que um processador atual processa bilhões de operações por segundo e dificilmente alguém digita mais do que 300 ou talvez 400 teclas por minuto, mas, na época do XT, as coisas não eram assim tão rápidas.

Em seguida vêm os demais periféricos, como as portas seriais e o drive de disquetes. A IRQ2 ficava livre para a instalação de um periférico qualquer. Na verdade, na maioria das vezes o 5 também ficava livre, pois os HDs não eram algo muito comum naquela época.

A partir do 286, houve uma evolução neste esquema, pois finalmente os PCs passaram a ter 16 endereços de IRQ, numerados de 0 a 15, como nos dias de hoje. Como quase todas as evoluções na família PC, foi preciso manter compatibilidade com o padrão anterior, para que as placas para XT pudessem funcionar nos PCs 286 em diante.

Assim, resolveram manter o controlador de IRQs original para que tudo continuasse funcionando da mesma maneira que antes e simplesmente adicionar um segundo controlador para obter os 8 novos endereços. Este segundo controlador passou a ser ligado no IRQ 2, que costumava ficar livre. Todos os pedidos de interrupção dos periféricos ligados aos endereços entre 8 e 15, controlados pelo segundo controlador, passam primeiro pelo IRQ 2, para só depois chegar ao processador. Isto é chamado de cascateamento de IRQs.

Dá para notar duas coisas neste esquema. Em primeiro lugar que o IRQ 2 não pode mais ser utilizado por nenhum periférico. Caso fosse instalado um modem ISA, por exemplo, configurado através dos jumpers para utilizar o IRQ 2, ele seria remapeado para o IRQ 9. Ou seja, na prática, não temos 16 endereços de IRQ, mas apenas 15.

Em segundo lugar, como o segundo controlador está ligado ao IRQ 2, todas as placas que utilizarem os endereços de 8 a 15, terão prioridade sobre as que usarem os IRQs de 3 a 7, pois, do ponto de vista do processador, estão ligadas ao IRQ 2, que é por onde todos os pedidos chegam a ele:

Esquema básico IRQ

Este seria um exemplo de configuração comum de endereços em um PC da era Pentium baseado em uma placa mãe soquete 7:

IRQ 0 – Sinal de clock da placa mãe (fixo)

IRQ 1 – Teclado (fixo)

IRQ 2 – Cascateador de IRQs (fixo)

IRQ 3 – Porta serial 2

IRQ 4 – Porta serial 1

IRQ 5 – Livre

IRQ 6 – Drive de disquetes

IRQ 7 – Porta paralela (impressora)

IRQ 8 – Relógio do CMOS (fixo)

IRQ 9 – Placa de vídeo

IRQ 10 – Livre

IRQ 11 – Controlador USB

IRQ 12 – Porta PS/2

IRQ 13 – Coprocessador aritmético (fixo)

IRQ 14 – IDE Primária

IRQ 15 – IDE Secundária

Veja que com apenas a placa de vídeo e os dispositivos da placa mãe, já sobravam apenas dois endereços de IRQ disponíveis. Ao adicionar uma placa de som e um modem, todos os endereços estariam ocupados, não dando mais margem de expansão para uma placa de rede ou uma placa SCSI por exemplo. A solução seria desabilitar dispositivos que não estivessem sendo usados, como por exemplo, a segunda porta serial, a porta PS/2, o controlador USB, etc. Mas, de qualquer forma, logo chegaria o ponto em que não haveria mais nada a ser desabilitado.

Este problema começou a tornar-se cada vez mais evidente, à medida que mais e mais periféricos começaram a tornar-se padrão. Os únicos periféricos “de fábrica” em um 286 eram o monitor e o teclado, todo o restante era opcional. Em um PC atual temos um número muito maior de dispositivos, a começar pelos componentes onboard.

Felizmente, pensaram neste problema quando desenvolveram o barramento PCI, incluindo o recurso de PCI Steering, que permite que dois, ou mais periféricos PCI compartilhem o mesmo endereço de IRQ. Neste caso, o controlador PCI passa a atuar como uma ponte entre os periféricos e o processador. Ele recebe todos os pedidos de interrupção, os encaminha para o processador e, ao receber as respostas, novamente os encaminha para os dispositivos corretos. Como o controlador é o único diretamente conectado ao processador é possível ocupar apenas um endereço de IRQ. Do lado do software, o PCI Steering passou a ser suportado a partir do Windows 95 OSR/2, além de ser suportado, por parte do Kernel, praticamente desde as primeiras versões do Linux.

Nem todos os dispositivos PCI suportam trabalhar desta maneira, mas a grande maioria funciona sem problemas. No Windows, você pode verificar a distribuição dos endereços dentro do Painel de Controle > Sistema > Hardware > Gerenciador de Dispositivos. Na janela principal, clique no Exibir > Recursos por tipo.

No screenshot abaixo, temos um PC antigo, rodando o Windows 2000, onde as duas placas de rede e a placa de som compartilhando o IRQ 9:

Compartilhamento de IRQ em Win 2000

Além do barramento PCI, outros barramentos usados atualmente permitem compartilhar um único IRQ entre vários periféricos. O USB é um bom exemplo, o controlador ocupa um único IRQ, que é compartilhado entre todas as portas USB e todos os dispositivos conectados a elas. Mesmo que a sua placa mãe tenha 6 portas USB e você utilize todas, terá ocupado apenas um endereço.

Caso você utilizasse apenas periféricos USB, incluindo o mouse, impressora, scanner, etc. poderia desabilitar todas as portas de legado da sua placa mãe: as duas portas seriais, a porta paralela e a porta PS/2, o que liberaria 4 endereços de IRQ.

No caso de placas mãe com duas interfaces IDE, cada uma ocupa dois endereços (por padrão o 14 e o 15). Mas, caso você não pretenda usar a IDE secundária, sempre existe a possibilidade de desabilitá-la no Setup. Todas estas opções aparecem na sessão “Integrated Peripherals”.

Com todas estas facilidades, ficava fácil ter um sistema com vários IRQs livres, como no exemplo abaixo:

IRQ 0 – Sinal de clock da placa mãe (fixo)

IRQ 1 – Teclado (fixo)

IRQ 2 – Cascateador de IRQs (fixo)

IRQ 3 – Livre (serial 2 desativada)

IRQ 4 – Modem

IRQ 5 – Livre

IRQ 6 – Drive de disquetes

IRQ 7 – Livre (porta paralela desativada)

IRQ 8 – Relógio do CMOS (fixo)

IRQ 9 – Placa de som, placa de rede (1), placa de rede (2)

IRQ 10 – Placa de vídeo

IRQ 11 – Controlador USB (Mouse, impressora e scanner)

IRQ 12 – Porta PS/2

IRQ 13 – Coprocessador aritmético

IRQ 14 – IDE Primária

IRQ 15 – Livre (IDE Secundária desativada)

Todos estes dispositivos e ainda 4 endereços de IRQ livres não soam nada mal. Na verdade, a escassez de endereços de IRQ é um problema muito menor hoje em dia do que já foi no passado. Antigamente era preciso configurar manualmente o endereço a ser usado por cada placa e não havia como compartilhar um IRQ entre dois periféricos como temos hoje. Um jumper no lugar errado era o suficiente para o modem ou a placa de som entrarem em conflito com alguém e pararem de funcionar.

Hoje em dia, todas as placas novas são PCI, o que naturalmente significa que são plug and play. Basta espeta-las para que o BIOS atribua automaticamente um endereço. Usando apenas placas PCI, você terá conflitos apenas caso realmente todos os IRQs estejam ocupados.

Mas nem tudo está resolvido. Apesar dos conflitos ao se usar apenas placas PCI sejam raríssimos, ainda estão em uso muitos PCs antigos com placas ISA. É aí que as coisas podem complicar um pouco.

Existem dois tipos de placas ISA: as ISA Plug-and-Play e as placas de legado (Legacy ISA). As primeiras, que começaram a aparecer ainda na época do 486, tem seus endereços configurados automaticamente pelo BIOS, mas não são capazes de compartilhar IRQs como as placas PCI.

O sistema de plug-and-play utilizado nelas funciona de forma limitada, de forma que elas ainda podem entrar em conflito com periféricos PCI, mesmo que existam alguns endereços livres. Neste caso, você pode alterar manualmente o endereço a ser usado pela placa ISA através do gerenciador de dispositivos do Windows, basta clicar sobre o ícone do dispositivo, acessar as propriedades e abrir a guia de recursos.

Já nas placas Legacy ISA, é preciso configurar os endereços de IRQ manualmente, através de jumpers, ou então usando um software que acompanha a placa (o que é muito comum em placas de rede ISA). Uma vez configurada para usar um endereço, a placa irá entrar em conflito com qualquer dispositivo que tente usá-lo. Para complicar, o BIOS não enxerga as placas de legado, de forma que existe a possibilidade de que ele atribua o mesmo endereço para algum dispositivo plug-and-play, gerando um conflito.

Para evitar este problema, é preciso reservar manualmente os endereços de IRQ e DMA ocupados por periféricos ISA de legado através da sessão “PNP/PCI Setup” do CMOS Setup. É o tipo de coisa com a qual você não precisa se preocupar em um PC atual (que não possuem sequer slots ISA), mas que era uma necessidade a duas gerações atrás.

Caso o PC tivesse instalado um modem ISA, configurado para utilizar o IRQ 7, por exemplo, você precisava marcá-lo com a opção “Legacy ISA” no Setup. Na foto abaixo temos a sessão “PnP/PCI” do Setup de uma placa mãe com BIOS Award. Veja que cada endereço de IRQ pode ser configurado separadamente:

Atribuição de IRQ separadamente

A opção default é não reservar os endereços, deixando-os livres para o uso de qualquer dispositivo PnP. Para reservar um endereço, basta alterar a opção. Lembre-se de reservar apenas os endereços necessários, pois ao reservar um endereço ele deixa de estar disponível para as placas plug-and-play.

Existe mais um ponto interessante sobre as placas ISA, que é o fato de existirem tanto placas ISA de 8 bits, quanto placas de 16 bits. É fácil diferenciá-las, pois as placas de 8 bits utilizam apenas a primeira parte do encaixe. As placas de 8 bits utilizam exatamente o mesmo barramento que era usado no XT, o que significa que estas placas enxergam apenas os IRQs de 0 a 7. Este é o caso por exemplo de muitos modems ISA.

Neste caso não existe muito segredo, caso todos os seus IRQs de 0 a 7 já estejam ocupados, o jeito será mudar o endereço de um dos dispositivos, dando lugar ao modem. Você pode simplesmente reservar no Setup o endereço que esteja sendo usado por uma placa plug-and-play que esteja instalada, assim da próxima vez que iniciar o micro, o BIOS se encarrega de dar outro endereço para ela, deixando o modem em paz.

Toda a configuração de endereços feita perlo BIOS é armazenado numa área do CMOS, chamado ESCD. Em casos onde o BIOS não detecte um dispositivo recém-instalado ou onde ele insista em assinar o mesmo endereço para duas placas que não suportam o PCI Steering, causando um conflito, existe a opção de limpar o ESCD. Isto fará com que o BIOS precise reconfigurar o endereços de todas as placas, partindo do zero. Para limpar o ESCD, basta acessar o Setup e ativar a opção “Force Update ESCD” ou “Reset Configuration data”.

APIC, DMA e I/O

APIC

A partir das placas soquete 7, os dois controladores de interrupções foram substituídos por um controlador aprimorado, batizado de APIC (Advanced Programmable Interrupt Controller). O APIC preserva a compatibilidade com os dois controladores antigos, o que permite que placas de legado e sistemas operacionais antigos continuem funcionando normalmente. Originalmente, ele foi desenvolvido para melhorar a eficiência de sistemas com dois ou mais processadores, mas ele traz benefícios mesmo em máquinas com apenas um.

Para que o APIC possa ser ativado, é necessário que exista suporte por parte do processador (todos os processadores a Partir do Pentium 1 o suportam), por parte da placa mãe (o suporte foi introduzido a partir das placas soquete 7, de forma que todas as placas atuais o suportam) e também por parte do sistema operacional. Na família Windows, o suporte foi introduzido a partir do Windows 2000, enquanto no Linux ele existe desde a série 2.4 do Kernel.

O APIC pode ser desativado através da opção “APIC Function” (ou similar) do Setup, mas é importante mantê-lo ativado em qualquer PC atual (sobretudo ao usar as versões atuais do Windows), pois ele acrescenta 8 novos endereços de IRQ, de 16 ao 23, além de melhorar sensivelmente o sistema de atribuição automática de endereços.

Em teoria, é possível desenvolver controladores APIC com mais endereços, ou mesmo combinar vários controladores na mesma placa, de forma a aumentar o número de endereços disponíveis. Com isto, os fabricantes ganham margem para expansões futuras, que eventualmente se tornem necessárias.

Aqui temos um screenshot do gerenciador de dispositivos, mostrando a distribuição dos endereços em um PC atual, com o Windows XP SP2 instalado:

IRQ automatico no Win XP

Veja que além de distribuir os dispositivos instalados entre os agora 24 endereços disponíveis, o sistema permite que alguns endereços sejam compartilhados por vários dispositivos. Graças à expansão no número de endereços, o PC continua com vários endereços livres, apesar da adição das controladoras USB, placa wireless, leitor de cartões e outros dispositivos que não eram comumente usados em PCs antigos.

Embora qualquer distribuição Linux atual ofereça suporta ao APIC, é comum que problemas na implementação dos fabricantes (que frequentemente possuem bugs ou adicionam recursos fora da especificação) cause problema na detecção de alguns dispositivos, sobretudo de periféricos onboard, como a placa de som ou placa de rede.

Nestes casos, é possível desativar o APIC utilizando a opção “noapic”, especificada na tela de boot, ou adicionada na linha com opções para o Kernel dentro do arquivo “/boot/grub/menu.lst” ou “/etc/lilo.conf”.

DMA e I/O

Além dos endereços de IRQ, temos também os canais de DMA e os endereços de I/O.

Os canais de DMA são utilizados apenas por dispositivos de legado (placas ISA, portas paralelas e drives de disquete) para transferir dados diretamente para a memória RAM, reduzindo desta forma a utilização do processador.

Existem 8 canais de DMA, numerados de 0 a 7. Os canais de 0 a 3 são herança do PC original e trabalham a 8 bits, assim como o barramento externo no processador 8080. Os canais de 4 a 7 foram introduzidos com o 286 e, acompanhando o barramento de dados do processador, são canais de 16 bits. Os canais de DMA são relacionados ao barramento ISA e, justamente por isso, nunca foram introduzidos canais de 32 bits. Ao invés disso, o barramento PCI (seguido pelos demais barramentos modernos), trouxe o Bus Mastering, um sistema muito mais eficiente e rápido.

Tipicamente, o canal DMA 2 era reservado para a controladora do drive de disquetes, o 3 para a porta paralela (quando configurada para operar em modo ECP), enquanto uma placa de som ISA utilizava os endereços 1 e 5.

Justamente por serem muito lentos, os canais de DMA caíram em desuso desde a década de 1990 e continuaram sendo utilizados apenas por periféricos de legado, como drives de disquete, placas de som ISA e portas paralelas padrão ECP. Conforme estes periféricos foram caindo em desuso, os canais de DMA simplesmente deixaram de ser usados, embora permaneçam disponíveis mesmo nos PCs atuais.

Finalmente, temos os endereços de I/O (também chamados “endereços de ES”, por causa da tradução do Windows). Diferentemente dos endereços de IRQ, eles não são interrupções, mas sim endereços utilizados para a comunicação entre os dispositivos. Cada dispositivo precisa de um endereço próprio mas, ao contrário dos endereços de IRQ, existe uma abundância de endereços de I/O disponíveis, de forma que eles raramente são um problema.

No total, existem 65.536 endereços de I/O e, na maioria dos casos, cada dispositivo utiliza apenas um, de forma que 99% dos endereços permanecem disponíveis.

Temos aqui um exemplo da distribuição dos endereços DMA e de I/O em um PC atual. Como ele não possui nenhum dispositivo ISA, nem possui uma porta paralela ou a porta para o drive de disquetes, o único canal de DMA em uso é o canal 4, utilizado pela própria controladora. Já no caso dos endereços de I/O, temos uma longa lista, incluindo praticamente todos os periféricos, além de uma grande quantidade de controladores incluídos na placa mãe:

endereços de I/O

Anúncios